枚举(enum)类型
關鍵字enum 可以將一組具名的值的有限集合創建一種新的類型,而這些具名的值可以作為常規的程序使用。創建enum 時,編譯器會為你生成一個相關的類,這個類繼承自java.lang.Enum 。下面是一個例子演示了一些Enum 提供的一些功能。
package com.jas.enumtest;enum Animal{CAT,DOG,SHEEP}public class EnumClass {public static void main(String[] args) {for(Animal animal : Animal.values()){System.out.println(animal + " oridinal:" + animal.ordinal());System.out.print(animal.compareTo(Animal.DOG) + " ");System.out.print(animal.equals(Animal.DOG) + " ");System.out.println(animal == Animal.DOG);System.out.println(animal.getDeclaringClass());System.out.println(animal.name());System.out.println("--------分割線----------");}for(String str : "DOG,CAT,SHEEP".split(",")){Animal animal = Animal.valueOf(Animal.class,str);System.out.print(animal + " ");}} }輸出:
CAT oridinal:0
-1 false false
class com.jas.enumtest.Animal
CAT
——–分割線———-
DOG oridinal:1
0 true true
class com.jas.enumtest.Animal
DOG
——–分割線———-
SHEEP oridinal:2
1 false false
class com.jas.enumtest.Animal
SHEEP
——–分割線———-
DOG CAT SHEEP
??????ordinal() 方法返回一個int 類型的值,這個值是enum 在實例中聲明的順序,從0 開始。可以使用 == 來比較enum 實例,編譯器會自動為你提供equals() 方法與 hashCode() 方法。Enum 類實現了Comparable 接口,所以你可以使用compareTo() 方法。同時Enum 類還實現了Serializable 接口。
??????getDeclaringClass() 方法返回其所屬的類。
??????name 方法返回enum 實例聲明時的名字,這與toString 方法返回的值相同。valueOf() 是在Enum 中定義的static 方法,它可以根據給定的名字返回相應的enum 實例,如果不存在給定名字的實例,就會拋出異常。
覆蓋enum 的方法:
??????當我們想要覆蓋enum 中的方法時,我們會發現,它就只有一個方法toString(),當我們覆蓋它時與覆蓋一般的類的方法沒有區別。
輸出
Cat Dog Sheep
向enum 中添加方法:
??????除了不能繼承一個enum 之外,我們基本上可以將enum 看作是一個常規的類。這也意味著enum 擁有自己的構造函數,以及我們可以向enum 中添加方法。它甚至是可以擁有main() 方法。這里我們通過一個方法返回一個枚舉類型的描述不再僅僅是一個toString() 類型的實現。
輸出:
CAT : 喵喵喵~
DOG : 汪汪汪~
SHEEP : 咩咩咩~
??????需要注意的是:如果我們打算自定義方法,那么必須在enum 徐磊實例的后面添加一個分號。同時Java 要求你必須先定義enum 實例,就像上面這樣我們打算在定義enum 實例之前定義description 但是卻得到一個編譯器的錯誤提示。enum 中的構造函數與方法與普通的類沒有任何區別,除了有少量的限制enum 可以說就是一個類。所以我們可以使用enum 做許多額外的事。
switch 語句中的 enum:
??????一般來說,在switch 語句中 只能使用整數值,而枚舉天生就具備整數值的次序,并且可以通過ordinal() 方法獲得其在enum 中的順序,因此我們可以在switch 中使用枚舉。
輸出:
The traffic light is : RED
The traffic light is : GREEN
The traffic light is : YELLOW
The traffic light is : RED
values() 的神秘之處:
??????我們知道編譯器為我們創建的enum 都繼承自Enum 類。但是如果你去查看Enum 類就會發現,它并沒有values() 方法。但是我們在上面確實使用了這個方法,這是為什么呢?下面我們使用反射機制來查看其中的原因。
—– Analyzing class com.jas.enumtest.Explore —–
superClass : class java.lang.Enum
—– end —–
—– Analyzing class java.lang.Enum —–
genericInterface : java.lang.Comparable
genericInterface : interface java.io.Serializable
superClass : class java.lang.Object
—– end —–
exploreMethods : [compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, values, wait]
enumMethods : [compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, wait]
exploreMethods.containsAll(enumMethods): true
exploreMethods.removeAll(enumMethods): true
exploreMethods : [values]
??????答案就是values() 方法是由編譯器添加的static 方法。其實這個過程中還未其添加了valueOf() 方法。但是Enum 中明明已經有了valueOf() 方法,為什么編譯器還會為其添加這個方法呢?Enum 中的valueOf() 方法需要傳遞進來兩個參數,但是新增的這個方法只需要傳遞進來一個參數。
????????????????????????????????????????????????????????????????????????????????????????????????????????????參考書籍:
????????????????????????????????????????????????????????????????????????????????????????????????????????????????《Java 編程思想》Bruce Eckel 著 陳昊鵬 譯
總結
以上是生活随笔為你收集整理的枚举(enum)类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 唐山城南经济开发区偏不偏(唐山城南经济开
- 下一篇: 拼多多个人店铺升级企业店铺有什么好处(拼