天天看點

黑馬程式員-java 枚舉

----------- android教育訓練、java教育訓練、java學習型技術部落格、期待與您交流! ------------ 

枚舉有什麼作用:

讓某個類型的變量的取值隻能為若幹個固定值中的一個,否則,編譯器就會報錯。

那麼以前的提現的形式是什麼?

步驟:

1.私有預設構造函數,進而保證構造函數隻能被内部使用。

2.每個元素使用公有靜态成員表示

如:

publicclass Color {

    private Color(){//...};

    publicstaticfinal Color RED=new Color();

    publicstaticfinal Color BLUE=new Color();

    publicstaticfinal Color YELLOW=new Color();

    publicstaticfinal Color GREEN=new Color();

}
           

枚舉可以讓編譯器在編譯時就可以控制源程式中填寫的非法值,也就是說要是枚舉有問題,那麼在編譯過程就不會通過。

通過enum關鍵字定義枚舉類型,那麼枚舉有什麼特點呢?

1.所有構造器必須私有化。

2. 其實每個枚舉元素的成員其實就是定義的枚舉類型的一個執行個體,并且它們都靜态常量,是以枚舉值最好全部大寫。

3. 枚舉元素必須位于枚舉體中的最開始部分,枚舉元素清單的後要有分号與其他成員分隔。

例如:枚舉類

publicenum Color{

    RED,

    BLUE(),

    YELLOW,

    GREEN;

    //上面的BLUE和BLUE()的效果是相同的都是調用預設的構造方

}
           

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

一、枚舉提供的常用方法:

toString():可以直接擷取枚舉值的字元串描述

靜态 values():可以讓你取得是以枚舉成員執行個體,并且以數組方式傳回

靜态 valueOf():可以讓你将指定的字元串轉換為對應枚舉類型對象。

compareTo():可以比較兩個枚舉對象在枚舉中的順序,其中傳回值:-1表示之前 0表示相同位置 1表示之後;這個方法的前提是這兩個枚舉值必須屬于同一個枚舉類,否則會報錯。

ordinal():依枚舉順序得到對應的索引值,預設以0開始。

執行個體:

publicenum Color{

    RED,BLUE,YELLOW,GREEN;

    publicvoid getColorName(){

       switch(this){

       caseRED:

           System.out.println("顔色是:red");

           break;

       caseBLUE:

           System.out.println("顔色是:blue");

           break;

       caseYELLOW:

           System.out.println("顔色是:yellow");

           break;

       caseGREEN:

           System.out.println("顔色是:green");

           break;

       /*

       //下面的報錯,原因是不能加入不屬于Color的枚舉元素

       case BLACK:

           System.out.println("顔色是:BLACK");

           break;

       */

       }

    }

    publicstaticvoid main(String[] args){

       Color red=Color.RED;

       Color blue=Color.BLUE;

       //可以直接擷取枚舉值的字元串描述

       System.out.println(red.toString());  //RED

       //可以讓你取得是以枚舉成員執行個體,并且以數組方式傳回

       System.out.println(Color.values());  //[LColor;@de6ced

       //可以讓你将指定的字元串轉換為對應枚舉類型對象。

       System.out.println(Color.valueOf("BLUE")); //BLUE

       //System.out.println(Color.valueOf("blue")); //這裡報錯,原因是必須是枚舉元素的字元串

       //可以比較兩個枚舉對象在枚舉中的順序,其中傳回值:-1表示之前 0表示相同位置 1表示之後。

       System.out.println(blue.compareTo(red));  //1

       //依枚舉順序得到對應的索引值,預設以0開始。

       System.out.println(blue.ordinal());       //1

    }

} 
           

二、帶構造函數的枚舉

注意:

1.構造器隻是在構造枚舉值的時候才被調用

2.所有構造器必須私有化,絕對不允許有public構造器,這是為了避免直接對枚舉類型執行個體化。

publicenum Color{

    RED,BLUE("小籃"),YELLOW,GREEN;

    //使用public報錯,隻能使用private 

    private Color(){

       System.out.println("列印>>"+this);

    }

    private Color(String name){

       System.out.println(name+"列印>>"+this);

    }
}
           

類加載的時候,列印結果:

列印>>RED

小籃列印>>BLUE

列印>>YELLOW

列印>>GREEN

三、抽象枚舉類

注意:一個抽象枚舉類,不需要在class前面加abstract抽象修飾

步驟:

1.定義的abstract方法,但是方法必須放在枚舉元素的下面

2.在每個枚舉元素成員中使用匿名内部類,進行abstract方法的實作。

publicenum Color{

    //這裡需要注意的是每個元素都要對抽象方法進行實作,不然編譯報錯

    RED{

       //對abstract方法實作

       publicvoid printName(){

           System.out.println("顔色是:red");

       }

    },

    BLUE{

       publicvoid printName(){

           System.out.println("顔色是:blue");

       }

    },

    YELLOW{

       publicvoid printName(){

           System.out.println("顔色是:yellow");

       }

    },

    GREEN{

       publicvoid printName(){

           System.out.println("顔色是:green");

       }

    };

    //抽象方法

    publicabstractvoid printName();

}
           

那麼根據上面,我們思考下,那麼對應接口類呢,該怎麼結合枚舉處理?

步驟:

1、 定義的interface類

2、在枚舉類裡implements 接口類

3、在每個枚舉元素成員中使用匿名内部類,實作接口提供的所有方法。

執行個體:

interface Masterplate{

    publicvoid printName();

}

 publicenum Color implements Masterplate{

    RED{

       publicvoid printName(){

           System.out.println("顔色是:red");

       }

    },

    BLUE{

       publicvoid printName(){

           System.out.println("顔色是:blue");

       }

    },

    YELLOW{

       publicvoid printName(){

           System.out.println("顔色是:yellow");

       }

    },

    GREEN{

       publicvoid printName(){

           System.out.println("顔色是:green");

       }

    };

}