java中的列舉

ning12發表於2024-06-03

目錄
  • 定義
  • 使用
  • 列舉與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;
    }
}

列舉類可以有抽象方法

建立每個列舉類時,使用“特殊”語法

  1. 只需要在方法上新增abstract關鍵字即可,不需要再enum前面新增abstract關鍵字
  2. 但是宣告列舉項時需要使用匿名內部類

每個列舉類都有兩個特殊的方法

這兩個方法不用宣告就可以呼叫,並且是static修飾的方法,不屬於Enum類

values(); // 返回本類所有的列舉項
valueOf(String name) //透過列舉項的名字返回指定列舉項

相關文章