更新時間:2022-06-23 11:04:14 來源:動力節(jié)點(diǎn) 瀏覽1275次
Java枚舉類型有什么用?動力節(jié)點(diǎn)小編來告訴大家。
類似類(class)和接口(interface)的定義,Java提供enum關(guān)鍵字用來定義枚舉類,在IDEA中創(chuàng)建枚舉類的菜單如下:
同樣定義一個季節(jié)的枚舉類, 代碼可以簡潔如下:
package cn.osxm.jcodef.func.base; public enum SeasonEnum { SPRING, SUMMER, AUTUMN, WINTER }
在枚舉類中直接列出常量,常量遵循全部大寫的規(guī)則。在上面的枚舉類示例代碼中,SPRING, SUMMER, AUTUMN, WINTER 是SeasonEnum的成員。
枚舉成員默認(rèn)是final、public、static (所以可以使用SeasonEnum.SPRING方式調(diào)用枚舉成員)
每一個枚舉類型成員都可以看作是枚舉類的實例 (SeasonEnum.SPRING的類型也是SeasonEnum)
在JUnit使用測試如下:
@Test public void enumBase() { SeasonEnum season = SeasonEnum.SPRING; Assert.assertTrue(season.equals(SeasonEnum.SPRING)); }
Java枚舉類的特性有:
枚舉可以實現(xiàn)接口,但不能繼承接口,也不能被繼承。
枚舉類是final的,所以不能繼承。
枚舉類的構(gòu)造方法是私有的
枚舉成員是靜態(tài)、final和public
枚舉成員是枚舉類的實例
但是從上面SeasonEnum枚舉類的定義來看,完全看不出這些特性,這些特性是怎么來的呢? 請看下面的原理探求。
ava枚舉類型的奧秘就在編譯階段,枚舉類在編譯后會生成了一個擴(kuò)展java.lang.Enum的類。這個可以通過JDK自帶的javap工具來反編譯生成的.class文件。對上面的生成的SeasonEnum.class文件進(jìn)行反編譯,因為這個文件的包路徑是cnosxmjcodeffuncbase,所以在命令行使用如下命令:
javap -p cnosxmjcodeffuncbaseSeasonEnum.class
-p參數(shù)的意思是反編譯代碼中包含私有的方法, p是private的意思。
從控制臺輸出的反編譯后的源碼可以看出:
自定義的枚舉類會自動繼承java.lang.Enum類
每個成員變量都會被轉(zhuǎn)換為 private static final的枚舉類型的實例
自動添加private的構(gòu)造函數(shù) 從反編譯后的源碼就不難理解Enum的特性了。
注意: 使用專門的Java反編譯工具,比如JD GUI、luyten等對Eumn進(jìn)行反編譯的效果接近源碼的效果,無法看到繼承等特性,JD-GUI反編譯的效果和源碼時一致的,這也說明使用JD GUI來進(jìn)行實際的反編譯還是不錯的。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743