将上一个例子编译后的 .class 文件进行反编译后,会看到一些有趣的问题:
Compiled from "ColorEnum.java"public final class lirui.ColorEnum extends java.lang.Enum<lirui.ColorEnum> { public static final lirui.ColorEnum RED; public static final lirui.ColorEnum BLUE; public static final lirui.ColorEnum GREEN; public static lirui.ColorEnum[] values(); public static lirui.ColorEnum valueOf(java.lang.String); public java.lang.String getDescription(); public static lirui.ColorEnum next(); public java.lang.String toString(); public static void main(java.lang.String[]); static {};}编译器为类声明添加了 final,并且继承了 Enum 类,所以编写枚举类时不能在继承其他类,但是可以实现接口。编译器添加了 static final 的枚举对象,这也是我们平时可以使用 ColorEnum.RED 获取枚举实例的原因。所以枚举实现是单例的。编译器添加了 values(),valueOf() 这两个方法,而对于他的父类 Enum 也有一个valueOf(),不过两者参数不同,并不是同一个方法。将 ColorEnum 向上转型为 Enum 时,values() 方法将失效,但是可以使用 Class 上的 getEnumConstants() 获取所有 enum 实例。EnumMap 是一个特殊的 map, 他要求其中的键必须来自一个 enum。由于 enum 的数量有限,所以 Enum 内部可以使用数组实现,所以它的速度也非常快。
新闻热点
疑难解答