枚舉的作用介紹
爲什麼要有枚舉
問題:要定義星期幾或性別的變量,該怎麼定義?假設用1-7分別表示星期一到星期日,但有人可能會寫成int weekday = 0;或即使使用常量方式也無法阻止意外。
枚舉就是要讓某個類型的變量的取值只能爲若干個固定值中的一個,否則,編譯器就會報錯。枚舉可以讓編譯器在編譯時就可以控制源程序中填寫的非法值,普通變量的方式在開發階段無法實現這一目標。
用普通類如何實現枚舉功能,定義一個Weekday的類來模擬枚舉功能。
私有的構造方法
每個元素分別用一個公有的靜態成員變量表示
可以有若干公有方法或抽象方法。採用抽象方法定義nextDay就將大量的if.else語句轉移成了一個個獨立的類。
枚舉的基本應用
舉例:定義一個Weekday的枚舉。
擴展:枚舉類的values,valueOf,name,toString,ordinal等方法(記住,講課時要先於自定義方法前介紹,講課更流暢)
總結:枚舉是一種特殊的類,其中的每個元素都是該類的一個實例對象,例如可以調用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。
用普通類模擬枚舉的實現原理
枚舉就相當於一個類,其中也可以定義構造方法、成員變量、普通方法和抽象方法。
枚舉元素必須位於枚舉體中的最開始部分,枚舉元素列表的後要有分號與其他成員分隔。把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器報告錯誤。
帶構造方法的枚舉
構造方法必須定義成私有的
如果有多個構造方法,該如何選擇哪個構造方法?
枚舉元素MON和MON()的效果一樣,都是調用默認的構造方法。
帶方法的枚舉
定義枚舉TrafficLamp
實現普通的next方法
實現抽象的next方法:每個元素分別是由枚舉類的子類來生成的實例對象,這些子類採用類似內部類的方式進行定義。
增加上表示時間的構造方法
枚舉只有一個成員時,就可以作爲一種單例的實現方式。
java5的枚舉的基本應用
我們可用類來模擬枚舉功能,有以下幾點注意:
1私有的構造方法,
2每個元素分別用一個公有的靜態成員變量表示;
3可以有若干公有方法或抽象方法,例如,要提供nextDay()方法必須是抽象的
枚舉的基本應用,枚舉類的values,valueof,name,toString,ordinal等方法。
枚舉是一種特殊的類,其中的每個元素都是該類的一個實例對象,例如可以調用WeekDay.SUN,getClass(),getName和WeekDay.class,getName();採用抽象方法定義nextDay()就將大量的if…else…語句轉移成了一個個獨立的類。如果想在一個類中編寫完各個枚舉和測試調用類,那麼可以將枚舉定義成調用類的內部類。
例如:
public enum WeekDay{/////////////枚舉的定義
SUN,MON,THU,WED,THI,FRI,SAT//有無;均可
}
public static void main(String[] args) {
WeekDay weekDay2=WeekDay.FRI;//WeekDay就相當於一個類了,
System.out.println(weekDay2);//利用.來調用裏面的對象
System.out.println(weekDay2.ordinal());//排序從0開始
System.out.println(WeekDay.valueOf("SUN"));//利用枚舉來調用靜態方法
System.out.println(WeekDay.values().length);//values()就是所有元素組成的數組
}
實現帶有構造方法的枚舉
帶構造函數的枚舉的應用,仍以WeekDay爲例:
public enum WeekDay{/////////////枚舉的定義
SUN(1),MON(),THU(1,2),WED,THI,FRI,SAT;//有無;均可
private WeekDay(){/////////後面定義了構造函數後,枚舉對象後必要有;
System.out.println("first");//在使用類時,在第一處就要調用構造函數進行初始化
}
private WeekDay(int x){
System.out.println("second");//對對象的初始化,在選擇構造函數時要根據對象後面的參數形式
}
private WeekDay(int x,int y){
System.out.println("third");
}
}
public static void main(String[] args) {
WeekDay weekDay2=WeekDay.FRI;//WeekDay就相當於一個類了,
System.out.println(weekDay2);//利用.來調用裏面的對象
System.out.println(weekDay2.ordinal());//排序從0開始
System.out.println(WeekDay.valueOf("SUN"));//利用枚舉來調用靜態方法
System.out.println(WeekDay.values().length);//values()就是所有元素組成的數組
}
實現帶有抽象方法的枚舉
帶有抽象方法的枚舉應用,以TraficLamp爲例:
public enum TraficLamp{
RED(30){
public TraficLamp nextLamp(){
return GREEN;
}
},
GREEN(40){
public TraficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TraficLamp nextLamp(){
return RED;
}
};
public abstract TraficLamp nextLamp();
private int time;
private TraficLamp(int time){
this.time=time;
}
}