----------- 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");
}
};
}