1、枚舉是什么?
Java中的枚舉其實是一種語法糖,在 JDK 1.5之后出現,用來表示固定且有限個的對象。比如一個季節類有春、夏、秋、冬四個對象;一個星期有星期一到星期日七個對象。這些明顯都是固定的,且有限個。
2、枚舉類和普通類的區別
①、使用 enum 定義的枚舉類默認繼承 java.lang.Enum 類,即枚舉類是不能再繼承別的類了。而普通類的一般父類默認是 Object
②、枚舉類的構造器只能使用 private 定義,而普通類的還可以用 public 修飾
③、枚舉類的所有實例必須在枚舉類中顯示列出(,分隔 ;結尾),列出的實例系統會默認自動添加 public static final 修飾
④、所有的枚舉類都提供了一個 values() 方法,可以用來遍歷枚舉值
3、怎么用枚舉?
首先我們看,以一個季節類有春、夏、秋、冬四個對象為例:在 JDK 1.5以前是怎么表示的呢?
創建一個 季節類:
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 + "]"; } }
測試:
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); } }
結果為:
Season [name=春天, desc=春暖花開] Season [name=夏天, desc=炎炎盛夏] Season [name=秋天, desc=秋高氣爽] Season [name=冬天, desc=大雪紛飛]
使用 Enum 來表示季節類:
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; } }
測試:
public static void main(String[] args) { System.out.println(SeasonEnum.SPRING); //SPRING //用 values() 來獲取所有的枚舉值 for(SeasonEnum s : SeasonEnum.values()){ System.out.println(s); } }
枚舉類還能實現接口:
第一步:定義一個接口,方法是返回季節的月份
public interface SeasonEnumImpl { //用來返回季節的月份 String getMonth(); }
第二步:季節類實現接口,並實現接口中的方法
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; } }
測試:
public static void main(String[] args) { System.out.println(SeasonEnum.SPRING); //SPRING //用 values() 來獲取所有的枚舉值 for(SeasonEnum s : SeasonEnum.values()){ System.out.println(s.getMonth()); } }
結果為:
SPRING 12-2 3-5 6-8 9-11
注意:
①、枚舉類可以作為 switch--case 的表達式(JDK 1.5以后)
②、如果枚舉類的對象只有一個,那么可以作為單例模式的實現