黑馬程式設計師——Java高新技術之列舉
阿新 • • 發佈:2019-02-16
列舉
列舉enum
列舉就是要讓某個型別的變數的取值,只能為若干個固定值中的一個,否則,編譯器報錯
列舉可以讓編譯器在編譯時就可以控制源程式中填寫的非法值,普通變數的方式在開發階段無法實現這一目標。
列舉是一種特殊的類,列舉中的每一個元素都是一個例項物件
用普通類如何實現列舉功能,定義一個Weekday的類來模擬列舉功能。
列舉就相當於一個類,其中也可以定義構造方法、成員變數、普通方法和抽象方法。public abstract class WeekDay { //私有化該建構函式 private WeekDay(){}; //每一個元素都用靜態來表示 public final static WeekDay SUN = new WeekDay(){ //每一個元素都覆蓋其抽象方法 public WeekDay nextDay() { // TODO Auto-generated method stub return MON; } }; public final static WeekDay MON = new WeekDay(){ @Override public WeekDay nextDay() { // TODO Auto-generated method stub return SUN; } }; //抽象方法 public abstract WeekDay nextDay(); public String toString(){ return this==SUN?"SUN":"MON"; } } package enume; public class EumeDemo { public static void main(String []args){ WeekDay weekday = WeekDay.MON; System.out.println(weekday.nextDay()); } }
列舉元素必須位於列舉體中的最開始部分,列舉元素列表的後要有分號與其他成員分隔。
把列舉中的成員方法或變數等放在列舉元素的前面,編譯器報告錯誤。
構造方法必須是私有的
在列舉物件後加上一個大括號,可以指定用那個構造方法
只要用到了列舉類,它裡面的所有物件(元素)都會被初始化
列舉只有一個成員時,就可以作為一種單例的實現方式。
普通方法就是建立物件,然後呼叫public enum WeedDay1{ SUN(),MON,TUE,WED,THI,FRI,SAT; private WeedDay1() { System.out.println("WeedDay1 run"); } private WeedDay1(int day){ System.out.println("WeedDay1 day run"); } }
主要是抽象方法要注意,帶有抽象方法的列舉, 每個元素分別是由列舉類的子類來生成的例項物件,這些子類採用類似內部類的方式進行定義。
列舉中的一些方法:public enum TrafficLamp{ //這些是列舉物件,但是列舉中用了抽象方法,而抽象方法是不能有物件的,只有子類覆蓋其所有抽象方法才可以,所以用到了內部類 RED(30){ public TrafficLamp nextLamp(){ return GREEN; } }, GREEN(45){ public TrafficLamp nextLamp(){ return YELLOW; } }, YELLOW(5){ public TrafficLamp nextLamp(){ return RED; } }; private int time; //構造方法 private TrafficLamp(int time){ this.time = time; } //抽象方法 public abstract TrafficLamp nextLamp(); } }
靜態方法:
valueOf(Class<T> enumType, String name) 返回帶指定名稱的指定列舉型別的列舉常量。
values()返回列舉內所有元素的陣列
非靜態:
name():返回常量名稱
ordinal():返回列舉常量的位置
getClass():返回類名
public enum WeekDay {
SUN(),MON,TUE,WED,THI,FRI,SAT;
}
public class demo {
public static void main(String[] args) {
WeekDay wd = WeekDay.FRI;
System.out.println(wd.valueOf("SUN"));//返回指定的列舉元素 SUN
System.out.println(wd.getClass());//返回類名class WeekDay
System.out.println(wd.name());//返回列舉元素名FRI
System.out.println(wd.ordinal());//返回列舉元素位置5
WeekDay[] dd = wd.values();//返回所有元素的陣列
for(WeekDay ww:dd){
System.out.print(ww+" "); //SUN MON TUE WED THI FRI SAT
}
}
}