智漁課堂官方免費教程二十五:Java基礎教程之枚舉 enum

枚舉

枚舉簡單的說就是將需要的常量值一個一個的列舉出來,並封裝成一個整體。
語法格式:[public] enum 枚舉名{ //值列表 }
聲明格式:枚舉名 變量名;
賦值格式:變量名 = 枚舉名.值
其中的列舉的每個值要符合標識符命名規則,不可隨意編寫

實例:
package enumdemo.simple;
/**
 * 創建枚舉類型的Week 注意:這裏創建的是枚舉,即數據類型是enum,而不是類
 * @author 學霸聯盟 - 趙燦
 */
public enum Week {
	// 列舉出周的值,中間用英文格式的逗號隔開
	// 枚舉中沒有類型之分,直接列舉需要的值即可
	星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期日
}

package _enum.simple;
/**
 * 測試枚舉的使用
 * @author 學霸聯盟 - 趙燦
 */
public class Test {
	public static void main(String[] args) {
		// 在switch中的應用;這樣week代表的就是星期三
		Week week = Week.星期三;
		// 這裏傳入了枚舉類型的變量week
		switch (week) {
		// 這裏的case值直接使用枚舉中存在的值,不能使用其他值
		case 星期一:
			System.out.println("週一");
			break; 
		case 星期二:
			System.out.println("週二");
			break;
		case 星期三:
			System.out.println("週三");
			break;
		case 星期四:
			System.out.println("週四");
			break;
		case 星期五:
			System.out.println("週五");
			break;
		case 星期六:
			System.out.println("週六");
			break;
		case 星期日:
			System.out.println("週日");
			break;
		}
	}
}
輸出結果:
週三

以下內容初學者可選讀
public  enum  Week{
	//這些值會被轉換成Week類型的屬性(變量)名
	星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期日
}
//下面代碼是枚舉Week轉換成類以後的代碼
//枚舉中列舉的每個值都要符合標識符命名規則;這是因爲枚舉屬於引用類型,在底層處理時,枚舉Week會被轉換成
public  final  class  Week  extends java.lang.Enum<Week>{
	public  static  final  Week  星期一; 
	public  static  final  Week  星期二; 
	public  static  final  Week  星期三; 
	public  static  final  Week  星期四; 
	public  static  final  Week  星期五; 
	public  static  final  Week  星期六; 
	public  static  final  Week  星期日;
	public  static  final  Week[]  $VALUES;
	static{
	星期一 = new  Week();
	星期二 = new  Week();
	星期三 = new  Week();
	星期四 = new  Week();
	星期五 = new  Week();
	星期六 = new  Week();
	星期七 = new  Week();
	$VALUES = {星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期七}
}
public  static  Week[]  values(){
	return  (Week[])($VALUES. clone());
}
	public static Week valueOf(String  name){
	return  (Week)(super. valueOf(Week.class, name));
}
}

可以看到轉換後的Week類中,所有成員都是靜態的,所以提現出來的是值類型的特性
注意:雖然枚舉在底層會被轉換成類;但在使用時,不需要使用new去創建對象。需要傳遞時也都是值傳遞的特性

另外,枚舉中可以有屬性和方法,包括構造方法;
例1:
public  enum  Week{
	//MON會被轉換成一個Week類型的屬性,在創建Week對象是調用Week的無參構造
MON( )
}

public  enum  Week{
//由於聲明瞭帶一個String類型參數的構造方法,所以此處這樣寫時也要帶參數
//注意:屬性、方法、構造方法的聲明都必須放在枚舉值之後
MON("星期一")

	//在枚舉Week中聲明一個帶參數的構造方法
	//注意:枚舉中聲明構造方法只能使用private修飾或者不寫,不能使用public和protected
	private  Week(String  value){
		//枚舉中也可以使用this關鍵字
		this.value = value;
}
//屬性和方法可以使用所有的訪問修飾符修飾
private  String  value;
//聲明一個獲取value的方法
public  String  getValue(){
	//沒有局部變量和屬性value衝突,關鍵字this可以省略
	return  value;
}
}

public  class  Test{
	public static void main(String[] args) {
		//輸出MON的值
        System.out.println(Week.MON.getValue());
    }
}
輸出結果:星期一

例2:
/**
 * 枚舉Week
 * @author 學霸聯盟 - 趙燦
 */
enum Week {
	/*
	 * 枚舉值
	 * 因爲該枚舉中聲明瞭帶一個int類型參數的構造方法 
	 * 所以枚舉值後需要加小括號()中帶一個int類型的值
	 * 這個值會傳遞給構造方法中的形參value
	 */
    MON(1), TUE(2), WED(3), THU(4), FRI(5), 
    //SAT(6){}這樣寫作用類似匿名內部類
    SAT(6) {
    	// 重寫getValue方法
        @Override
        public int getValue() {
            return 60;
        }
    },
    SUN(7) {
        @Override
        public int getValue() {
            return 70;
        }
    };
    
    // 枚舉的屬性
    private int value;
    // 該枚舉的構造方法
    Week(int value) {
        this.value = value;
    }
    // 該枚舉的普通方法
    public int getValue() {
        return value;
    }
}
/**
 * EnumTest類:用於測試枚舉的使用
 * @author 學霸聯盟 - 趙燦
 */
public class EnumTest {
    public static void main(String[] args) {
        System.out.println("EnumTest.FRI 的 value = " + Week.FRI.getValue());
        System.out.println("EnumTest.SAT 的 value = " + Week.SAT.getValue());
    }
}
運行結果:
EnumTest.FRI 的 value = 5
EnumTest.SAT 的 value = 60

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