在某些情況下,一個類的對象是有限而固定的。比如季節類,它隻有4個屬性。像這種執行個體有限且固定的類,被稱為枚舉類。沒錯,它仍然是一個類,具有類所有的特性。
下面就開始建立一個枚舉類吧:
**
- 無法建立枚舉檔案的問題
**
new>Enum
哎呀,結果發現建立的時候無法建立(如果你用的是eclipse),如下圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90TQi9WOGpFc502YrVzVZZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zNzYTOyITN1EzMxYDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
這是因為Eclipse可以指定編譯深度,預設值為1.4,而枚舉是在jdk1.5之後出現的。需要去修改:Project>proterties>Java Compiler。然後去修改,如圖:
然後應用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。
總之,枚舉也是類。就好像正方形也是矩形一樣。