枚举-无法从非静态上下文引用非静态方法

时间:2019-06-24 17:11:27

标签: java enums compiler-errors

错误:java:无法从静态上下文中引用非静态方法a()

我在以下代码上收到此错误。

enum ENUM
{
  A()
  {
    {
      a();
    }
  }
  ,
  ;
  private void a()
  {}
}

我希望它可以编译,但是不会。

将访问级别修饰符 private 从方法a()更改为任何其他,可以编译代码。

什么可能阻止此代码编译?

2 个答案:

答案 0 :(得分:0)

您会收到此编译错误,因为此处的 A 之类的枚举常量是隐式静态的。因此,我们可以在任何其他类中使用枚举常量,例如: ENUM.A 。 因此,我们不能从静态上下文中调用非静态方法。 Refer this documentation for more details on enums

答案 1 :(得分:0)

该错误消息具有误导性。它不限于枚举,初始化程序块或其他任何东西。问题很简单,就是匿名内部类无法从其封闭的类访问私有方法。

private指出子类不应该具有可见性,匿名内部类是子类,因此在逻辑上是合理的。

您可以在此示例中观察到相同的问题:

class Foo {
    public static void main(String[] args) {
        Foo foo = new Foo(){
            void bar() {
                a();
            }
        };
    }

    private void a(){ /* do nothing */  }
}