Java中的枚舉enum詳細(xì)解讀
一、枚舉的兩種實(shí)現(xiàn)方式
1.自定義類實(shí)現(xiàn)枚舉
2.使用enum關(guān)鍵字實(shí)現(xiàn)枚舉
二、自定義類實(shí)現(xiàn)枚舉
1.不需要提供setXxx方法,因?yàn)槊杜e對(duì)象值通常為只讀
2.對(duì)枚舉對(duì)象/屬性通常會(huì)使用final + static關(guān)鍵字共同修飾,實(shí)現(xiàn)底層優(yōu)化
3.枚舉對(duì)象名通常全部都會(huì)大寫,這是常量的命名規(guī)范
4.枚舉對(duì)象根據(jù)需求,也可以有多個(gè)屬性
自定義類實(shí)現(xiàn)枚舉小結(jié):
1.將構(gòu)造器私有化
2.本類內(nèi)部創(chuàng)建一組對(duì)象
3.對(duì)外暴露對(duì)象(通過為對(duì)象添加public final static修飾符)
4.可以提供get方法,但不能提供set方法
三、enum關(guān)鍵字實(shí)現(xiàn)枚舉
enum關(guān)鍵字實(shí)現(xiàn)枚舉注意事項(xiàng)
1.當(dāng)我們使用enum關(guān)鍵字開發(fā)一個(gè)枚舉類時(shí),默認(rèn)會(huì)繼承Enum類,而且是一個(gè)final類
2.傳統(tǒng)的public static final Season2 SPRING = new Season2("春天","溫暖");簡化成SPRING("春天","溫暖"),這里必須知道它調(diào)用的是哪個(gè)構(gòu)造器
3.如果使用無參構(gòu)造器創(chuàng)建枚舉對(duì)象,則實(shí)參列表和小括號(hào)都可以省略
4.當(dāng)有多個(gè)枚舉對(duì)象時(shí),使用逗號(hào) ,隔開,最后一個(gè)用分號(hào) ;結(jié)尾
5.枚舉對(duì)象必須放在枚舉類的行首
public class Enumeration02 { public static void main(String[] args) { System.out.println(Season2.AUTUMN); System.out.println(Season2.SUMMER); Enum } } //演示使用enum關(guān)鍵字來實(shí)現(xiàn)枚舉類 enum Season2{ //類 //定義了四個(gè)對(duì)象 // public static final Season SPRING = new Season("春天", "溫暖"); // public static final Season SUMMER = new Season("夏天", "炎熱"); // public static final Season AUTUMN = new Season("秋天", "涼爽"); // public static final Season WINNER = new Season("冬天", "寒冷"); //如果使用enum來實(shí)現(xiàn)枚舉類 //1.使用關(guān)鍵字enum替代class //2.原先public static final Season SPRING = new Season("春天", "溫暖")直接使用 // SPRING("春天", "溫暖")代替 解讀:常量名(實(shí)參列表) //3.如果有多個(gè)常量(對(duì)象),使用 , 間隔即可 //4.如果使用enum來實(shí)現(xiàn)枚舉,要求將定義的常量對(duì)象寫在最前面 SPRING("春天", "溫暖"),SUMMER("夏天", "炎熱"), AUTUMN("秋天", "涼爽"),WINNER("冬天", "寒冷"); private String name; private String desc; //描述 private Season2(String name, String desc) { this.name = name; this.desc = desc; } public String getName() { return name; } public String getDesc() { return desc; } @Override public String toString() { return "Season{" + "name='" + name + '\'' + ", desc='" + desc + '\'' + '}'; } }
四、enum常用方法
說明:使用關(guān)鍵字enum時(shí),會(huì)隱式繼承Enum類,這樣我們就可以使用Enum類相關(guān)的方法
方法名 | 詳細(xì)描述 |
toString | 得到當(dāng)前枚舉常量的名稱。子類可以通過重寫這個(gè)方法來使結(jié)果更易讀 |
name | 返回當(dāng)前對(duì)象名(常量名),子類中不能重寫 |
ordinal | 返回當(dāng)前對(duì)象的位置號(hào)(編號(hào)),默認(rèn)從0開始 |
values | 返回當(dāng)前枚舉類中所有的常量 |
valueOf | 將字符串轉(zhuǎn)換成枚舉對(duì)象,要求字符串必須為已有的常量名,否則報(bào)異常! |
compareTo | 比較兩個(gè)枚舉常量,比較的就是位置號(hào)(編號(hào)) |
hashCode | Enum實(shí)現(xiàn)了hashCode()來和equals()保持一致,它也是不可變的 |
getDeclaningClass | 得到枚舉常量所屬枚舉類型的Class對(duì)象??梢杂盟鼇砼袛鄡蓚€(gè)枚舉常量是否屬于同一個(gè)枚舉類型 |
clone | 枚舉類型不能被Clone。為了防止子類實(shí)現(xiàn)克隆方法Enum實(shí)現(xiàn)了一個(gè)僅拋出Clone Not Supported Exception異常的不變clone() |
/* 演示Enum類的各種方法的使用 */ public class EnumMethod { public static void main(String[] args) { //使用Season2枚舉類,來演示各種方法 Season2 autumn = Season2.AUTUMN; //1.輸出枚舉對(duì)象的名字 System.out.println(autumn.name()); //2.ordinal()輸出的是該枚舉對(duì)象的次序(編號(hào)),從0開始編號(hào) //AUTUMN枚舉對(duì)象是第三個(gè),因此輸出2 System.out.println(autumn.ordinal()); //3.從反編譯可以看出values方法,返回的是Season2[],該數(shù)組含有定義的所有枚舉對(duì)象 Season2[] values = Season2.values(); //遍歷取出枚舉對(duì)象 for(Season2 season: values){ //增強(qiáng)for循環(huán) System.out.println(season); } //4.valueOf:將字符串轉(zhuǎn)換成枚舉對(duì)象,要求字符串必須為已有的常量名,否則報(bào)異常 //執(zhí)行流程 //1.根據(jù)輸入的"AUTUMN"到Season2的枚舉對(duì)象去查找 //2.如果找到了就返回,如果沒有找到就報(bào)錯(cuò) Season2 autumn1 = Season2.valueOf("AUTUMN"); System.out.println("autumn1" + autumn1); System.out.println(autumn == autumn1); //5.compareTo:比較兩個(gè)枚舉常量,比較的就是編號(hào) //解讀 //1.就是把Season2.AUTUMN枚舉對(duì)象的編號(hào) 和 Season2.SUMMER枚舉對(duì)象的編號(hào)進(jìn)行比較 //2.就是Season2.AUTUMN的編號(hào) - Season2.SUMMER的編號(hào) /* public final int compareTo(E o) { return self.ordinal - other.ordinal; } */ System.out.println(Season2.AUTUMN.compareTo(Season2.SUMMER)); // //補(bǔ)充了一個(gè)增強(qiáng)for循環(huán) // int[] nums = {1, 2, 5, 9}; // //普通的for循環(huán) // System.out.println("=======普通for循環(huán)========"); // for (int i = 0; i < nums.length; i++) { // System.out.println(nums[i]); // } // System.out.println("=======增強(qiáng)for循環(huán)========"); // //增強(qiáng)for循環(huán) // //執(zhí)行流程是依次從nums數(shù)組中取出數(shù)據(jù)賦給i,如果取出完畢就退出for循環(huán) // for (int i :nums){ // System.out.println("i=" + i); // } } }
五、enum實(shí)現(xiàn)接口
1.使用enum關(guān)鍵字后,就不能再繼承其它類,因?yàn)閑num會(huì)隱式繼承Enum,而Java是單繼承機(jī)制
2.枚舉類和普通類一樣,可以實(shí)現(xiàn)接口
枚舉類實(shí)現(xiàn)接口形式如下
enum 類名 implements 接口1,接口2 { }
到此這篇關(guān)于Java中的枚舉enum詳細(xì)解讀的文章就介紹到這了,更多相關(guān)Java枚舉enum內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis-Plus實(shí)現(xiàn)公共字段自動(dòng)賦值的方法
這篇文章主要介紹了Mybatis-Plus實(shí)現(xiàn)公共字段自動(dòng)賦值的方法,涉及到通用字段自動(dòng)填充的最佳實(shí)踐總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07Servlet第一個(gè)項(xiàng)目的發(fā)布(入門)
這篇文章主要介紹了Servlet第一個(gè)項(xiàng)目的發(fā)布,下面是用servlet實(shí)現(xiàn)的一個(gè)簡單的web項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2021-04-04java編程創(chuàng)建型設(shè)計(jì)模式單例模式的七種示例
這篇文章主要為大家介紹了java編程中創(chuàng)建型設(shè)計(jì)模式之單例模式的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02Java實(shí)現(xiàn)超大Excel文件解析(XSSF,SXSSF,easyExcel)
這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)超大Excel文件解析(XSSF,SXSSF,easyExcel)以及速度的對(duì)比,感興趣的可以了解一下2022-07-07Java Iterator接口實(shí)現(xiàn)代碼解析
這篇文章主要介紹了Java Iterator接口實(shí)現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05springboot解決java.lang.ArrayStoreException異常
這篇文章介紹了springboot解決java.lang.ArrayStoreException異常的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12Spring實(shí)戰(zhàn)之抽象Bean和子Bean定義與用法示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之抽象Bean和子Bean定義與用法,結(jié)合實(shí)例形式分析了Spring抽象Bean和子Bean相關(guān)配置、定義與使用操作技巧,需要的朋友可以參考下2019-11-11