枚举是特殊的类,枚举能实现的类都能实现,但是,某些场景枚举更方便。博主将以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{
}
总结
枚举基本特性就是这些,另外,枚举是实现单例的最简便的方式。