黑馬程序員——淺談java中的高新技術(一)

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS開發</a>、<a href="http://edu.csdn.net"target="blank">.Net培訓</a>、期待與您交流! ----------------------

枚舉

一、概述

        這裏說的枚舉,不是集合vector的特有枚舉迭代器,而是JDK1.5的一個新特性。之所以單獨拿它開刷,是這個知識點比較重要,同時相對來說比較難理解一些。

        爲什麼要有枚舉

        問題:要定義星期幾或性別的變量,該怎麼定義?假設用1-7分別表示星期一到星期日,但有人可能會寫成int weekday = 0;或即使使用常量方式也無法阻止意外。

        枚舉就是要讓某個類型的變量的取值只能爲若干個固定值中的一個,否則,編譯器就會報錯。枚舉可以讓編譯器在編譯時就可以控制源程序中填寫的非法值,普通變量的方式在開發階段無法實現這一目標。

示例:

/*
 * 用普通類如何實現枚舉功能,定義一個Weekday的類來模擬枚舉功能。 
	1、私有的構造方法
	2、每個元素分別用一個公有的靜態成員變量表示
	3、可以有若干公有方法或抽象方法。採用抽象方法定義nextDay就將大量的if.else語句轉移成了一個個獨立的類。

*/

package cn.itheima;

public abstract class WeekDay {
	private WeekDay(){}

	public final static WeekDay SUN=new WeekDay(){
		public WeekDay nextDay(){
			return MON;
		}
	};
	
	public final static WeekDay MON=new WeekDay(){
		public WeekDay nextDay(){
			return SUN;
		}
	};
	
	public abstract WeekDay nextDay();

	public String toString(){
		return this==SUN?"SUM":"MON";
	}
}


二、枚舉的基本應用

1、通過enum關鍵字定義枚舉類,枚舉類是一個特殊的類,每個元素都是該類的一個實例對象。

2、用枚舉類規定值,如上面的WeekDay類。以後用此類型定義的值只能是這個類中規定好的那些值,若不是這些值,編譯器不會通過。

3、好處:在編譯時期就會發現錯誤,表明值不符合,減少了運行時期的錯誤。

4、如果調用者想打印枚舉類中元素的信息,需由編寫此類的人定義toString方法。

注:枚舉類是一個class,而且是一個不可被繼承的final類,其中的元素都是類靜態常量。

5、常用方法:

構造器:

        1)構造器只是在構造枚舉值的時候被調用。

        2)構造器只有私有private,絕不允許有public構造器。這樣可以保證外部代碼無法重新構造枚舉類的實例。因爲枚舉值是public static final的常量,但是枚舉類的方法和數據域是可以被外部訪問的。

        3)構造器可以有多個,調用哪個即初始化相應的值。

非靜態方法:(所有的枚舉類都繼承了Enum方法)

        1String toString() ;//返回枚舉量的名稱

        2int ordinal() ;//返回枚舉值在枚舉類中的順序,按定義的順序排

        3Class getClass() ;//獲取對應的類名

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

靜態方法:

        1valueOf(String e) ;//轉爲對應的枚舉對象,即將字符串轉爲對象

        2values() ;//獲取所有的枚舉對象元素

示例:

package cn.itheima;

public class EnumDemo {
	public static void main(String[] args) {
		WeekDay weekDay=WeekDay.MON;
		System.out.println(weekDay);//輸出枚舉常量名
		System.out.println(weekDay.name());//輸出對象名
		System.out.println(weekDay.getClass());//輸出對應類
		System.out.println(weekDay.toString());//輸出枚舉對象名
		System.out.println(weekDay.ordinal());//輸出此對象在枚舉常量的次序
		System.out.println(WeekDay.valueOf("WED"));//將字符串轉化爲枚舉常量
		System.out.println(WeekDay.values().length);//獲取所以的枚舉元素,並打印其長度
	}
	//定義枚舉內部類
	public enum WeekDay{
		SUN(1),MON,TUE,WED,THI,FRI,SAT;//分號可有可無,但如果下面還有方法或其他成員時,分號不能省。
		//而且當有其他方法時,必須在這些枚舉變量的下方。

		//無參構造器
		private WeekDay(){
			System.out.println("First");
		}
		//帶參數的構造器
		private WeekDay(int day){
			System.out.println("Second");
		}
	}
}

 

三、枚舉的高級應用

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

2、枚舉元素必須位於枚舉體中的最開始部分,枚舉元素列表的後要有分號與其他成員分隔。把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器報告錯誤。

3、帶構造方法的枚舉

        1)構造方法必須定義成私有的

        2)如果有多個構造方法,該如何選擇哪個構造方法?

        3)枚舉元素MONMON()的效果一樣,都是調用默認的構造方法。

4、帶方法的枚舉

如:

/*
 * 抽象的枚舉方法
 * 此時枚舉中的常量需要子類來實現,這是可以利用內部類的方式來定義枚舉常量
 * 帶方法的枚舉
	1)定義枚舉TrafficLamp
	2)實現普通的next方法
	3)實現抽象的next方法:每個元素分別是由枚舉類的子類來生成的實例對象,這些子類
	4)用類似內部類的方式進行定義。
	5)增加上表示時間的構造方法
 * */

package cn.itheima;

public class EnumTest {
	public enum TrafficLamp{
		RED(30){
			public TrafficLamp nextLamp(){
				return GREEN;
			}
		},
		GREEN(30){
			public TrafficLamp nextLamp(){
				return YELLOW;
			}
		},
		YELLOW(5){
			public TrafficLamp nextLamp(){
				return RED;
			}
		};
		private int time;
		//構造器
		private TrafficLamp(int time){
			this.time=time;}
		//抽象方法
		public abstract TrafficLamp nextLamp();
	}		
}

小結:

        1、匿名內部類比較常用

        2、類的方法返回的類型可以是本類的類型

        3、類中可定義靜態常量,常量的結果就是自己這個類型的實例對象

        4、枚舉只有一個成員時,就可以作爲一種單例的實現方式。

注:

        1、所有的枚舉都繼承自java.lang.Enum類。由於Java不支持多繼承,所以枚舉對象不能再繼承其他類。

         2switch語句支持int,char,enum類型,使用枚舉,能讓我們的代碼可讀性更強。


---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS開發</a>、<a href="http://edu.csdn.net"target="blank">.Net培訓</a>、期待與您交流! ----------------------


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