天天看點

Java Enum 枚舉詳解

在某些情況下,一個類的對象是有限而固定的。比如季節類,它隻有4個屬性。像這種執行個體有限且固定的類,被稱為枚舉類。沒錯,它仍然是一個類,具有類所有的特性。

下面就開始建立一個枚舉類吧:

**

  • 無法建立枚舉檔案的問題

**

new>Enum

哎呀,結果發現建立的時候無法建立(如果你用的是eclipse),如下圖:

Java Enum 枚舉詳解

這是因為Eclipse可以指定編譯深度,預設值為1.4,而枚舉是在jdk1.5之後出現的。需要去修改:Project>proterties>Java Compiler。然後去修改,如圖:

Java Enum 枚舉詳解

然後應用ok。

接下來建立一個Colo枚舉類,有三個執行個體對象

public enum Color {
    RED,GREEN,BLUE;
}
           

在枚舉類中有三個實體類對象。

1.而且它們隻能被寫在第一行,否則這些實體對象無效。

2.枚舉類繼承的是Enum類,不可以顯示去繼承其它類,而Enum類實作了Serializable和Comparable接口

3.如果枚舉類是非抽象的,那麼它不能被繼承

  • switch語句同樣提供了對枚舉類的支援:
public class Test {
    public static void main(String[] args) {
        //調用test方法并傳遞BLUE對象
        test(Color.BLUE);
    }
    /**
     * 
     * @param c 枚舉類對象
     */
    public static void test(Color c) {
        switch (c) {
        case RED:
            System.out.println("紅");
            break;
        case BLUE:
            System.out.println("藍");
            break;
        case GREEN:
            System.out.println("綠");
            break;
        default:
            break;
        }
    }

}
           

可以看出,在switch語句中,可以直接寫對象名稱,不用通過類名點出。

**

  • 枚舉類也是類

**

枚舉類也是一種類,裡面同樣可以有成員變量、方法、構造方法。

  • 枚舉類中成員變量:
public enum Color {
    RED,GREEN,BLUE;
    public String name;
}
           

使用:

public class Test {
    public static void main(String[] args) {
        Color.BLUE.name="藍色";
        System.out.println(Color.BLUE.name);
    }

}
           

輸出:藍色

和普通類對象的用法沒有差別。

  • 成員方法:
public enum Color {
    //三個實體類對象
    RED,GREEN,BLUE;
    //成員變量
    public String name;

    /**
     * 成員方法
     * @param str
     */
    public void eat(String str){
        System.out.println(str);
    }
}
           

調用:

public class Test {
    public static void main(String[] args) {
        Color.BLUE.eat("不能吃");
    }

}
           
  • 構造方法
public enum Color {
    //三個實體類對象,此處的枚舉值,必須調用構造方法來建立(因為隻有一個構造方法)
    RED("紅色"),GREEN("綠色"),BLUE("藍色");
    //成員變量
    public String name;
    //有參構造方法
    private Color(String name) {
        this.name = name;
    }

    /**
     * 成員方法
     * @param str
     */
    public void eat(String str){
        System.out.println(str);
    }
}
           

和普通類一樣,寫了什麼構造方法,就隻能用哪個構造方法。

  • 枚舉類實作接口
public enum Color implements Runnable{
    //三個實體類對象,此處的枚舉值,必須調用構造方法來建立(因為隻有一個構造方法)
    RED,GREEN,BLUE;
//重寫接口的方法
    @Override
    public void run() {


    }
}
           

可以看到,和普通類的繼承沒什麼差別,但是每個對象所執行的重寫的方法都是一樣的,做的事情也就是一樣的。很多情況下,我們的需求是不同的對象,處理不同的資料,那就要分别去重寫這些方法。

public enum Color implements Runnable{
    //這是一個通過匿名内部類得到的對象
    RED{

        @Override
        public void run() {
            System.out.println("紅光");

        }

    }
    ,GREEN{

        @Override
        public void run() {
            System.out.println("綠光");

        }

    }
    ,BLUE{

        @Override
        public void run() {
            System.out.println("藍光");

        }

    };
}
           

這個時候的枚舉類Color并沒有重寫接口的抽象方法,那麼Color就是一個抽象的枚舉類,可以通過子類對象獲得具體執行個體。

調用:

public class Test {
    public static void main(String[] args) {
        Color.BLUE.run();
    }

}
           

輸出:藍光

專門用來儲存枚舉實體類對象的集合有EnumSet和EnumMap。

總之,枚舉也是類。就好像正方形也是矩形一樣。