java列舉類別介紹:(java學習影片推薦:java影片教學)
一、什麼情況下使用枚舉類別?
有的時候一個類別的物件是有限且固定的,這種情況下我們使用枚舉類別就比較方便。
二、為什麼不用靜態常數來取代枚舉類別呢?
public static final int SEASON_SPRING = 1; public static final int SEASON_SUMMER = 2; public static final int SEASON_FALL = 3; public static final int SEASON_WINTER = 4;
枚舉類別更直觀,類型安全。使用常數會有以下幾個缺陷:
1. 類型不安全。若一個方法中要求傳入季節這個參數,用常數的話,形參就是int型,開發者傳入任意型別的int型別值就行,但是如果是列舉型別的話,就只能傳入枚舉類別中包含的對象。
2. 沒有命名空間。開發者要在命名的時候以SEASON_開頭,這樣另外一個開發者再看這段程式碼的時候,才知道這四個常數分別代表季節。
三、列舉類別入門
先看一個簡單的枚舉類別。
package enumcase;public enum SeasonEnum { SPRING,SUMMER,FALL,WINTER; }
enum和class、interface的地位一樣使用enum定義的枚舉類別預設繼承了java.lang.Enum,而不是繼承Object類別。枚舉類別可以實作一個或多個介面。所有枚舉類別的實例都必須放在第一行展示,不需要使用new 關鍵字,不需要明確呼叫建構器。自動加入public static final修飾。使用enum定義、非抽象的枚舉類別預設使用final修飾,不可以被繼承。枚舉類別的建構器只能是私有的。
四、枚舉類別介紹
枚舉類別內也可以定義屬性和方法,可是是靜態的和非靜態的。
package enumcase;public enum SeasonEnum { SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天"); private final String name; private SeasonEnum(String name) { this.name = name; } public String getName() { return name; } }
實際上在第一行寫枚舉類別實例的時候,預設是呼叫了建構器的,所以此處需要傳入參數,因為沒有明確申明無參構造器,只能調用有參數的構造器。
建構器需定義成私有的,這樣就不能在別處申明此類的物件了。枚舉類別通常應該設計成不可變類,它的Field不應該被改變,這樣會更安全,而且程式碼更加簡潔。所以我們將Field用private final修飾。
五、枚舉類別實作介面
枚舉類別可以實作一個或多個介面。與普通類別一樣,實作介面的時候需要實作介面中定義的所有方法,若沒有完全實現,那這個枚舉類別就是抽象的,只是不需要明確加上abstract修飾,系統化會預設加上。
package enumcase; public enum Operation { PLUS{ @Override public double eval(double x, double y) { return x + y; } }, MINUS{ @Override public double eval(double x, double y) { return x - y; } }, TIMES{ @Override public double eval(double x, double y) { return x * y; } }, DIVIDE{ @Override public double eval(double x, double y) { return x / y; } }; /** * 抽象方法,由不同的枚举值提供不同的实现。 * @param x * @param y * @return */ public abstract double eval(double x, double y); public static void main(String[] args) { System.out.println(Operation.PLUS.eval(10, 2)); System.out.println(Operation.MINUS.eval(10, 2)); System.out.println(Operation.TIMES.eval(10, 2)); System.out.println(Operation.DIVIDE.eval(10, 2)); } }
Operatio類別實際上是抽象的,不可以創建枚舉值,所以此處在申明枚舉值的時候,都實現了抽象方法,這其實是匿名內部類別的實現,花括號部分是一個類體。我們可以看下編譯以後的檔案。
共生成了五個class文件,這樣就證明了PLUS,MINUS,TIMES,DIVIDE是Operation的匿名內部類別的實例。
六、switch語句裡的運算式可以是列舉值
Java5新增了enum關鍵字,同時擴充了switch。
package enumcase; public class SeasonTest { public void judge(SeasonEnum s) { switch(s) { case SPRING: System.out.println("春天适合踏青。"); break; case SUMMER: System.out.println("夏天要去游泳啦。"); break; case FALL: System.out.println("秋天一定要去旅游哦。"); break; case WINTER: System.out.println("冬天要是下雪就好啦。"); break; } } public static void main(String[] args) { SeasonEnum s = SeasonEnum.SPRING; SeasonTest test = new SeasonTest(); test.judge(s); } }
case表達式中直接寫入枚舉值,不需加入枚舉類別作為限定。
推薦:java基礎教學
#以上是淺談java枚舉類別(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!