2020久久超碰欧美精品最新亚洲欧美日韩久久精品,国产福利电影一区二区三区,亚洲欧美日韩一区在线观看,亚洲国产欧美日韩欧美特级,亚洲欧美日韩成人一区久久,欧美日韩精品一区二区三区不卡,国产欧美日韩va另类影音先锋,亚洲欧美日韩久久精品,亚洲欧美日韩国产成人精品影院,亚洲国产欧美日韩精品一区二区三区,欧美日韩国产成人高清视频,日韩久久精品国产免费观看频道,久久人人爽人人爽从片av高清,国产精品综合一区二区

首頁常見問題正文

java中枚舉類型enum用法及其背后原理

更新時間:2023-02-15 來源:黑馬程序員 瀏覽量:

IT培訓班

Enum枚舉類型

Enum的全寫是Enumeration,這個詞的翻譯是列舉、逐條陳述、細目。在程序語言中,枚舉類型是一種特殊的數據類型(常用的數據類型比如字符串、整型),這種數據類型的變量值限定在固定的范圍, 比如季節只有春夏秋冬,月份是12個。

Java中的枚舉

枚舉前時代

在Java語言中, 枚舉類型從JDK1.5才開始提供。在這之前使用接口靜態常量來實現相關功能(也可以是類靜態常量),以季節為例:

在不使用枚舉類之前,一般使用接口靜態常量實現。比如:

public interface Season {
    public static final int SPRING = 1;
    public static final int SUMMER = 2;
    public static final int AUTUMN = 3;
    public static final int WINTER = 4;
}

使用JUnit使用測試如下:

@Test
public void noEnum() {
  int i = 1;
  Assert.assertTrue(Season.SPRING==i);
}


使用接口靜態常量的方式比較難限定變量的范圍,而且定義繁瑣,功能也很有限,于是在Java 1.5 中定義了一個枚舉類型:java.lang.Enum。

Java枚舉的定義

類似類(class)和接口(interface)的定義,Java提供enum關鍵字用來定義枚舉類,在IDEA中創建枚舉類的菜單如下:

1603951100204_枚舉0.jpg


同樣定義一個季節的枚舉類, 代碼可以簡潔如下:

package cn.osxm.jcodef.func.base;
public enum SeasonEnum {
    SPRING, SUMMER, AUTUMN, WINTER
}

在枚舉類中直接列出常量,常量遵循全部大寫的規則。在上面的枚舉類示例代碼中,SPRING, SUMMER, AUTUMN, WINTER 是SeasonEnum的成員。

枚舉成員默認是final、public、static (所以可以使用SeasonEnum.SPRING方式調用枚舉成員)

每一個枚舉類型成員都可以看作是枚舉類的實例 (SeasonEnum.SPRING的類型也是SeasonEnum)

在JUnit使用測試如下:

@Test
public void enumBase() {
    SeasonEnum season = SeasonEnum.SPRING;
    Assert.assertTrue(season.equals(SeasonEnum.SPRING));
}


Java 枚舉類的特性

Java枚舉類的特性有:

枚舉可以實現接口,但不能繼承接口,也不能被繼承。

枚舉類是final的,所以不能繼承。

枚舉類的構造方法是私有的

枚舉成員是靜態、final和public

枚舉成員是枚舉類的實例

但是從上面SeasonEnum枚舉類的定義來看,完全看不出這些特性,這些特性是怎么來的呢? 請看下面的原理探求。

Java枚舉類實現的原理探求

Java枚舉類型的奧秘就在編譯階段,枚舉類在編譯后會生成了一個擴展java.lang.Enum的類。這個可以通過JDK自帶的javap工具來反編譯生成的.class文件。對上面的生成的SeasonEnum.class文件進行反編譯,因為這個文件的包路徑是cn\osxm\jcodef\func\base,所以在命令行使用如下命令:

javap -p cn\osxm\jcodef\func\base\SeasonEnum.class


·-p參數的意思是反編譯代碼中包含私有的方法, p是private的意思。

1603951118430_枚舉1.jpg


從控制臺輸出的反編譯后的源碼可以看出:

·自定義的枚舉類會自動繼承java.lang.Enum類

·每個成員變量都會被轉換為 private static final的枚舉類型的實例

·自動添加private的構造函數 從反編譯后的源碼就不難理解Enum的特性了。

注意: 使用專門的Java反編譯工具,比如JD GUI、luyten等對Eumn進行反編譯的效果接近源碼的效果,無法看到繼承等特性,JD-GUI反編譯的效果和源碼時一致的,這也說明使用JD GUI來進行實際的反編譯還是不錯的。

分享到:
在線咨詢 我要報名
和我們在線交談!