推薦學習:《》
列舉就是要讓某個型別的變數的取值只能為若干個固定值中的一個,否則編譯器就會報錯,列舉可以讓編譯器在編譯時就可以控制源程式賦給的非法值,使用普通變數的方式在開發階段無法實現這一目標。
在JDK1.5之後,使用關鍵字enum定義一種新的型別,稱為列舉型別
列舉(enum)和類(class)、介面(interface)是同一級別
定義一個color,只能定義紅、綠、藍三種顏色
普通方法
那麼如何解決這種問題,讓color只能在三種顏色中選一種???
使用enum關鍵字定義的列舉類,實際上就相當於定義了一個類,此類繼承課Enum類而已。
public enum Color { RED, GREEN, BLUE;}
protected Enum(String name,int ordinal)
此構造方法不能被外部直接呼叫,只能被其子類存取,此構造方法為自動呼叫public final String name()
返回列舉的名字public String toString()
返回列舉的名字public final int ordinal()
返回列舉的序號,預設從0開始public final boolean equals(Object other)
判斷兩個列舉是否相同
程式碼
public class EnumTest { public static void main(String[] args) { //定義一個color變數,只能設定為RED、GREEN、BLUE Color color = Color.BLUE; System.out.println(color); System.out.println(color.name()); System.out.println(color.toString());//三種方式都是列印名字 System.out.println(color.ordinal());//返回列舉的序號RED--0、GREEN--1、BLUE--2 Color[] values = Color.values();//返回所有列舉型別 System.out.println(Arrays.toString(values)); }}
列舉的本質是一個繼承Enum類的子類,JVM編譯器把列舉編譯後生成一個
final class
列舉不允許從外部呼叫,所以只能是private修飾
構造方法只能在物件中呼叫
public enum Color { RED(10), GREEN(20), BLUE; private int Number;//屬性 private Color() {//預設構造方法 System.out.println("無參構造器被呼叫了!!!"); } private Color(int Number) { this.Number = Number; System.out.println("有參構造器被呼叫了!!!"); } public int getNumber(){ return Number; }}
主方法
public class EnumTest { public static void main(String[] args) { Color color = Color.RED; System.out.println(color.name()); System.out.println(color.getNumber());//獲取Number的值 }}
在列舉型別中,可以繼承介面,實現介面有兩種方法,要麼在列舉類中實現該方法,或者在物件內部實現該方法
方式1:在列舉物件內部實現介面中的方法
interface info{ public String getColor();}public enum Color implements info{ RED{ @Override public String getColor() {return "紅色";} }, GREEN{ @Override public String getColor() {return "綠色";} }, BLUE{ @Override public String getColor() {return "藍色";} };}
方式2:在列舉類中實現介面中的方法
interface info{ public String getColor();}public enum Color implements info{ RED,GREEN,BLUE; @Override public String getColor() { return null; }}
主方法
public class EnumTest { public static void main(String[] args) { Color color = Color.RED; System.out.println(color.getColor()); }}
在列舉型別中,可以定義抽象方法,具體由物件實現
列舉類
public enum Color { RED{ @Override public String getColor() {return "紅色";} }, GREEN{ @Override public String getColor() {return "綠色";} }, BLUE{ @Override public String getColor() {return "藍色";} }; //在列舉中定義一個抽象方法,通過列舉物件實現 public abstract String getColor();}
主方法
public class EnumTest { public static void main(String[] args) { Color color = Color.BLUE; System.out.println(color.getColor()); }}
列舉是用來保證資料在指定範圍內的值,如果列舉中只有一個型別(一個值)的話,列舉中就只有一個物件,那麼就可以實現單例模式。
列舉類
public enum Singletion { SINGLETION; public void Method(){ System.out.println("使用列舉實現單例模式!!!"); }}
主方法
public class EnumTest { public static void main(String[] args) { Singletion singletion=Singletion.SINGLETION; singletion.Method(); }}
在JDK1.5之後,對於Set和Map介面而言又增加了兩個新的子類:
EnumSet
和EnumMap
兩個子類
一個專門
Set
實現與列舉型別一起使用。 列舉集中的所有元素都必須來自建立集合時明確或隱式指定的單個列舉型別EnumSet
是一個抽象類,不能直接建立範例物件,但是可以通過方法來使用。EnumSet.allOf(Class<E> elementType)
把一個列舉型別全部填充到集合中去public static <E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s)
建立與指定列舉集具有相同元素型別的列舉集,最初包含此型別的所有元素,該元素 不包含在指定的集合中。public static <E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s)
建立與指定的列舉集相同的元素型別的列舉集,最初包含相同的元素(如果有)
程式碼
import java.util.EnumSet;public class EnumTest { public static void main(String[] args) { EnumSet<Color> set = EnumSet.allOf(Color.class);//把一個列舉型別全部填充到集合中去 for (Color c : set) { System.out.println(c.name()); } }}
EnumMap
一個專門Map實現與列舉型別鍵一起使用。 列舉對映中的所有金鑰必須來自建立對映時明確或隱式指定的單個列舉型別。 列舉地圖在內部表示為陣列。 這種表示非常緊湊和高效。
程式碼
import java.util.EnumMap;public class EnumTest { public static void main(String[] args) { EnumMap<Color, String> map = new EnumMap<>(Color.class); map.put(Color.RED, "紅色"); map.put(Color.GREEN, "綠色"); map.put(Color.BLUE, "藍色"); System.out.println(map.get(Color.RED)); }
推薦學習:《》
以上就是Java基礎歸納之列舉的詳細內容,更多請關注TW511.COM其它相關文章!