參考:
https://www.cnblogs.com/zhanqing/p/11076646.html
枚舉類
關鍵字enum
Java中,枚舉類型使用關鍵字enum進行聲明,它是一種特殊的類。
通過關鍵字enum創建的枚舉類型,在編譯後事實上也是一個類類型,而且該類繼承自java.lang.Enum類,同時編譯器會將枚舉類標記爲final類。由於Java並不是支持多繼承,所以enum聲明的枚舉類不能再繼承其他類。
enum NotPossible extends Pet{} // 不正確
實際上,在Java中,多繼承的功能可以通過多實現來實現,即實現一個或多個接口。
相關細節
Java要求必須先定義枚舉實例(枚舉常量)。如果在定義枚舉實例之前定義了任何方法或屬性,那麼編譯會報錯。
如果打算在枚舉類中定義(或重寫)方法,則需要在枚舉實例序列的最後添加分號“;”。
只能在枚舉類的內部使用其構造器創建枚舉實例。事實上,構造器只在構造枚舉實例時被調用,一旦枚舉類的定義結束,編譯器就不允許我們再使用其構造器來創建任何實例了,所以一般將枚舉類的構造器定義爲private,當然即使我們使用其他權限修飾符定義構造器,也無法在外部生成枚舉實例,這是由編譯器保證的。
除此之外,我們也可以自定義構造函數。在聲明枚舉實例的同時給構造函數傳入實參,這樣便可以使用實參,添加對每個枚舉實例的描述。然後使用重寫的toString(),返回這個描述信息。而默認的toString()方法只能返回枚舉實例的名字。
在繼承自Enum類的方法中,只有toString()不是final的。換句話說,枚舉類只能重寫(覆蓋)toString()方法。但是可以向枚舉類中添加方法。
枚舉類的相關方法
比較2個枚舉常量是否相等,可以使用==,也可以使用equals方法。
name() : 返回枚舉實例聲明時的名字,這與使用默認的toString()方法效果相同。
values() : 返回一個包含所有枚舉實例的數組,其類型爲枚舉類。
ordinal(): 返回枚舉實例對應的位置(位置從0開始)
int compareTo(E other): 用來比較如果枚舉實例出現在Other之前,則返回一個負值;如果this=other,則返回0;否則返回正值。枚舉常量的出現次序在enum聲明中給出。
代碼示例
獲取枚舉實例
// 獲取枚舉實例的方法1
ColorEnum s1 = ColorEnum.RED;
// 獲取枚舉實例的方法2
ColorEnum s2 = Enum.valueOf(ColorEnum .class, "WHITE");
獲取枚舉實例的位置
枚舉實例的位置,同定義時的順序一致,位置從0開始計數。
// 獲取枚舉實例的位置【從0開始】
int index = s2.ordinal();
比較2個枚舉實例
int resBe = s1.compareTo(s2);
System.out.println("resBe = "+resBe);
比較2個枚舉實例是否相等
if(s2==s1){System.out.println("相等");}
else{ System.out.println("不相等");}
// 使用equals方法
if(s2.equals(s1)){System.out.println("相等");}
else{ System.out.println("不相等");}
獲取全部枚舉實例
可以使用values方法獲取全部的枚舉實例。
ColorEnum [] arrs = ColorEnum.values();
// 打印所有枚舉實例
for(ColorEnum s:arrs)
{
System.out.println(s.toString());
}
不重寫toString方法
在原始情況下,即沒有重寫toString方法時,枚舉類的name方法和toString方法返回的結果是一樣的。
主函數
public class ColorEnumTest {
public static void main(String[] args) {
// 獲得枚舉實例
ColorEnum s1 = ColorEnum.RED;
// 得到枚舉實例的描述
System.out.println(s1.toString());
System.out.println(s1.name());
}
}
ColorEnum 類
public enum ColorEnum {
// 枚舉實例
RED,GREEN,WHITE,YELLOW;
}
重寫toString方法添加對枚舉實例的描述
主函數
可以看到,ColorEnum枚舉類的構造函數被調用了4次,正好對應4個枚舉實例。也就是說每生成1個枚舉實例,編譯器都會自動調用該枚舉類的構造函數。
public class ColorEnumTest {
public static void main(String[] args) {
// 獲得枚舉實例
ColorEnum s1 = ColorEnum.RED;
// 使用重寫的toString方法得到枚舉實例的描述
System.out.println(s1.toString());
System.out.println(s1.name());
}
}
ColorEnum 類
public enum ColorEnum {
// 枚舉實例,生成實例的時候調用了構造器,括號內都是傳給構造器的實參
RED("紅色",1),GREEN("綠色",2),WHITE("白色",3),YELLOW("黃色",4);
// 成員變量
private String name;
private int index;
// 私有的構造方法
private ColorEnum(String name,int index) {
System.out.println("Color的構造方法");
this.name = name;
this.index = index;
}
// 重寫toString方法
@Override
public String toString() {
return this.index + "--" + this.name;
}
}