这是Java编译器错误吗?

时间:2019-06-03 08:39:50

标签: java compiler-errors

编译器给出了没有意义的编译错误。 “无法静态引用非静态字段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
      }
   }
}

2 个答案:

答案 0 :(得分:1)

否,静态方法只能引用静态字段或其他方法。通过调用super()。x,您可以从非静态上下文中引用非静态属性。

以下引文摘自Oracle website

  

非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有的也是如此。静态嵌套类无权访问该封闭类的其他成员。

内部静态类有权访问封闭类的成员(私有方法/变量)。

还可以看here

  

静态嵌套类不能直接引用实例变量或   在其封闭类中定义的方法:它只能通过以下方式使用它们   对象引用。使用封闭的类名可以访问它们。

答案 1 :(得分:0)

静态内部类在类级别而不是实例级别链接到外部类。

结果,它只能访问外部类的静态成员,在这方面与静态方法相同。

因此,这不是编译器错误,这是预期的行为。

当您使用super.x时,您将从超类的实例访问x数据成员,该实例位于正在为其运行构造函数的嵌套类的实例之下,因此它确实具有访问权限。