public enum Color{ RED, BLUE, BLACK, YELLOW, GREEN }
Color c = Color.RED;
如上,是我們通常使用枚舉類型的常用方式。
從編寫方式上看,enum很像是特殊的class,實際上enum聲明定義的類型就是一個類。而這些類都是類庫中Enum類的子類。查看編譯之后的字節碼文件可以發現enum類型被單獨編譯成了字節碼文件Color.class。
Compiled from "Color.java" public final class Color extends java.lang.Enum<Color> { public static final Color RED; public static final Color BLUE; public static final Color BLACK; public static final Color YELLOW; public static final Color GREEN; public static Color[] values(); public static Color valueOf(java.lang.String); static {}; }
由上可知:
1. enum類型是一個不可以被繼承的final類。其枚舉值都是Color類型的類靜態常量(這也是為什么enum會大寫的原因)。
2. 既然是類,所以enum類型也有構造函數,方法和域。不過enum類型與一般class有很大的不同:
(1)構造函數只會在構造枚舉值的時候被調用
enum Color{ RED(255, 0, 0), BLUE(0, 255, 0), GREEN(0, 0, 255);//注意此處必須有分號 private Color(int r, int g, int b){ this.r = r; this.g = g; this.b = b; } private int r, g, b; public String toString(){ return super.toString() + "(" + r + ", " + g + ", " + b + ")"; } }
(2) 為了確保構造函數不會被外部調用,因此構造函數必須是private的。
(3) 所有enum類型都會繼承Enum.java的方法,包括:
a. ordinal()方法:返回枚舉值在enum類中的順序。這個順序依據枚舉值聲明時的順序而定。
Color.RED.oridinal(); //返回結果:0
b. compareTo()方法:
Color.RED.compareTo(Color.BLUE); //返回結果:-1
c. toString():返回枚舉值的名稱
Color.RED.toString(); //返回結果:RED
d. values():返回一個包含全部枚舉值的數組
Color[] colors = Color.values();
e. valueOf():返回枚舉值常量
Color.valueOf("BLUE"); //返回結果:Color.BLUE
d. equals() : 比較兩個枚舉類對象的引用。
public final boolean equals(Object other){ return this == other; }
注意:枚舉類和枚舉值的不同
如上,這樣我們知道了枚舉值帶方法和變量時的原理和用法。因此enum還有一個用法是實現接口。
public enum Color implements IColor{ RED("紅色", 1), GREEN("綠色", 2), BLUE("藍色", 3); private Color(String name, int value){ this.name = name; this.value = value; } private String name; private int value; @Override public String getName(){ return this.name; } @Override public int getValue(){ return this.value; } }
需要注意的是,哪些方法是給枚舉類調用的,哪些方法是給枚舉值調用的。