在軟體開發中關于定義變量星期天(int weekday)的值時,剛開始我規定 int weekday = 7;但是時間長了,對int weekday = 7的規定會忘卻,到下一次要定義變量int weekday = ?時,我可能會定義成0,那會和以前定義的不一緻而出問題。(在多人開發中也會出現這樣的問題,有人會定義成0,也有人會定義成7),使用枚舉就可以避免上述情況的發生。
定義:是指将變量的值一一列出來,變量的值隻限于列舉出來的值的範圍内.(比如星期,就隻有星期一-星期天,用枚舉合适),枚舉是一種特殊的類,其中的每個元素都是該類的一個執行個體對象,例如可以調用weekday.sun.getclass().getname()和weekday.class.getname。
枚舉就是要讓某個類型的變量的取值隻能為若幹個固定值中的一個,否則,編譯器就會報錯。枚舉可以讓編譯器在編譯時就可以控制源程式中填寫的非法值,普通變量的方式在開發階段無法實作這一目标。
示例:我有一個枚舉 weekday
public enum weekday{
sun,mon
}

fri我在枚舉裡面沒有定義,是以編譯報錯。
防止程式出錯,統一變量取值,避免在開發時對一些固定變量取值前後不一的情況。
/**
* 用普通類實作枚舉原理
* @author json
*
*/
public class weekday {
/**
* 私有構造函數方法,為了防止weekday被随便的執行個體化
*/
private weekday(){}
//定義靜态常量星期一
public final static weekday mon = new weekday();
//定義靜态常量星期二
public final static weekday tue = new weekday();
//定義靜态常量星期天
public final static weekday sun = new weekday();
//下面省略了星期三,四,五,六
//...
/**
* 獲得下一天
* @return
*/
public weekday nextday(){
if(this==mon){
return tue;
}else if(this==tue){
return sun;
}else{
return mon;
}
}
//列印名字的方法
public string tostring(){
//當隻有2個元素的時候可以隻有寫,但是有三個元素就不能這樣寫了。
//return this == sun?"sun":"mon";//三元運算符
if(this==sun){
return "sun";
return "tue";
return "mon";
//main函數是程式入口,可以在類裡面的任何地方,但是必須在一個類中
//public static void main(string[] args) {}-----------1
//public class student {
// public static void main(string[] args) {}---------2
//}
//public static void main(string[] args) {}-----------3
//1,3錯的位置,2是對的位置
public static void main(string[] args){
//星期一的對象
weekday mon = weekday.mon;
system.out.println(mon.tostring());
system.out.println(mon.nextday().tostring());
system.out.println(mon.nextday().nextday().tostring());
輸出結果:
mon
tue
sun
上面是一個簡單類實作枚舉的代碼,對于上面的if-else,寫起來是不是很麻煩呢?如有還有許多個變量,那些if-else豈不是很麻煩,于是上面的代碼還可以改進改進
* 用普通類實作枚舉原理(用了抽象方法)
public abstract class weekday {
public final static weekday mon = new weekday(){
@override//這是注解(覆寫的意思)
public weekday nextday() {
// todo auto-generated method stub
public string tostring() {
};
public final static weekday tue = new weekday(){
public final static weekday sun = new weekday(){
};
* 獲得下一天(抽象方法,類也要是抽象的類)
public abstract weekday nextday();
* 列印名字的方法(抽象方法,類也要是抽象的類)
public abstract string tostring();
輸出的結果是一樣的,但是第二種方法比第一種方法更加的好一些。
//定義一個枚舉對象
public enum weekday{
sun,mon,tue,wed,thi,fri,sat
}
public static void main(string[] args){
//全大寫的命名方式是常量的
weekday fri= weekday.fri;
system.out.println(fri);
system.out.println(fri.name());//得到枚舉對象的名字
system.out.println(fri.ordinal());//排在幾位
system.out.println(fri.valueof("sun"));//傳回帶指定名稱的指定枚舉類型的枚舉常量。(檢視jdk幫助文檔知道的)
system.out.println(fri.valueof("wed").tostring());
system.out.println(fri.values().length);
system.out.println(fri.valueof("aaa"));//輸入一個不存在的枚舉變量,編譯沒錯,運作報錯
當你看到這時,并且列印出了上面的結果,那就表明你掌握了枚舉的入門。接下來更進一步的了解枚舉,外帶一個思考題。
//public weekday(){};//這裡會報錯,原因為枚舉的元素清單必須位于在所有的
//成分之前,如果枚舉的元素清單後有東西,那元素清單後面得有分号';'
sun(),mon(1),tue,wed,thi,fri,sat;
// public weekday(){};//這裡用public會報錯,原因是:枚舉構造函數,隻有私人的非法修改是允許的。(滑鼠移到小紅x上,把顯示出來的英語拿給google翻譯)
private weekday(){system.out.println("first");};
private weekday(int day){system.out.println("second");};
public static void main(string[] args){
weekday weekday2 = weekday.fri;
輸出結果為:
first
second
思考:sun()和mon(1)與tue和sun()他們有差別嗎?為什麼?還有輸出結果第二行為什麼是“second”?-------這裡面涉及了方法的重載哈
下面是枚舉的最複雜的方式---------張孝祥老師說的
public enum trafficlamp{
//red{}代表為trafficlamp的子類
red(30){
@override
public trafficlamp nextlamp() {
// todo auto-generated method stub
return green;
}
},
//green{}代表為trafficlamp的子類
green(45){
return yellwo;
//yellwo{}代表為trafficlamp的子類
yellwo(5){
return red;
};
public abstract trafficlamp nextlamp();
private int time;
private trafficlamp(int time){
this.time = time;
最後有個小知識點就是:枚舉隻有一個成員時,就可以作為一種單例的實作方法。