目錄
- 定義
- 使用
- 列舉與switch
- 所有列舉類都是Enum的子類
- 列舉類的構造器
- 列舉類可以有成員
- 列舉類可以有抽象方法
- 每個列舉類都有兩個特殊的方法
定義
一個類有多個例項,但是例項的個數不是無窮的,是有限的。列舉類中的例項稱為列舉項,一般來說,一個列舉類不應該有太多的列舉項。
使用
public enum Direction {
FRONT,BEHIND,LEFT,RIGHT;
}
public class Test{
public static void main(String[] args){
Direction a = Direction.LEFT;
// 建立一個列舉項,可以看作是new 物件
}
}
注意:定義列舉類的關鍵字是enum,而不是Enum 所有的關鍵字都是小寫的。
其中,FRONT,BEHIND,LEFT,RIGHT都是列舉項,列舉項必須在最前面,他們都是本類的例項,也就說,本類只有四個物件
在定義列舉項時,多個列舉項使用逗號分割,最後一個列舉項使用分號結尾。
如果列舉類中只有列舉項,最後的分號可以省略不寫(不建議)
列舉與switch
public class Test {
public static void main(String[] args) {
Direction a = Direction.LEFT;
switch (a) {
case BEHIND:
System.out.println("behind");
break;
case LEFT:
System.out.println("left");
break;
case RIGHT:
System.out.println("right");
break;
case FRONT:
System.out.println("front");
break;
}
}
}
注意:在switch中,不能使用列舉類的名稱,因為編譯器會根據switch中的a的型別去判斷每個列舉型別,在case中必須直接給出與a相同型別的列舉項,而不能再有型別
所有列舉類都是Enum的子類
所有列舉類預設是Enum的子類,無需使用extends來繼承,所以Enum中的方法,所有的列舉類都擁有
int compareTo() // 比較兩個列舉項,其實比較的是序號,即:在列舉類中宣告的順序,例如:FRONT<BEHIND
boolean equals // 比較兩個列舉項是否相等
int hashCode() // 返回列舉項的hashCode()
String name() // 返回列舉項的名稱
int ordinal() // 返回列舉項在列舉類中的宣告的序號,預設從0開始
String toString() // 把列舉項轉化成字串
static T valueOf(Class enumType,String name)// 把字串轉化成列舉項
列舉類的構造器
列舉類也可以有構造器,構造器預設都是private修飾,而且只能是private修飾,因為列舉型別的例項不能由外界來建立,實際上每個列舉項都是呼叫了一次無參構造方法
列舉類可以有成員
列舉類和正常類一樣,都可以有例項變數、例項方法、靜態方法等等 ,只不過它的例項個數是有限的。
如果列舉類只有一個有參的構造方法,那麼在宣告列舉項時需要傳參
public enum Direction {
FRONT("前");
public String name;
Direction(String name){
this.name = name;
}
}
列舉類可以有抽象方法
建立每個列舉類時,使用“特殊”語法
- 只需要在方法上新增abstract關鍵字即可,不需要再enum前面新增abstract關鍵字
- 但是宣告列舉項時需要使用匿名內部類
每個列舉類都有兩個特殊的方法
這兩個方法不用宣告就可以呼叫,並且是static修飾的方法,不屬於Enum類
values(); // 返回本類所有的列舉項
valueOf(String name) //透過列舉項的名字返回指定列舉項