1.作用
為什麼要有列舉?
問題: 要定義星期幾或性別的變數,該怎麼定義?假設用1-7分別表示星期一到星期日,但有人可能會寫成int weekday = 0;或即使使用常量方式也無法阻止意外.
列舉就是要讓某個型別的變數的取值只能為若干個固定值中的乙個,否則,編譯器就會報錯!
列舉可以讓編譯器在編譯時就可以控制源程式中填寫的非法值,普通變數的方式在開發階段無法實現這一目標.
2.普通類模擬其原理
sun和mon的示例:元素相當於實現了遍歷類的抽象方法的子類;
public class enumtest
} public abstract class weekday1
// 元素定義為有關鍵字的內部類
public final static weekday1 sun=new weekday1()
};public final static weekday1 mon=new weekday1()
};public abstract weekday1 nextday();
/* public final static weekday sun=new weekday();
public final static weekday mon=new weekday();
public weekday nextday()else
}*/public string tostring()
}
模擬可知:
(1)內部元素都是靜態常量!
(2)列舉也是抽象類,可以建立抽象方法返回本身型別;
(3)每乙個靜態常量元素都可以實現抽象方法,成為乙個例項物件!
知識擴充套件:通過抽象方法nextday()過載,每乙個列舉元素都實現為乙個類,簡化了if-else的書寫;
3. jdk1.5列舉的建立
關鍵字 enum
列舉就是要讓某個型別的變數的取值只能為若干固定值之中的乙個,其中的每乙個元素都是該類的乙個物件!相當於內部類.
定義列舉類的關鍵字enum,
示例:public enum weekday
4.enum的方法和元素呼叫enum類的構造方法
四大重點方法:
列舉元素.name()
列舉元素.ordinal()
enum類.valueof("args")
enum類.values("args")
示例:
public class enumtest
// 定義列舉類的關鍵字enum,定義後內部元素靜態載入完畢;
public enum weekday
private weekday(int day)
}}
5.實現帶有抽象方法的列舉
紅綠燈的實現示例:
enum trafficlamp
},yellow(40)
},green(45)
};public abstract trafficlamp nextlamp();//抽象類不寫body
private int time;
private trafficlamp(int tiem)
}public class enumdemo
}
列舉與靜態常量比較
靜態常量是列舉模式的應用 它有很多缺點 型別不安全 靜態常量可以隨意增加使用或操作 無命名空間,脆弱 某常量值改變後客戶端如果不編譯仍能使用,但表現卻是未定義的 靜態常量列印值為數字,也不具提示性等等 客戶端未編譯有待推敲?this pattern has many problems,such as...
列舉類及其使用
一 列舉類的使用 列舉類的理解 類的物件只有有限個,確定的。我們稱此類為列舉類 當需要定義一組常量時,強烈建議使用列舉類 如果列舉類中只有乙個物件,則可以作為單例模式的實現方式 public class seasontest 自定義列舉類 class season 3.提供當前列舉類的多個物件 pu...
常量和列舉 常量類的區別
一 實體常量類 實體常量類 author administrator date 2018 7 21 public class constclass1 jdk編譯時,直接把常量編譯到使用的地方。在修改變數值後,其它類有可能會出現編譯到舊常量值的問題。2 只能用equals比較,效能較低。無法保證型別是...