枚举实例默认是静态的吗?

enum Animals{ DOG("woof"), CAT("Meow"), FISH("Burble"); String sound; Animals(String s) { sound = s; } } public class TestEnum{ static Animals a; public static void main(String ab[]){ System.out.println( a ); System.out.println( a.DOG.sound + " " + a.FISH.sound); } } 

在上面的例子中,为什么当a为null且枚举未声明为静态时,我们能够访问枚举的实例(即作为a.DOG.sound)? 枚举实例默认是静态的吗?

枚举是隐含的public static final

您可以引用a.DOG因为您可以通过实例引用访问静态成员,即使是null:静态解析使用引用类型 ,而不是实例。

不会 ; 它具有误导性:约定优先于类型(非实例)静态引用。

有关通过实例的类变量,请参阅JLS 6.5.6.2 。 请参阅JLS 15.11,了解为什么它仍然可以使用null 。 Nutshell:它是引用类型,而不是实例,通过它可以解析静态。


更新链接:/

JSE 6

  • 关于通过表达式名称进行类变量访问的JLS 6.5.6.2
  • 关于通过空引用进行静态字段访问的JLS 15.11

JSE 7

  • 关于通过表达式名称进行类变量访问的JLS 6.5.6.2
  • 关于通过空引用进行静态字段访问的JLS 15.11

JSE 8

  • 关于通过表达式名称进行类变量访问的JLS 6.5.6.2
  • 关于通过空引用进行静态字段访问的JLS 15.11

是的,枚举实际上是静态的。