天天看點

枚舉                        關于枚舉-----jdk1.5的新特性之一

      在軟體開發中關于定義變量星期天(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

}

枚舉                        關于枚舉-----jdk1.5的新特性之一

  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"));//輸入一個不存在的枚舉變量,編譯沒錯,運作報錯  

枚舉                        關于枚舉-----jdk1.5的新特性之一

當你看到這時,并且列印出了上面的結果,那就表明你掌握了枚舉的入門。接下來更進一步的了解枚舉,外帶一個思考題。

        //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;

最後有個小知識點就是:枚舉隻有一個成員時,就可以作為一種單例的實作方法。

上一篇: java基礎加強