以下為本人的學習筆記 1.認識枚舉 枚舉不是類,是跟類,介面同級別的類型, 枚舉就是限制某個類型的變數的取值只能為諾幹個固定值中的一個,否則編譯器就會報錯; 枚舉可以讓編譯器在編譯時就可以控制源程式賦給的非法值,使用普通變數的方式在開發階段無法實現這一目標 在JDK1.5之後,使用關鍵字enum定義 ...
以下為本人的學習筆記
-
枚舉不是類,是跟類,介面同級別的類型,
-
枚舉就是限制某個類型的變數的取值只能為諾幹個固定值中的一個,否則編譯器就會報錯;
-
枚舉可以讓編譯器在編譯時就可以控制源程式賦給的非法值,使用普通變數的方式在開發階段無法實現這一目標
-
在JDK1.5之後,使用關鍵字enum定義一種新的類型,稱為枚舉類型,枚舉是列舉出來,選其中的一個
-
枚舉的本質是一個繼承了Enum類的子類,JVM編譯器把枚舉編譯後生成一個final class
2.枚舉的關鍵字和方法
關鍵字:enum ,跟class,interface類似
public class EnumDemo{
public static final int RED = 0x1;
public static final int GREEN = 0x2;
public static final int BLUE = 0x3;
//public int color;//變數,可以隨意賦值
public Color colorEnum;//Color是一個枚舉類型
@Test
public void test1(){
//調用時用枚舉類型名.對象名
colorEnum = Color.RED;
colorEnum = Color.BLUE;
colorEnum = Color.GREEN;
System.out.println(colorEnum);//輸出(字元串):GREEN
//列印colorEnum實際上是列印colorEnum.name()
System.out.println(colorEnum.name());//輸出:GREEN
System.out.println(colorEnum.ordinal());//ordinal序號,編號。輸出:1
System.out.println(colorEnum.toString());//輸出:GREEN
Color[] values = Color.values();//values()獲取Color所有的值
System.out.println( Arrays.toString(values));//輸出:[ RED,GREEN,BLUE]
}
}
//定義一個枚舉類型
public enum Color{
//讓color必須是RED ,GREEN,BLUE中的一個值
//下麵三個,每一個都代表枚舉的一個實例化對象,枚舉類型的對象都是從枚舉類型內部定義的,外部不能定義枚舉對象
RED,GREEN,BLUE;
//寫上一個對象,內部自動會調用Enum(String name,int ordinal),此構造方法不能被外部直接調用,只能被其子類訪問,此構造方法為自動調用
}
3.集合對枚舉的支持
在JDK1.5之後,對於Set和Map介面而言又增加了兩個新的子類:EnumSet(抽象類)、EnumMap兩個類(很少用)
@Test
public void test3(){
EnumSet<Color> set = EnumSet.allOf(Color.class);
for(Color c :set ){
System.out.println(c);//輸出枚舉類型Color的所有實例化對象
}
//key用枚舉類型元素來表示
EnumMap<Color,String> map = new EnumMap<>(Color.class);
map.put(Color.RED,"red");
map.put(Color.GREEn,"green");
map.put(Color.BLUE,"blue");
}
4.帶構造方法的枚舉
通過對象去調用構造方法(但很少使用)
public enum Color{
//枚舉對象後面沒有加括弧,表示調用無參構造方法
//枚舉對象後面有加括弧,表示調用有參構造方法
RED(10),GREEN(20),BLUE;
//可以定義屬性
private int color;
private Color(){
System.out.println("無參構造器");
}
private Color(int color){
this.color = color;
System.out.println("有參構造器");
}
}
@Test
public void test4(){
System.out.println(Color.RED);//第一次使用枚舉,枚舉內部的三個對象的構造方法都會被調用
}
5.讓枚舉實現介面
public interface Info{
public int getColor();
}
public enum Color implements Info{
RED(10),GREEN(20),BLUE;
private int color;
private Color(){
System.out.println("無參構造器");
}
private Color(int color){
this.color = color;
System.out.println("有參構造器");
}
public int getColor(){
return color;
}
}
public void test5(){
System.out.println(Color.RED.getColor());
}
6.在枚舉中定義抽象方法
public enum Color{
RED{
@Override
publci String getColor2(){
return "red";
}
},GREEN{
@Override
publci String getColor2(){
return "green";
}
},BLUE{
@Override
publci String getColor2(){
return "blue";
}
};
public abstract String getColor2();
}
使用枚舉實現單例設計模式
public enum Singleton{
SINGLETON;
publci void method(){
System.out.println("method");
}
}
//使用枚舉實現單例設計模式
@Test
public void test5(){
Singleton.SINGLETON.method();
}
最後,枚舉更符合我們設計的要求,但是枚舉總歸是一種類型,因此它占用的記憶體空間會更大一些。
7.面試題:
1、枚舉類的理解?
當需要定義一組常量時,強烈建議使用枚舉類。
若枚舉只有一個對象,則可以作為一種單例模式的實現方式。
2、枚舉類的創建方式?
JDK1.5之前需要自定義枚舉類;
JDK1.5新增的 enum 關鍵字用於定義枚舉類;
3、枚舉類的特征?
1、私有化類的構造器,保證不能在類的外部創建其對象;
2、在類的內部創建枚舉類的實例。聲明為:public static final;
3、對象如果有實例變數,應該聲明為private final,併在構造器中初始化;
註:enum聲明的枚舉類和class聲明的枚舉類,基本類似,唯獨聲明枚舉類對象的語法簡潔;
4、enum關鍵字的作用?
首先,enum聲明實際上定義了一個類。因此我們可以通過定義的enum調用其方法。
其次,Java編譯器會自動在enum類型中插入一些方法,其中就包括values()——所以我們的程式在沒編譯的時候,自然沒法查看values()方法的源碼了。
5、使用enum關鍵字定義的枚舉類實現介面?
若每個枚舉值在調用實現的介面方法呈現相同的行為方式,則只要統一實現該方法即可。
若需要每個枚舉值在調用實現的介面方法呈現出不同的行為方式, 則可以讓每個枚舉值分別來實現該方法。
■免責申明
⒈ 本站是純粹個人學習網站,與朋友交流共賞,不存在任何商業目的。
⒉ 本站利用了部分網路資源,版權歸原作者及網站所有,如果您對本站所載文章及作品版權的歸屬存有異議,請立即通知我們,我們將在第一時間予以刪除,同時向你表示歉意!