---------------------- <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方法)
1)String toString() ;//返回枚舉量的名稱
2)int ordinal() ;//返回枚舉值在枚舉類中的順序,按定義的順序排
3)Class getClass() ;//獲取對應的類名
4) String name();//返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明。
靜態方法:
1)valueOf(String e) ;//轉爲對應的枚舉對象,即將字符串轉爲對象
2)values() ;//獲取所有的枚舉對象元素
示例:
三、枚舉的高級應用
1、枚舉就相當於一個類,其中也可以定義構造方法、成員變量、普通方法和抽象方法。
2、枚舉元素必須位於枚舉體中的最開始部分,枚舉元素列表的後要有分號與其他成員分隔。把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器報告錯誤。
3、帶構造方法的枚舉
1)構造方法必須定義成私有的
2)如果有多個構造方法,該如何選擇哪個構造方法?
3)枚舉元素MON和MON()的效果一樣,都是調用默認的構造方法。
4、帶方法的枚舉
如:
小結:
1、匿名內部類比較常用
2、類的方法返回的類型可以是本類的類型
3、類中可定義靜態常量,常量的結果就是自己這個類型的實例對象
4、枚舉只有一個成員時,就可以作爲一種單例的實現方式。
注:
1、所有的枚舉都繼承自java.lang.Enum類。由於Java不支持多繼承,所以枚舉對象不能再繼承其他類。
2、switch語句支持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>、期待與您交流! ----------------------