什麼是Enum?
- Enum(列舉)。
- 列舉是一種規範它規範了引數的形式,這樣就可以不用考慮型別的不匹配並且顯的替代了int 型引數可能帶來的模糊概念,列舉像一個類,又像一個陣列。
- 它不能有public的建構函式,這樣做可以保證客戶程式碼沒有辦法新建一個enum的例項。
- 所有列舉值都是public , static , final的。注意這一點只是針對於列舉值,我們可以和在普通類裡面定義 變數一樣定義其它任何型別的非列舉變數,這些變數可以用任何你想用的修飾符。
- Enum預設實現了 java.lang.Comparable介面。
- Enum覆載了
toString()
方法,因此我們如果呼叫ColorEnum.RED.toString()
則預設返回字串 "RED"。 - Enum提供了一個
valueOf()
方法,這個方法和toString()
方法是相對應的。呼叫valueOf("RED")
則會預設返回ColorEnum.RED
因此我們在自己重寫toString()
方法的時候就要注意到這一點,一搬來說也會相對應地重寫valueOf()
方法。 - 在比較兩個列舉型別的值時,永遠不需要呼叫equals方法,而直接使用"=="就可以了。(
equals()
方法也是直接使用 == , 兩者是一樣的效果)
Enum常見的方法
Enum是所有 Java 語言列舉型別的公共基本類(注意Enum是抽象類),以下是它的常見方法:
- compareTo(Enum e) 返回型別為 int 比較此列舉與指定物件的順序
public enum EnumDemoOne { RED, GREEND, BLANK, YELLOW } public class EnumTestOne { public static void main(String[] args){ System.out.println("比較此列舉與指定物件的順序 為正則是大於對比下標位置序多少,為負則是小於他對比下標位置多少"); System.out.println("YELLOW 對比 RED 位置順序結果為:" + EnumDemoOne.YELLOW.compareTo(enumDemoOne)); System.out.println("RED 對比 YELLOW 位置順序結果為:" + EnumDemoOne.RED.compareTo(EnumDemoOne.YELLOW)); /** * 比較此列舉與指定物件的順序 為正則是大於對比下標位置序多少,為負則是小於他對比下標位置多少 * YELLOW 對比 RED 位置順序結果為:3 * RED 對比 YELLOW 位置順序結果為:-3 */ }} 複製程式碼
- equals(Object other) 返回型別 boolean 當指定物件等於此列舉常量時,返回true。
public enum EnumDemoOne { RED, GREEND, BLANK, YELLOW } public class EnumTestOne { EnumDemoOne enumDemoOne = EnumDemoOne.RED; public static void main(String[] args){ System.out.println("當指定物件等於此列舉常量時,返回 true。"); System.out.println("RED.toString() 對等於 RED.toString() 時" + EnumDemoOne.RED.toString().equals(enumDemoOne.toString())); System.out.println("RED 對等於 RED 時" + EnumDemoOne.RED.equals(enumDemoOne)); System.out.println("YELLOW 對等於 BLANK 時" + EnumDemoOne.YELLOW.equals(EnumDemoOne.BLANK)); System.out.println("YELLOW.name() 對等於 BLANK.name() 時" + EnumDemoOne.YELLOW.name().equals(EnumDemoOne.BLANK.name())); /** * 當指定物件等於此列舉常量時,返回 true。 * RED.toString() 對等於 RED.toString() 時true * RED 對等於 RED 時true * YELLOW 對等於 BLANK 時false * YELLOW.name() 對等於 BLANK.name() 時false */ } }複製程式碼
- getDeclaringClass() 返回型別 Class<?> 返回與此列舉常量的列舉型別相對應的 Class 物件
public enum EnumDemoOne { RED, GREEND, BLANK, YELLOW } public class EnumTestOne { EnumDemoOne enumDemoOne = EnumDemoOne.RED; public static void main(String[] args){ System.out.println("返回與此列舉常量的列舉型別相對應的 Class 物件"); System.out.println("RED 的列舉常量相對應的型別是:" + EnumDemoOne.RED.getDeclaringClass()); /** * 返回與此列舉常量的列舉型別相對應的 Class 物件 * RED 的列舉常量相對應的型別是:class com.chenquan.demo.enum_demo.EnumDemoOne */ } }複製程式碼
- name() 返回型別 String 返回此列舉常量的名稱,在其列舉宣告中對其進行宣告
public enum EnumDemoOne { RED, GREEND, BLANK, YELLOW } public class EnumTestOne { EnumDemoOne enumDemoOne = EnumDemoOne.RED; public static void main(String[] args){ System.out.println("name() 返回此列舉常量的名稱,在其列舉宣告中對其進行宣告\t" + EnumDemoOne.RED.name()); /** * name() 返回此列舉常量的名稱,在其列舉宣告中對其進行宣告 RED */ } }複製程式碼
- toString() 返回型別 String 返回列舉常量的名稱,它包含在宣告中。我們在上文中提到:了Enum覆載了
toString()
方法,因此我們如果呼叫ColorEnum.RED.toString()
則預設返回字串 "RED"。 可以發現。通過檢視原始碼發現toString()
和name()
方法其實都是返回Enum常量的名字public enum EnumDemoOne { RED, GREEND, BLANK, YELLOW } public class EnumTestOne { EnumDemoOne enumDemoOne = EnumDemoOne.RED; public static void main(String[] args){ System.out.println("toString() 返回列舉常量的名稱,它包含在宣告中\t" + EnumDemoOne.RED.toString()); /** * toString() 返回列舉常量的名稱,它包含在宣告中 RED */ } }複製程式碼
- ordinal() 返回型別 int 返回列舉常量的序數(它在列舉宣告中的位置,其中初始常量序數為零) 該方法獲取的是列舉變數在列舉類中宣告的順序,下標從0開始 在宣告列舉的時候下標就會自己產生。
public enum EnumDemoOne { RED, GREEND, BLANK, YELLOW } public class EnumTestOne { EnumDemoOne enumDemoOne = EnumDemoOne.RED; public static void main(String[] args){ System.out.println("ordinal() 得到列舉型別建立的順序\t" + EnumDemoOne.RED.ordinal()); System.out.println("ordinal() 得到列舉型別建立的順序\t" + EnumDemoOne.GREEND.ordinal()); /** * ordinal() 得到列舉型別建立的順序 0 * ordinal() 得到列舉型別建立的順序 1 */ } }複製程式碼
- static valueOf(Class<T> enumType, String name) 靜態方法 放回型別 static<T extends Enum<T>> T 返回帶指定名稱的指定列舉型別的列舉常量。
public enum EnumDemoOne {
RED, GREEND, BLANK, YELLOW
}
public class EnumTestOne {
EnumDemoOne enumDemoOne = EnumDemoOne.RED;
public static void main(String[] args){
System.out.println("得到指定名稱的常量名:" + EnumDemoOne.valueOf("RED"));
System.out.println("得到指定名稱的常量名:" + EnumDemoOne.valueOf("BLANK"));
System.out.println("得到指定名稱的常量名:" + EnumDemoOne.valueOf("YELLOW"));
/**
* 得到指定名稱的常量名:RED
* 得到指定名稱的常量名:BLANK
* 得到指定名稱的常量名:YELLOW
*/
}
}複製程式碼
Enum一般做什麼用?
- 常量
public static final String RED;
有了列舉,就可 以把相關的常量分組到一個列舉型別裡,而且列舉提供了比常量更多的方法。/**顏色*/
public enum ColorEnum{
RED, GREEND, BLANK, YELLOW;
}複製程式碼
/**星期*/
public enum WeekDayEnum{
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}複製程式碼
switch
public enum EnumDemoOne {
RED, GREEND, BLANK, YELLOW;
}
public class EnumTestOne {
EnumDemoOne enumDemoOne = EnumDemoOne.RED;
public void changeSwtich(){
switch (enumDemoOne) {
case RED:
System.out.println(EnumDemoOne.RED + " 這是紅色");
break;
case GREEND:
System.out.println(EnumDemoOne.GREEND + " 這是綠色");
break;
case BLANK:
System.out.println(EnumDemoOne.BLANK + " 這是白色");
break;
case YELLOW:
System.out.println(EnumDemoOne.YELLOW + " 這是黃色");
break;
}
}
}複製程式碼
向enum類新增方法與自定義建構函式
我們可以自己給Enum新增屬性和方法。在新增時必須注意一點。必須要在定義完的 列舉後面加上分號;
public enum EnumDemoSecond{
RED("紅"), GREEND("綠"), BLANK("白"), YELLOW("黃");
private String description;
// 構造方法
private EnumDemoSecond(String description) {
this.description = description;
}
/** set()方法 private 是為了防止外部隨意呼叫修改*/
private void setDescription(String description){
this.description = description;
}
/** get()方法*/
public String getDescription() {
return description;
}
/**
* 重寫 toString() 方法,讓他返回的是屬性的值
* */
@Override
public String toString() {
return this.description;
}
public static void main(String[] args){
/**
* 在重寫 toString() 方法以前,toString() 和 name() 都是返回此列舉常量的名稱
* 但是現在重寫了 toString()方法。返回的是自己定義的屬性名稱
* */
for (EnumDemoSecond en : EnumDemoSecond.values()) {
System.out.println("Enum常量名:" + en.name() + "\t Enum的自定義屬性名:" + en.toString() );
}
/**
* Enum常量名:RED Enum的自定義屬性名:紅
* Enum常量名:GREEND Enum的自定義屬性名:綠
* Enum常量名:BLANK Enum的自定義屬性名:白
* Enum常量名:YELLOW Enum的自定義屬性名:黃
*/
}
}複製程式碼
這是博主第一次開始學著寫部落格。。 寫出了博主目前理解了的 內容。
本文許多內容出自: blog.csdn.net/javazejian/…
如有理解錯誤地方請各位大佬指導。