枚举实例默认是静态的吗?
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
是的,枚举实际上是静态的。