Java进阶
Java進(jìn)階_枚舉 enum
1 枚舉引入
Java是一門面向?qū)ο蟮恼Z(yǔ)言,當(dāng)我們創(chuàng)建好一個(gè)類以后,可以創(chuàng)建這個(gè)類的多個(gè)對(duì)象
但是一個(gè)類究竟創(chuàng)建多少個(gè)對(duì)象,并且對(duì)象代表的值我們是無法限制的
所以,如果開發(fā)中需要一組值,需要的數(shù)據(jù)是明確的,就可以使用枚舉
2 枚舉概念
枚舉類是一種特殊形式的Java類,枚舉類的對(duì)象個(gè)數(shù)是有限且明確的。比如 :
星期:Monday(星期一)…Sunday(星期天)
性別:Man(男)、Woman(女)
季節(jié):Spring(春天)…Winter(冬天)
支付方式:Cash(現(xiàn)金) 、WeChatpay(微信支付) 、AliPay(支付寶支付)、BankCard(銀行卡支付)、CreditCard(信用卡支付)
訂單狀態(tài):Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配貨)、Delivered(已發(fā)貨) 、Return(退貨)、Checked(已收貨)
所以 ,如果當(dāng)我們需要定義一組常量表示不同的狀態(tài)時(shí),就建議使用枚舉類
JDK5以前是需要自定義枚舉類的,JDK5以后可以使用關(guān)鍵字enum來定義枚舉類
我們先來用傳統(tǒng)class的方式來實(shí)現(xiàn)自定義枚舉類:
3 自定義枚舉類
枚舉類中聲明的每一個(gè)枚舉值代表枚舉類的一個(gè)實(shí)例對(duì)象
與Java中的普通類一樣 ,在聲明枚舉類時(shí),也可以聲明屬性、方法和構(gòu)造函數(shù)
但是枚舉類的構(gòu)造函數(shù)必須為私有的 ,我們一起來練習(xí)一下:
package cn.cxy.exec;
/*本類用于自定義枚舉類*/
public class SeasonTest {
public static void main(String[] args) {
System.out.println(Season.SPRING.getSEASON_NAME());//春季
System.out.println(Season.SUMMER.getSEASON_DESC());//夏日炎炎
System.out.println(Season.AUTUMN);
//Season{ SEASON_NAME='秋季', SEASON_DESC='秋高氣爽'}
}
}
//1.自定義枚舉類
class Season{
//2.定義本類的私有屬性,為了防止值被修改,需要設(shè)置為final
private final String SEASON_NAME;//季節(jié)名
private final String SEASON_DESC;//季節(jié)描述
//3.私有化本類的構(gòu)造方法--防止外界隨意創(chuàng)建本類對(duì)象
private Season(String seasonName,String seasonDesc){
this.SEASON_NAME = seasonName;//在構(gòu)造中給本類的屬性賦值
this.SEASON_DESC = seasonDesc;
}
//4.提供當(dāng)前枚舉類的多個(gè)對(duì)象
public final static Season SPRING = new Season("春季","春暖花開");
public final static Season SUMMER = new Season("夏季","夏日炎炎");
public final static Season AUTUMN = new Season("秋季","秋高氣爽");
public final static Season WINTER = new Season("冬季","冬雪凜凜");
//5.生成對(duì)應(yīng)的get的方法,獲取本類的兩個(gè)屬性值
public String getSEASON_NAME() {
return SEASON_NAME;
}
public String getSEASON_DESC() {
return SEASON_DESC;
}
//6.生成toString方法方便查看
@Override
public String toString() {
return "Season{ " +
"SEASON_NAME='" + SEASON_NAME + ''' +
", SEASON_DESC='" + SEASON_DESC + ''' + '}';
}
}
4 使用關(guān)鍵字enum定義枚舉類
package cn.cxy.exec;
/*本類用于使用enum關(guān)鍵字定義枚舉類*/
public class ColorTest {
public static void main(String[] args) {
//6.進(jìn)行測(cè)試
System.out.println(403 Forbidden);//RED
System.out.println(Color.ORANGE.getCOLOR_NAME());//橙色
System.out.println(Color.ORANGE.getCOLOR_NUMBER());//2
}
}
//1.使用enum關(guān)鍵字定義枚舉類
enum Color {
//2.寫出本類對(duì)應(yīng)的多個(gè)枚舉對(duì)象
/*1.public static final可以省略不寫
* 2.枚舉對(duì)象不能像自定義枚舉類對(duì)象時(shí)new,要按照下面的語(yǔ)法 :
* 枚舉名1(值1 ,值2) ,枚舉名2(值1,值2) ,枚舉名3(值1,值2);
* 3.不需要生成toString,因?yàn)槭褂胑num關(guān)鍵字定義的枚舉類繼承了java.lang.Enum
* 在Enum中重寫了繼承自O(shè)bject的toString(),直接打印的就是枚舉名*/
RED("紅色",1),
ORANGE("橙色",2),
YELLOW("黃色",3),
GREEN("綠色",4),
CYAN("青色",5),
BLUE("藍(lán)色",6),
PURPLE("紫色",7);
//3.定義枚舉類的多個(gè)私有屬性
private final String COLOR_NAME;
private final int COLOR_NUMBER;
//4.定義本類的構(gòu)造方法
private Color(String colorName, int colorNumber) {
this.COLOR_NAME = colorName;
this.COLOR_NUMBER = colorNumber;
}
//5.生成屬性對(duì)應(yīng)的兩個(gè)get()
public String getCOLOR_NAME() {
return COLOR_NAME;
}
public int getCOLOR_NUMBER() {
return COLOR_NUMBER;
}
}
總結(jié) :
1.public static final可以省略不寫
2.枚舉對(duì)象不能像自定義枚舉類對(duì)象時(shí)new,要按照下面的語(yǔ)法:
枚舉名1(值1 ,值2),枚舉名2(值1 ,值2) ,枚舉名3(值1,值2);
3.不需要生成toString,因?yàn)槭褂胑num關(guān)鍵字定義的枚舉類繼承了java.lang.Enum
在Enum中重寫了繼承自O(shè)bject的toString(),直接打印的就是枚舉名
5 實(shí)現(xiàn)接口的枚舉類
枚舉類也可以實(shí)現(xiàn)接口、或繼承抽象類,有兩種實(shí)現(xiàn)方案:
方案一 :枚舉類與接口建立實(shí)現(xiàn)關(guān)系,在枚舉類中實(shí)現(xiàn)接口中定義的抽象方法
效果 :每個(gè)枚舉對(duì)象調(diào)用實(shí)現(xiàn)后的方法都是同一個(gè)效果
方案二:枚舉類與接口建立實(shí)現(xiàn)關(guān)系 ,在枚舉類每個(gè)枚舉對(duì)象后分別實(shí)現(xiàn)抽象方法
效果:不同的枚舉對(duì)象調(diào)用實(shí)現(xiàn)后的方法就是不同的效果
package cn.cxy.exec;
/*本類用于實(shí)現(xiàn)枚舉實(shí)現(xiàn)接口*/
public class TestGame {
public static void main(String[] args) {
//8.進(jìn)行測(cè)試
Game.ROCK.show();//猜丁殼出的是石頭
Game.SCISSORS.show();//猜丁殼出的是剪刀
Game.PAPER.show();//猜丁殼出的是布
System.out.println(Game.ROCK.getName());//石頭
System.out.println(Game.ROCK.getNum());//0
}
}
//6.定義接口與接口中的抽象方法
interface Info{
void show();
}
//1.通過enum關(guān)鍵字定義枚舉類
enum Game implements Info{
//2.列出本類的枚舉對(duì)象
ROCK("石頭",0){
//7.2在每個(gè)枚舉對(duì)象后實(shí)現(xiàn)接口的抽象方法
public void show() {
System.out.println("猜丁殼出的是石頭");
}
},
SCISSORS("剪刀",2){
public void show() {
System.out.println("猜丁殼出的是剪刀");
}
},
PAPER("布",5){
public void show() {
System.out.println("猜丁殼出的是布");
}
};
//3.定義本類的屬性
private final String name;
private final int num;
//4.創(chuàng)建本類的構(gòu)造函數(shù)
private Game(String name,int num){
this.name = name;
this.num = num;
}
//5.生成屬性對(duì)應(yīng)的get()
public String getName() {
return name;
}
public int getNum() {
return num;
}
//7.1枚舉實(shí)現(xiàn)接口抽象方法,方案一
// @Override
// public void show() {
// System.out.println("猜丁殼游戲~");
// }
}
6 Enum類的主要方法
String name() 返回此枚舉常量的名稱,在其枚舉聲明中對(duì)其進(jìn)行聲明
int ordinal() 返回枚舉常量的序數(shù)(它在枚舉聲明中的位置