java 1.5引入的一個新特性,其本質是一個final修飾的類,繼承自Enum,不可被繼承。
特點
- 枚舉類用關鍵字enum修改,本質是類
- 定義的枚舉類繼承自java.lang.Enum,且無法被繼承
- 私有的構造方法,不能通過new直接創建實例,只能定義出實例
- 枚舉類中寫的都是成員變量,被final和static修改,默認的,不用寫
- 枚舉類是一種引用類型,引用類型通常用equals()比較,但枚舉類例外,既可以用equals(),也可以使用 ==。這是因為枚舉類型的每一個常量在JVM中只有一個唯一的實例,可以直接用 == 比較。
- 可以將enum類型用于switch語句
枚舉類
定義一個枚舉類,如下
public enum Number {
ONE,TWO,THREE;
}
編譯器編譯處的class類似下面這樣
public class Number{
public static final Number ONE = new Number();
public static final Number TWO = new Number();
public static final Number THREE = new Number();
private Number(){}
}
默認方法
name()
返回常量名稱,不可重寫。例如:
String str = Number.ONE.name(); // 'ONE'
ordinal()
返回定義的常量的順序,從0開始計數。改變枚舉常量定義的順序會導致ordinal()返回值的變化。例如:
int n = Number.ONE.ordinal(); // 0
toString()
返回常量名稱,可被重寫。例如:
public enum Number {
ONE,TWO,THREE;
@Override
public String toString() {
return "NONE";
}
}
// 重寫前
String str = Number.ONE.toString(); // 'ONE'
// 重寫后
String str = Number.ONE.toString(); // 'NONE'
構造方法
枚舉類可以定義私有的構造方法,可以通過定義構造方法來為每個定義實例增加別名。
public enum Number {
ONE(1),TWO(2),THREE(3); // 枚舉類常量,定義的實例
public int value; //枚舉類的字段,可final修飾,也可不用
private Number(int value){
this.value = value;
}
public static void main(String[] args) {
int num = Number.ONE.value;
System.out.println("value = " + num);
}
}
// 輸出:value = 1
switch應用
public static void main(String[] args){
Number item = Number.ONE;
switch(item){
case ONE:
System.err.println(Number.ONE.value);
break;
case TWO:
System.err.println(Number.TWO.value);
break;
case THREE:
System.err.println(Number.THREE.value);
break;
default:
System.err.println("NONE");
}
// 輸出:value = 1