——枚舉

枚舉

     枚舉是JDK1.5以後提供的新特性。枚舉是一個特殊的類, 其中的每一個元素都是該類的一個對象。

     枚舉就相當於一個類,其中也可以有構造方法,成員變量,普通方法和抽象方法。

     注:枚舉元素必須位於枚舉的最開始部分,枚舉元素之間用逗號隔開,結尾用";"分號與其他成員隔開。

 枚舉的構造方法:

      一,枚舉的構造方法必須是私有的,

      二,枚舉元素如果後面不加帶參的括號,則默認調用無參構造方法。

 作用:

    枚舉就要讓某個類型的變量的取值只能爲若干個固定值中的一個, 否則編譯錯誤。

    比如:一週只能有星期一到星期天7天。

枚舉類的方法:

String name() 返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明。

int ordinal() 返回身在枚舉中的位置。  

static valueOf(String name) 返回帶指定名稱的枚舉常量。

values() 返回的是枚舉的所有元素的一個數組。

定義枚舉的語法:用enum關鍵字

    訪問修飾符 enum 枚舉名稱{

    }
枚舉中重寫了toString方法,其默認返回值是枚舉元素的名稱。

枚舉的示例代碼:

package com.itheima.io.file;

/**
 * 交通燈模擬
 * @author wuyong
 *
 */
public class LampDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//打印出枚舉的所有元素:
		System.out.println("===========Values=============");
		Lamp[] lamps = Lamp.values();
		for (Lamp lamp : lamps) {
			System.out.println(lamp.name());
		}
		//輸出對應名稱的元素
		System.out.println("===========Value=============");
		System.out.println(Lamp.valueOf("RED"));
		System.out.println("=============模擬=================");
		//下一個燈
		Lamp nextLamp = null;
		//紅燈,及下一個燈
		System.out.println(Lamp.RED + "亮了" + Lamp.RED.time + "秒");
		nextLamp = Lamp.RED.nextLamp();
		System.out.println(nextLamp + "亮了" + nextLamp.time + "秒");
		
		//黃燈,及下一個燈
		nextLamp = Lamp.YELLOW.nextLamp();
		System.out.println(nextLamp + "亮了" + nextLamp.time + "秒");
		
		//綠燈,及一個燈
		nextLamp = Lamp.GREEN.nextLamp();
		System.out.println(nextLamp + "亮了" + nextLamp.time + "秒");
	}

	public enum Lamp{
		//紅燈
		RED(15) {
			@Override
			Lamp nextLamp() {
				return YELLOW;
			}
			public String toString(){
				System.out.print("紅燈");
				return "";
			}
		},
		//黃燈
		YELLOW(3) {
			@Override
			Lamp nextLamp() {
				return GREEN;
			}
			public String toString(){
				System.out.print("黃燈");
				return "";
			}
		},
		//綠
		GREEN(15) {

			@Override
			Lamp nextLamp() {
				return RED;
			}
			public String toString(){
				System.out.print("綠燈");
				return "";
			}
		};
		//構造方法,跳轉到下一個燈,交由每個燈自己去實現。
		abstract Lamp nextLamp();
		//燈亮的時間
		private int time;
		//構造函數
		private Lamp(){}
		private Lamp(int time){this.time = time;}
	}
}

用普通類模擬枚舉的功能:

步驟:

    1,將構造函數私有;

    2,自定義固定個數的本來對象的靜態常量,並初始化對象;

示例代碼:

package com.itheima.io.file;

/**
 * 用普通類實現枚舉的功能
 * @author wuyong
 *
 */
public class EnumClassDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(EnumClass.LOCK);
		System.out.println(EnumClass.UNLOCK);
		EnumClass.LOCK.isLock();
		EnumClass.UNLOCK.isLock();
	}

}
/**
 * 普通類模擬枚舉的功能
 * @author wuyong
 *
 */
abstract class EnumClass{
	private EnumClass(){};
	public static final EnumClass LOCK = new EnumClass() {
		@Override
		void isLock() {
			System.out.println("鎖鎖上了");
		}
	};
	public static final EnumClass UNLOCK = new EnumClass() {
		@Override
		void isLock() {
			System.out.println("鎖打開了");
		}
	};
	abstract void isLock();
}

枚舉還可以用來設計單例模式:
示例代碼:
package com.itheima.io.file;

/**
 * 枚舉的單例模式
 * @author wuyong
 *
 */
public class EnumSingleDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Single single1 = Single.SINGLE;
		Single single2 = Single.SINGLE;
		System.out.println("single1 == single2 : " + (single1 == single2));
		System.out.println("single1.hashCode == single2.hashCode : " + (single1.hashCode() == single2.hashCode()));
	}
	
	public enum Single{
		SINGLE{
			@Override
			void address() {
				System.out.println(this.hashCode());
			}
		};
		abstract void address(); 
	}
}


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