1、爲什麼要有枚舉
1)問題:要定義星期幾或者性別的變量,該怎麼定義?假設用1-7分別表示星期一到星期日,但是可能會寫成int weekday=0嗎?
2)枚舉就是要讓某個類的變量取值只能爲若干個固定值的一個,否則,編譯器就會報錯。枚舉可以讓編譯器在編譯就控制源碼程序中填寫的非法值,普通變量的方式在開發階段無法實現這一目標。
2、用普通的Java類來實現枚舉:
1)私有構造函數
2)在類的內部構造對象,並加上final Static標示,這樣可以根據需要創建固定數量
對象
3)可以有若干公有或抽象方法,例如,要提供的nextWeekDay方法必須是抽象的。採用抽象方法定義nextWeekDay將大量的if.esle語句轉移到了一個獨立的類中了。
實現如下:
public abstract class WeekDay1 {
//1私有構造函數
private WeekDay1(){}
//2在類的內部創建不變的對象
final static WeekDay1 SUN=new WeekDay1(){
@Override
public WeekDay1 nextWeekDay() {
// TODO Auto-generated method stub
return MON;
}
};
final static WeekDay1 MON=new WeekDay1(){
@Override
public WeekDay1 nextWeekDay() {
// TODO Auto-generated method stub
return SUN;
}
};
//3抽象本類方法
abstract public WeekDay1 nextWeekDay();
//4 打印日期
@Override
public String toString() {
// TODO Auto-generated method stub
return this==MON?"MON":"SUN";
}
}
3、創建一個枚舉類
1)枚舉就相當於一個類,其中也可以定義構造函數、成員變量、普通方法和抽象方法。
2)枚舉元素必須位於枚舉體重的最開始部分,枚舉元素列表的後要有分號與其成員分隔。把枚舉中的成員放在枚舉元素的簽名,編譯器就會報錯。
3)帶構造方法的枚舉
①構造方法必須定義成私有的private
②如果有多個構造方法,該如何選擇哪個構造方法?
③枚舉元素MON和MON()的效果一樣,都是調用默認的構造方法。
4)帶方法的枚舉
②定義枚舉TrafficLamp
②實現普通的next方法
③實現抽象的next方法:每個元素 分別是由枚舉類的子類來生成的實例對象,這些子類採用類似內部類的方式進行定義。
5)增加上表示時間的構造方法。
6)枚舉只有一個成員時,就可以作爲一種單例的實現方式。
而枚舉類如下:
public enum TrafficLamp{
RED(30){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return GREEN;
}
},
GREEN(45){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return YELLOW;
}
},
YELLOW(5){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp (int time){this.time=time;};
}