從JDK 5開始督弓,枚舉被添加到Java語言中塘幅。在Java中昔案,枚舉被定義為類,可以具有構(gòu)造函數(shù)电媳,方法以及實(shí)例變量踏揣。
基礎(chǔ)知識
枚舉的聲明
創(chuàng)建枚舉需要使用關(guān)鍵字enum,例如:
public enum Fruit {
APPLE, BANANA, ORANGE, PEACH
}
APPLE, BANANA等稱為枚舉常量匾乓,這些常量被隱式地聲明為public static final成員捞稿,并且都是Fruit類型(自類型化)。
枚舉的特點(diǎn)
枚舉雖然被定義為類拼缝,但是不能通過new來實(shí)例化枚舉娱局。枚舉變量的聲明和使用在許多方面與基本類型相同。
- 枚舉變量只能被賦值為在該枚舉類型中定義的枚舉常量咧七。
Fruit fruit = Fruit.APPLE;
- 可以使用關(guān)系運(yùn)算符“==”比較兩個(gè)枚舉對象是否相等衰齐。
fruit == Fruit.BANANA;
- 枚舉值也可以用于控制switch語句。
switch (fruit) {
case APPLE:
// ...
case BANANA:
// ...
}
注意:在case語句中继阻,枚舉常量沒有使用枚舉類型進(jìn)行限定耻涛,這是因?yàn)閟witch表達(dá)式中的枚舉類型已經(jīng)隱式指定了case常量的枚舉類型。
- 枚舉常量的toString()方法返回常量的名稱瘟檩。
System.out.println(Fruit.BANANA); // BANANA
預(yù)定義方法
所有枚舉都自動(dòng)包含兩個(gè)預(yù)定義方法:values()和valueOf()抹缕。
values方法
values()返回包含枚舉常量列表的數(shù)組。一般形式如下:
public static enum-type[] values()
例子
Fruit[] fruits = Fruit.values();
for (Fruit fruit : fruits) {
System.out.println(fruit);
}
valueOf方法
valueOf()返回傳入的字符串參數(shù)對應(yīng)的枚舉常量墨辛。一般形式如下:
public static enum-type valueOf(String name)
例子
Fruit fruit = Fruit.valueOf("ORANGE");
System.out.println(fruit); // ORANGE
枚舉是類類型
雖然不能用new實(shí)例化枚舉卓研,但是枚舉卻有許多和其他類相同的功能,比如枚舉可以有構(gòu)造函數(shù)睹簇、實(shí)例變量和方法奏赘,甚至可以實(shí)現(xiàn)接口。
public enum Fruit {
APPLE(10), BANANA(1), ORANGE(2), PEACH;
private int price;
Fruit() {
price = 8;
}
Fruit(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
雖然枚舉是類類型太惠,但是枚舉有兩條限制使得它不能擴(kuò)展志珍。
- 枚舉不能繼承其它類。
- 枚舉不能被其它類繼承垛叨。
枚舉繼承自Enum類
盡管聲明枚舉時(shí)不能繼承其它類伦糯,但是所有枚舉都自動(dòng)繼承父類java.lang.Enum柜某。這個(gè)類定義了所有枚舉都可以使用的一些方法。
- name()方法獲取枚舉常量的名稱敛纲。
- ordinal()方法獲取枚舉常量在常量列表中的位置的值喂击,稱為枚舉常量的序數(shù)值。序數(shù)值從0開始淤翔。
- compareTo()方法比較相同類型的兩個(gè)枚舉常量的序數(shù)值翰绊。
- equals()方法比較枚舉常量和其他對象是否相等。只有當(dāng)兩個(gè)對象都引用同一個(gè)枚舉中相同的常量時(shí)旁壮,它們才相等监嗜。