Java 枚舉類 詳解

一、枚舉是什麼?java

  Java中的枚舉實際上是一種語法糖,在 JDK 1.5以後出現,用來表示固定且有限個的對象。好比一個季節類有春、夏、秋、冬四個對象;一個星期有星期一到星期日七個對象。這些明顯都是固定的,且有限個。ide

 

二、枚舉類和普通類的區別post

  ①、使用 enum 定義的枚舉類默認繼承 java.lang.Enum 類,即枚舉類是不能再繼承別的類了。而普通類的通常父類默認是 Object測試

  ②、枚舉類的構造器只能使用 private 定義,而普通類的還能夠用 public 修飾this

  ③、枚舉類的全部實例必須在枚舉類中顯示列出(,分隔   ;結尾),列出的實例系統會默認自動添加 public static final 修飾url

  ④、全部的枚舉類都提供了一個 values() 方法,能夠用來遍歷枚舉值spa

 

三、怎麼用枚舉?.net

   首先咱們看,以一個季節類有春、夏、秋、冬四個對象爲例:在 JDK 1.5之前是怎麼表示的呢?code

   建立一個 季節類:對象

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之後)

②、若是枚舉類的對象只有一個,那麼能夠做爲單例模式的實現

做者: YSOcean
相關文章
相關標籤/搜索