Java 枚舉類 詳解


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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM