编译器给出了没有意义的编译错误。 “无法静态引用非静态字段x” 我没有做静态引用。静态内部类应有权访问封闭类的私有成员。实际上,它确实允许我访问super.x
我用Java 1.8尝试过
class Bug
{
private int x = 0;
int y;
static class BugDerived extends Bug
{
BugDerived()
{
super();
super.y = 1; // no error
y = 1; // no error
super.x = 1; // no error !
x = 1; // ERROR
}
}
}
答案 0 :(得分:1)
否,静态方法只能引用静态字段或其他方法。通过调用super()。x,您可以从非静态上下文中引用非静态属性。
以下引文摘自Oracle website。
非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有的也是如此。静态嵌套类无权访问该封闭类的其他成员。
内部静态类不有权访问封闭类的成员(私有方法/变量)。
还可以看here:
静态嵌套类不能直接引用实例变量或 在其封闭类中定义的方法:它只能通过以下方式使用它们 对象引用。使用封闭的类名可以访问它们。
答案 1 :(得分:0)
静态内部类在类级别而不是实例级别链接到外部类。
结果,它只能访问外部类的静态成员,在这方面与静态方法相同。
因此,这不是编译器错误,这是预期的行为。
当您使用super.x时,您将从超类的实例访问x数据成员,该实例位于正在为其运行构造函数的嵌套类的实例之下,因此它确实具有访问权限。