java枚舉enum和Enum類的使用
一、為什么需要枚舉?
對于某些有固定幾個對象的類,比如說星期,月份,季節(jié)等等。它們可定義的對象數(shù)量是一定的,且不可更改。傳統(tǒng)的定義類的方式顯然無法滿足需求。
二、枚舉介紹
枚舉全稱Enumeration [? ?nu?m?? re??n],簡稱Enum或者enum。枚舉是一組常量的集合。枚舉類屬于一種特殊的類,里面只包含一組有限的特定的對象。枚舉的出現(xiàn)可以解決上述的問題。
三、枚舉的實現(xiàn)方式
1.自定義枚舉 :
步驟 :
①將自定義類的構(gòu)造器私有化,使其不能被隨隨便便地new出對象。
②取消類中提供的setXxx方法,僅保留getXxx方法,因為“枚舉類”對象僅可讀,不能隨便修改對于對象的描述。
③直接在自定義類中創(chuàng)建一組對象,使用static + final的組合實現(xiàn)底層優(yōu)化。并且要對外暴露這組對象,因此要添加public修飾符來公開這組對象。
④枚舉對象名通常全部大寫,以符合常量的定義規(guī)范。
⑤枚舉對象根據(jù)需要,也可以有多個屬性。
演示 :
package knowledge.enum_;
/**
* @author : Cyan_RA9
* @version : 1.0
*/
public class Week {
private String name;
private Week(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static final Week SUNDAY = new Week("Sunday");
public static final Week MONDAY = new Week("Monday");
public static final Week TUESDAY = new Week("Tuesday");
public static final Week WEDNESDAY = new Week("Wednesday");
public static final Week THURSDAY = new Week("Thursday");
public static final Week FRIDAY = new Week("Friday");
public static final Week SATURDAY = new Week("Saturday");
@Override
public String toString() {
return "Week{" +
"name='" + name + '\'' +
'}';
}
}
class Test {
public static void main(String[] args) {
System.out.println("一周的第" + 1 + "天是" + Week.SUNDAY);
System.out.println("一周的第" + 2 + "天是" + Week.MONDAY);
System.out.println("一周的第" + 3 + "天是" + Week.TUESDAY);
System.out.println("一周的第" + 4 + "天是" + Week.WEDNESDAY);
System.out.println("一周的第" + 5 + "天是" + Week.THURSDAY);
System.out.println("一周的第" + 6 + "天是" + Week.FRIDAY);
System.out.println("一周的第" + 7 + "天是" + Week.SATURDAY);
}
}運行結(jié)果 :

2.enum關(guān)鍵字 :
步驟 :
①將自定義類的構(gòu)造器私有化,使其不能被隨隨便便地new出對象。
②取消類中提供的setXxx方法,僅保留getXxx方法,因為“枚舉類”對象僅可讀,不能隨便修改對于對象的描述。
③在定義類時,使用enum關(guān)鍵字替換掉class關(guān)鍵字。enum關(guān)鍵字用于聲明枚舉類。
④創(chuàng)建枚舉類對象時,不再和自定義枚舉一樣使用“public + static + final”關(guān)鍵字的組合形式,而是直接“常量名(形參列表)”搞定。(實際調(diào)用的仍然是構(gòu)造器)。聲明枚舉對象時,必須明確調(diào)用的是哪個構(gòu)造器。
⑤如果有多個常量對象,使用逗號','間隔即可。最后一個常量后加分號。
⑥如果使用enum來實現(xiàn)枚舉,語法規(guī)定常量必須寫在類的最前面,否則報錯。
演示 :
package knowledge.enum_.introduction;
/**
* @author : Cyan_RA9
* @version : 1.0
*/
public enum Season {
SPRING("Spring", "warm"), SUMMER("Summer", "hot"),
AUTUMN("Autumn", "cool"), WINTER("Winter", "cold");
private String name;
private String portrait;
private Season(String name, String portrait) {
this.name = name;
this.portrait = portrait;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", portrait='" + portrait + '\'' +
'}';
}
}
class Test2 {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.SUMMER);
System.out.println(Season.AUTUMN);
System.out.println(Season.WINTER);
}
}運行結(jié)果 :

四、枚舉類補充
1.如果使用了enum關(guān)鍵字來聲明枚舉類,則聲明的枚舉類默認繼承了Enum類,并且底層默認是一個final類。
2.對于“1.”的證明 :
①通過Ctrl + H/h快捷鍵快速查看繼承關(guān)系,如下圖所示 :

②通過javap命令來證明,如下圖所示 :

3.若使用無參構(gòu)造創(chuàng)建枚舉對象,則后面的形參列表和括號都可以省略。如下圖所示 :

4.IDEA中直接創(chuàng)建枚舉類的方式 :
與接口類似,也是先按照正常創(chuàng)建類的流程來走,如下圖所示 :

選擇“Java Class”之后,在彈出的小窗口中選擇Enum,然后輸入枚舉類類名,回車即可,如下圖所示 :

創(chuàng)建好枚舉類之后,可以看到枚舉類的圖標中間是一個“E”字母,如下圖所示 :

五、關(guān)于枚舉類的父類——Enum類
1.基本介紹 :

2.常用方法 :
①總覽

