枚舉是java 5新增了一個(gè)menu關(guān)鍵字(它與class峦筒、interface關(guān)鍵字的地位相同),用于定義枚舉锄列,枚舉是一種特殊的類图云,它一樣有自己的Fileld、方法邻邮,可以實(shí)現(xiàn)一個(gè)或多個(gè)接口竣况,也可以定義自己的構(gòu)造器。一個(gè)java源文件中最多只能定義一個(gè)public訪問(wèn)權(quán)限的枚舉類筒严,且該java源文件也必須和枚舉類的類名相同丹泉。
定義
枚舉是指一組固定常量組成合法值的類型情萤。
性質(zhì)
枚舉是真正的 final,客戶端不允許創(chuàng)建枚舉類的實(shí)例摹恨,也不能對(duì)其進(jìn)行拓展紫岩。
Java 枚舉本質(zhì)上是 int 值。只能通過(guò)公有的靜態(tài) final 域?yàn)槊杜e類導(dǎo)出實(shí)例睬塌。
public enum Color {
GREEN,RED,BLUE,GRAY;
}
實(shí)際上枚舉的完整的結(jié)構(gòu)為:
public enum Color {
GREEN,RED,BLUE,GRAY;
Color() {
}
如果在 Color() 構(gòu)造方法之前加上 private 則不會(huì)有任何問(wèn)題。如果加上 public 等修飾符歇万,IDE 會(huì)報(bào)錯(cuò)揩晴,也就是編譯器不會(huì)通過(guò)。其實(shí)這是枚舉與類的根本區(qū)別贪磺,就在于構(gòu)造方法私有硫兰。
當(dāng)然如果僅僅是構(gòu)造方法私有,不再提供構(gòu)造方法了寒锚,也就是說(shuō)外界不能 new 實(shí)例劫映,如果僅從這樣看,那枚舉就沒(méi)有什么用了刹前。
其實(shí)我們用過(guò)枚舉的都知道泳赋,GREEN、RED 都是 Color 型的實(shí)例喇喉,其實(shí)枚舉也可以看作自動(dòng)處理了一些東西祖今,幫助簡(jiǎn)化了代碼,翻譯成類大致就是:
public class Color {
public static final Color GREEN = new Color(),
RED = new Color(),
BLUE = new Color(),
GRAY = new Color();
private Color() {
}
}
如果從這種角度去看拣技,枚舉的用法就不難理解了千诬,也就是枚舉類不給外界實(shí)例化的機(jī)會(huì),只能它自己實(shí)例化膏斤,而一個(gè)枚舉類的所有實(shí)例就只有枚舉前面分號(hào)前的那幾個(gè)徐绑,其他地方不允許創(chuàng)建。
與普通類的異同
相同點(diǎn)
- 均可以實(shí)現(xiàn)接口
不同點(diǎn)
- 枚舉類可以實(shí)現(xiàn)一個(gè)活多個(gè)接口莫辨,使用menu定義的枚舉直接繼承了java.long.Enum類傲茄,而不是繼承Object類。其中java.long.Enum類實(shí)現(xiàn)了java.long.Serializable和java.long.Comparable兩個(gè)接口沮榜。
- 使用enum定義烫幕、非抽象的枚舉默認(rèn)修飾符為final,因此枚舉不能派生子類敞映。
- 枚舉的構(gòu)造器只能使用private訪問(wèn)控制符较曼,如果省略了枚舉的訪問(wèn)修飾符其默認(rèn)為private修飾;如果加強(qiáng)制定訪問(wèn)修飾符則只能使用private振愿。
- 枚舉的所有實(shí)例必須在枚舉的第一行顯示列出捷犹,否則這個(gè)枚舉永遠(yuǎn)都不能生產(chǎn)實(shí)例弛饭,列出這些實(shí)例時(shí)系統(tǒng)會(huì)自動(dòng)添加public static final修飾,無(wú)需程序員顯式添加萍歉。
- 所有的枚舉類都提供了一個(gè)values方法侣颂,該方法可以很方便的遍歷所有的枚舉值。
- 常量值地址唯一,可以用==直接對(duì)比,性能會(huì)有提高枪孩。