Java學習枚舉

枚舉的作用介紹

爲什麼要有枚舉

問題:要定義星期幾或性別的變量,該怎麼定義?假設用1-7分別表示星期一到星期日,但有人可能會寫成int weekday = 0;或即使使用常量方式也無法阻止意外。

枚舉就是要讓某個類型的變量的取值只能爲若干個固定值中的一個,否則,編譯器就會報錯。枚舉可以讓編譯器在編譯時就可以控制源程序中填寫的非法值,普通變量的方式在開發階段無法實現這一目標。

用普通類如何實現枚舉功能,定義一個Weekday的類來模擬枚舉功能。 

私有的構造方法

每個元素分別用一個公有的靜態成員變量表示

可以有若干公有方法或抽象方法。採用抽象方法定義nextDay就將大量的if.else語句轉移成了一個個獨立的類。

枚舉的基本應用

舉例:定義一個Weekday的枚舉。

擴展:枚舉類的values,valueOf,name,toString,ordinal等方法(記住,講課時要先於自定義方法前介紹,講課更流暢)

總結:枚舉是一種特殊的類,其中的每個元素都是該類的一個實例對象,例如可以調用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。

用普通類模擬枚舉的實現原理

枚舉就相當於一個類,其中也可以定義構造方法、成員變量、普通方法和抽象方法。

枚舉元素必須位於枚舉體中的最開始部分,枚舉元素列表的後要有分號與其他成員分隔。把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器報告錯誤。

帶構造方法的枚舉

構造方法必須定義成私有的

如果有多個構造方法,該如何選擇哪個構造方法?

枚舉元素MON和MON()的效果一樣,都是調用默認的構造方法。

帶方法的枚舉

定義枚舉TrafficLamp

實現普通的next方法

實現抽象的next方法:每個元素分別是由枚舉類的子類來生成的實例對象,這些子類採用類似內部類的方式進行定義。

增加上表示時間的構造方法

枚舉只有一個成員時,就可以作爲一種單例的實現方式。

java5的枚舉的基本應用

我們可用類來模擬枚舉功能,有以下幾點注意:

1私有的構造方法,

2每個元素分別用一個公有的靜態成員變量表示;

3可以有若干公有方法或抽象方法,例如,要提供nextDay()方法必須是抽象的

枚舉的基本應用,枚舉類的values,valueof,name,toString,ordinal等方法。

枚舉是一種特殊的類,其中的每個元素都是該類的一個實例對象,例如可以調用WeekDay.SUN,getClass(),getName和WeekDay.class,getName();採用抽象方法定義nextDay()就將大量的if…else…語句轉移成了一個個獨立的類。如果想在一個類中編寫完各個枚舉和測試調用類,那麼可以將枚舉定義成調用類的內部類。

例如:

public enum WeekDay{/////////////枚舉的定義

       SUN,MON,THU,WED,THI,FRI,SAT//有無;均可

    }

public static void main(String[] args) {

       WeekDay weekDay2=WeekDay.FRI;//WeekDay就相當於一個類了,

       System.out.println(weekDay2);//利用.來調用裏面的對象

       System.out.println(weekDay2.ordinal());//排序從0開始

       System.out.println(WeekDay.valueOf("SUN"));//利用枚舉來調用靜態方法

       System.out.println(WeekDay.values().length);//values()就是所有元素組成的數組

    }

 

實現帶有構造方法的枚舉

帶構造函數的枚舉的應用,仍以WeekDay爲例:

public enum WeekDay{/////////////枚舉的定義

       SUN(1),MON(),THU(1,2),WED,THI,FRI,SAT;//有無;均可

       private WeekDay(){/////////後面定義了構造函數後,枚舉對象後必要有;

           System.out.println("first");//在使用類時,在第一處就要調用構造函數進行初始化

       }

       private WeekDay(int x){

           System.out.println("second");//對對象的初始化,在選擇構造函數時要根據對象後面的參數形式

       }

        private WeekDay(int x,int y){

           System.out.println("third");

       }

      

    }

 

public static void main(String[] args) {

       WeekDay weekDay2=WeekDay.FRI;//WeekDay就相當於一個類了,

       System.out.println(weekDay2);//利用.來調用裏面的對象

       System.out.println(weekDay2.ordinal());//排序從0開始

       System.out.println(WeekDay.valueOf("SUN"));//利用枚舉來調用靜態方法

       System.out.println(WeekDay.values().length);//values()就是所有元素組成的數組

    }

實現帶有抽象方法的枚舉

帶有抽象方法的枚舉應用,以TraficLamp爲例:

public enum TraficLamp{

       RED(30){

           public TraficLamp nextLamp(){

              return GREEN;

           }  

       },

       GREEN(40){

           public TraficLamp nextLamp(){

                  return YELLOW;

              }     

       },

       YELLOW(5){

           public TraficLamp nextLamp(){

                  return RED;

              }     

       };

       public abstract TraficLamp nextLamp();

       private int time;

       private TraficLamp(int time){

           this.time=time;

       }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章