Java 枚舉類 詳解

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

②、如果枚舉類的對象只有一個,那麼可以作爲單例模式的實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章