我如何使用"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
字段。