1、枚舉是什麼?
Java中的枚舉其實是一種語法糖,在 JDK 1.5之後出現,用來表示固定且有限個的對象。比如一個季節類有春、夏、秋、冬四個對象;一個星期有星期一到星期日七個對象。這些明顯都是固定的,且有限個。
2、枚舉類和普通類的區別
①、使用 enum 定義的枚舉類默認繼承 java.lang.Enum 類,即枚舉類是不能再繼承別的類了。而普通類的一般父類默認是 Object
②、枚舉類的構造器只能使用 private 定義,而普通類的還可以用 public 修飾
③、枚舉類的所有實例必須在枚舉類中顯示列出(,分隔 ;結尾),列出的實例系統會默認自動添加 public static final 修飾
④、所有的枚舉類都提供了一個 values() 方法,可以用來遍歷枚舉值
3、怎麼用枚舉?
首先我們看,以一個季節類有春、夏、秋、冬四個對象爲例:在 JDK 1.5以前是怎麼表示的呢?
創建一個 季節類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public class Season {
//屬性不能修改,用 final 修飾
private final String name;
private final String desc;
//因爲枚舉類的對象是有限的,即我們不能再外面 new Season(),所以構造器私有化
private Season(String name,String desc) {
this .name = name;
this .desc = desc;
}
//不能再外面new Season(),那麼內部必須創建出對象
//外界直接通過類名來訪問,用 static 修飾
//外界不能修改,用 final 修飾
public static final Season SPRING = new Season( "春天" , "春暖花開" );
public static final Season SUMMER = new Season( "夏天" , "炎炎盛夏" );
public static final Season FALL = new Season( "秋天" , "秋高氣爽" );
public static final Season WINTER = new Season( "冬天" , "大雪紛飛" );
@Override
public String toString() {
return "Season [name=" + name + ", desc=" + desc + "]" ;
}
}
|
測試:
1
2
3
4
5
6
7
8
9
|
public class SeasonTest {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.SUMMER);
System.out.println(Season.FALL);
System.out.println(Season.WINTER);
}
}
|
結果爲:
1
2
3
4
|
Season [name=春天, desc=春暖花開]
Season [name=夏天, desc=炎炎盛夏]
Season [name=秋天, desc=秋高氣爽]
Season [name=冬天, desc=大雪紛飛]
|
使用 Enum 來表示季節類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public enum SeasonEnum {
//必須在第一行寫出有哪些枚舉值
SPRING( "春天" , "春暖花開" ),
SUMMER( "夏天" , "炎炎盛夏" ),
FALL( "秋天" , "秋高氣爽" ),
WINTER( "冬天" , "大雪紛飛" );
private final String name;
private final String desc;
private SeasonEnum(String name, String desc) {
this .name = name;
this .desc = desc;
}
}
|
測試:
1
2
3
4
5
6
7
8
|
public static void main(String[] args) {
System.out.println(SeasonEnum.SPRING); //SPRING
//用 values() 來獲取所有的枚舉值
for (SeasonEnum s : SeasonEnum.values()){
System.out.println(s);
}
}
|
枚舉類還能實現接口:
第一步:定義一個接口,方法是返回季節的月份
1
2
3
4
5
|
public interface SeasonEnumImpl {
//用來返回季節的月份
String getMonth();
}
|
第二步:季節類實現接口,並實現接口中的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
public enum SeasonEnum implements SeasonEnumImpl{
//必須在第一行寫出有哪些枚舉值
SPRING( "春天" , "春暖花開" ){
@Override
public String getMonth() {
return "12-2" ;
}
},
SUMMER( "夏天" , "炎炎盛夏" ){
@Override
public String getMonth() {
return "3-5" ;
}
},
FALL( "秋天" , "秋高氣爽" ){
@Override
public String getMonth() {
return "6-8" ;
}
},
WINTER( "冬天" , "大雪紛飛" ){
@Override
public String getMonth() {
return "9-11" ;
}
};
private final String name;
private final String desc;
private SeasonEnum(String name, String desc) {
this .name = name;
this .desc = desc;
}
}
|
測試:
1
2
3
4
5
6
7
8
9
|
public static void main(String[] args) {
System.out.println(SeasonEnum.SPRING); //SPRING
//用 values() 來獲取所有的枚舉值
for (SeasonEnum s : SeasonEnum.values()){
System.out.println(s.getMonth());
}
}
|
結果爲:
1
2
3
4
5
|
SPRING
12 - 2
3 - 5
6 - 8
9 - 11
|
注意:
①、枚舉類可以作爲 switch--case 的表達式(JDK 1.5以後)
②、如果枚舉類的對象只有一個,那麼可以作爲單例模式的實現