错误:无法从静态上下文引用非静态变量 super>>但我使用 static 关键字



我如何使用"super"关键字从超类(类"aa"(引用"a1">

class aa {
protected static int a1 = 2;
}
public class bb extendeds aa {
static int a1 = 3;
public static int s = super.a1;
}

类的static成员属于类,而不是特定实例。

调用super.member时,您正在尝试访问从父类继承的当前实例member。这样做是因为同一成员可能在子类中被隐藏,因此super将引用父类中的成员。

因此,在static上下文中,将使用值初始化成员的实例是模糊的。事实上,当不存在实例时,可以访问静态成员。因此,在静态上下文(方法或在本例中为字段(中使用super是不可能的,并且编译器会抛出错误。

此外,静态字段在加载类时初始化,此时不会初始化任何实例变量。因此,使用super.member初始化是没有意义的。

来自JLS:

形式超级。标识符是指名为 当前对象,但当前对象被视为 当前类的超类。

您需要修改代码以:

public class bb extendeds aa {
static int a1 = 3;
public static int s = aa.a1; //a1 belongs to class aa not to an instance
}

如果你真的想使用super而不仅仅是做aa.a1,从技术上讲,你可以在构造函数中这样做而不会出错,只会得到警告:

public static int s;
public bb(){
this.s = super.a1;
}

试运转:

aa a = new aa();
bb b = new bb();
System.out.println(a.a1);
System.out.println(b.s);

输出:

阿拉伯数字

阿拉伯数字

我真的不建议这样做,并尽量避免将static与对象一起使用,或者如果您确实需要,则只使用static,例如static字段。

最新更新