②演示 :
演示Ⅰ:name方法——得到當前枚舉常量的名稱。(建議優(yōu)先使用toString方法)
Season類,Test類代碼如下 :
package knowledge.enum_.introduction;
public enum Season {
SPRING("spring", "warm"), SUMMER("summer", "hot"),
AUTUMN("autumn", "cool"), WINTER("winter", "cold");
private Season() {}
private String name;
private String portrait;
private Season(String name, String portrait) {
this.name = name;
this.portrait = portrait;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", portrait='" + portrait + '\'' +
'}';
}
}
class Test2 {
public static void main(String[] args) {
//1.name
Season season = Season.SPRING;
Season season2 = Season.AUTUMN;
System.out.println("season's name = " + season.name());
System.out.println("season2's name = " + season2.name());
}
}運行結(jié)果 :

演示Ⅱ:ordinal方法——返回當前枚舉常量對應的編號/次序。(即在枚舉類中的定義順序,第一個枚舉常量默認從0開始編號)
Season類代碼不變,Test類代碼如下 :
class Test2 {
public static void main(String[] args) {
//2.ordinal
Season season = Season.SPRING;
Season season2 = Season.AUTUMN;
System.out.println("season's index = " + season.ordinal());
System.out.println("season2's index = " + season2.ordinal());
}
}
演示Ⅲ:values方法——可以返回一個當前枚舉類型的數(shù)組,里面包含了當前枚舉類中定義的所有枚舉對象。
PS : values方法 是隱藏的底層方法,可以通過javap命令反編譯找到,如下圖所示 :

Season類代碼不變,Test類代碼如下 :
class Test2 {
public static void main(String[] args) {
//3.values
Season[] seasons = Season.values();
for (Season season : seasons) {
System.out.println(season);
}
}
}運行結(jié)果 :

演示Ⅳ:valueOf方法——將指定字符串轉(zhuǎn)換為枚舉對象,但要求該指定字符串必須為已有的枚舉常量名,否則報異常。
Season類代碼不變,Test類代碼如下 :
class Test2 {
public static void main(String[] args) {
//4.valueOf
Season season_0 = Season.valueOf("SPRING");
System.out.println("season_0's name = " + season_0);
Season season_00 = Season.SPRING;
System.out.println("season_00's name = " + season_00);
System.out.println("season_0 和 season_00本質(zhì)上是同一個對象嗎?" + (season_0 == season_00));
}
}運行結(jié)果 :

演示Ⅴ:compareTo方法——比較兩個枚舉常量的編號(返回值= 前編號 - 后編號)。如果返回值是0,說明是同一個枚舉常量。
Season類代碼不變,Test類代碼如下 :
class Test2 {
public static void main(String[] args) {
//5.compareTo
Season season_0 = Season.valueOf("SPRING");
Season season_00 = Season.SPRING;
System.out.println(season_0.compareTo(season_00));
System.out.println("==============");
Season season_2 = Season.AUTUMN;
System.out.println(season_2.compareTo(season_0));
System.out.println("==============");
System.out.println(season_0.compareTo(season_2));
}
}運行結(jié)果 :

六、關(guān)于enum實現(xiàn)接口的問題
1.使用enum關(guān)鍵字聲明枚舉類之后,該枚舉類不可以再去繼承其他類。這是因為,我們之前通過javap命令反編譯枚舉類后,可以看到枚舉類在底層隱式繼承了Enum類。而Java是單繼承機制,不支持多繼承。所以在枚舉類后使用extends關(guān)鍵字,IDEA會報錯,如下圖所示 :

2.enum關(guān)鍵字聲明的枚舉類雖然不能再去繼承其他類了,但是可以去實現(xiàn)接口。
演示 :
package knowledge.enum_.port;
/**
* @author : Cyan_RA9
* @version : 2.0
*/
public enum Season implements Climate {
SPRING,SUMMER,AUTUMN,WINTER,SEASON; //別忘記這些枚舉常量底層是如何實現(xiàn)的!
@Override
public void season_circumstance() {
System.out.println(SPRING + ": warm");
System.out.println(SUMMER + ": hot");
System.out.println(AUTUMN + ": cool");
System.out.println(WINTER + ": cold");
}
public static void main(String[] args) {
Season.SEASON.season_circumstance();
}
}
interface Climate {
public abstract void season_circumstance();
}運行結(jié)果 :

到此這篇關(guān)于java枚舉enum和Enum類的使用的文章就介紹到這了,更多相關(guān)java枚舉enum和Enum類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java大批量導出Excel數(shù)據(jù)的優(yōu)化過程
幾十萬上百萬行的數(shù)據(jù)是很常見的。本文主要介紹了Java大批量導出Excel數(shù)據(jù)的優(yōu)化過程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
基于Java的度分秒坐標轉(zhuǎn)純經(jīng)緯度坐標的漂亮國基地信息管理的方法
本文以java語言為例,詳細介紹如何管理漂亮國的基地信息,為下一步全球的空間可視化打下堅實的基礎,首先介紹如何對數(shù)據(jù)進行去重處理,然后介紹在java當中如何進行度分秒位置的轉(zhuǎn)換,最后結(jié)合實現(xiàn)原型進行詳細的說明,感興趣的朋友跟隨小編一起看看吧2024-06-06
解決springboot configuration processor對maven子模塊不起作用的問題
這篇文章主要介紹了解決springboot configuration processor對maven子模塊不起作用的問題,本文通過圖文實例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
SpringBoot服務端數(shù)據(jù)校驗過程詳解
這篇文章主要介紹了SpringBoot服務端數(shù)據(jù)校驗過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-02-02
詳解Java的Struts2框架的結(jié)構(gòu)及其數(shù)據(jù)轉(zhuǎn)移方式
這篇文章主要介紹了詳解Java的Struts2框架的結(jié)構(gòu)及其數(shù)據(jù)轉(zhuǎn)移方式,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2016-01-01

