枚舉是特殊的類,枚舉能實現的類都能實現,但是,某些場景枚舉更方便。博主將以class和enum對比的方式展示枚舉的特性
Talk is cheap. Show me the code
首先,我們定義一個枚舉enum
enum Season1{
SPRING,//枚舉常量之間用逗號隔開
SUMMER("夏天"),
AUTUMN,
WINTER("冬天");//最後一個枚舉常量後寫分號
String name;
public String getName(){
return name;
}
Season1(){}//此處默認構造方法爲私有的(自動添加上了private)(無參構造)
Season1(String name){//此處默認構造方法爲私有的(自動添加上了private)(有參構造)
this.name = name;
}
}
然後,再用類class實現相同的定義
class Season2{
public static final Season2 SPRING = new Season2();
public static final Season2 SUMMER = new Season2("夏天");
public static final Season2 AUTUMN = new Season2("秋天");
public static final Season2 WINTER = new Season2("冬天");
String name;
private Season2(String name){this.name = name;}
private Season2(){}
public String getName(){
return name;
}
}
這裏再展示一下枚舉的高級特性
enum Operator{
//匿名內部類
ADD{
public double calculate(double a ,double b){return a+b;}
},
SUBTRACT{
public double calculate(double a ,double b){return a-b;}
},
MULTIPLY{
public double calculate(double a ,double b){return a*b;}
},
DIVIDE{
public double calculate(double a ,double b){return a/b;}
};
/**
* 因爲枚舉的構造方法是私有的,所以枚舉類是不能有子類的,
* 所以枚舉嚴格上來說是不能定義抽象方法的,但是枚舉類允許
* 枚舉常量以匿名內部類的形式實現枚舉類中的抽象方法,所以枚舉
* 類中是能夠定義抽象方法的(他是一種特例和放寬)
* 但當定義抽象方法時,枚舉類中的所有枚舉常量都必須實現這個
* 抽象方法
*/
public abstract double calculate(double a ,double b);
}
最後使用一個demo操作一下上面的定義
package com.zaomianbao.demo;
/**
* @Description 枚舉demo
* @Author zaomianbao
* @Date 2019/1/28
**/
public class EnumDemo {
public static void main(String[] args) {
//下面4行展示class和enum達到了同一個效果
Season1 season1 = Season1.SPRING;//獲取枚舉類中的一個枚舉常量SPRING
Season2 season2 = Season2.SPRING;
String name = season1.name();//枚舉常量的名稱
String name2 = season2.getName();
//下面展示枚舉的常用方法
int ordinal = season1.ordinal();//枚舉常量的序號(枚舉常量在枚舉中是有順序的,從0開始)
Season1[] values = Season1.values();//靜態方法,返回該枚舉中的所有枚舉常量
for (Season1 s1 : values) {
System.out.println(s1);
}
//java對c語言的保留(%爲佔位符,s表示字符串,d表示整數)
System.out.printf("這個枚舉枚舉常量name爲%s,在枚舉中的位置爲%d",name,ordinal);
Operator[] os = Operator.values();
for (Operator operator : os) {
System.out.println(operator.calculate(5, 10));
}
}
}
注意:博主將以上代碼全部寫在一個類文件中,只有將EnumDemo聲明成public,結構如下.
package com.zaomianbao.demo;
/**
* @Description 枚舉demo
* @Author zaomianbao
* @Date 2019/1/28
**/
public class EnumDemo {
}
enum Season1{
}
class Season2{
}
enum Operator{
}
總結
枚舉基本特性就是這些,另外,枚舉是實現單例的最簡便的方式。