將上一個例子編譯后的 .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 內部可以使用數組實現,所以它的速度也非???。
新聞熱點
疑難解答