一些方法在運行時,它須要的數據不能是任意的,而必須是必定範圍內的值,此類問題在JDK5之前採用自定義帶有枚舉功能的類解決,Java5之後能夠直接使用枚舉予以解決。java
例如: 交通燈(紅、黃、綠) 性別(男、女) 星期(星期1、2、三…..)設計模式
分數等級(A、B、C、D、E)ide
JDK 5新增的 enum 關鍵字用於定義一個枚舉類。函數
枚舉的實現this
使用enum定義枚舉類spa
在枚舉類中定義枚舉值(大寫)設計
enum Gender {對象 MALE, FEMALE;繼承 }接口 |
使用javap命令
發現其中每個枚舉值都是枚舉類的具體實例對象.只不過是靜態常量.
枚舉類具備以下特性:
枚舉類也是一種特殊形式的Java類。
枚舉類中聲明的每個枚舉值表明枚舉類的一個實例對象。
與java中的普通類同樣,在聲明枚舉類時,也能夠聲明屬性、方法和構造函數.
public class Demo1 { public static void main(String[] args) { Gender male = Gender.MALE; System.out.println(male.getInfo()); } }
enum Gender { MALE("男"), FEMALE;
// 成員變量 private String info;
// 構造函數 private Gender() {
}
private Gender(String info) { this.info = info; }
// 成員方法 public String getInfo() { return info; }
} |
枚舉類能夠聲明抽象方法,可是要有具體的枚舉值去實現.
public class Demo1 { public static void main(String[] args) { Gender male = Gender.MALE; System.out.println(male.getInfo()); male.speak(); } }
enum Gender { MALE("男") { @Override public void speak() { System.out.println("是男人"); } }, FEMALE { @Override public void speak() { System.out.println("是女人"); } };
// 成員變量 private String info;
// 構造函數 private Gender() {
}
private Gender(String info) { this.info = info; }
// 成員方法 public String getInfo() { return info; }
public abstract void speak();
} |
枚舉類也能夠實現接口(序列化)、或繼承抽象類。
JDK5中擴展了swith語句,它除了能夠接收int, byte, char, short外,還能夠接收一個枚舉類型(enum)。
public class Demo2 { public static void main(String[] args) { WeekDay mon = WeekDay.MON; switch (mon) { case MON: System.out.println("星期一要上班..."); break; case TUE: System.out.println("星期二,繼續上班..."); break; } } }
enum WeekDay { MON, TUE, WED, THU, FRI, SAT, SUN; }
|
若枚舉類只有一個枚舉值,則能夠看成單態設計模式使用。
練習:
請編寫一個關於星期幾的枚舉WeekDay,要求:枚舉值:Mon,Tue,Wed,Thu,Fri,Sat,Sun 該枚舉要有一個方法,調用該方法返回中文格式的星期。
enum WeekDay { MON {
@Override public String getInfo() {
return "星期一"; }
}, TUE { @Override public String getInfo() {
return "星期二"; } }, WED { @Override public String getInfo() {
return "星期三"; } }, THU { @Override public String getInfo() {
return "星期四"; } }, FRI { @Override public String getInfo() {
return "星期五"; } }, SAT { @Override public String getInfo() {
return "星期六"; } }, SUN { @Override public String getInfo() {
return "星期天"; } };
public abstract String getInfo(); } |