枚举是一个“数据集”,这个数据集中的数值是稳定,并且有限的。
比如,“四季”这个数据集中,有四个元素---春、夏、秋、冬。
“星期”这个数据集中,有七个元素---“星期一”至“星期日”。
Java中的枚举可以被看成是一个普通的类。因此,它可以拥有实例成员变量、静态成员变量、实例成员方法、静态成员方法。相较于类,枚举特殊的地方包括:
枚举值([参数列表])的方式,调用构造器。如果只提供了枚举值,那么相当于枚举值(),也就是需要枚举提供无参的构造器
枚举值([参数列表]){类体}形式的枚举值的时候,花括号中定义的匿名内部类继承自枚举,而枚举值则是这个匿名内部类的实例,在该匿名内部类中,需要实现枚举中定义的所有的抽象方法。同时,因为匿名内部类没有构造器,所以实际上会调用枚举的构造器
test.java:
enum ColorEnum {
red, green, blue;
}
enum SeasonEnum {
// 枚举值写在最前面否则编译报错
spring, summer, autumn, winter;
// 枚举可以像普通的类一样拥有实例成员方法
// 实例成员方法必须通过枚举值调用
// 静态成员方法可以通过枚举直接调用
public String getMonthRange() {
switch (this) {
case spring:
return "3-4-5";
case summer:
return "6-7-8";
case autumn:
return "9-10-11";
default:
return "12-1-2";
}
}
}
// 带有构造器的枚举
enum SexEnum {
// unkown会调用无参的构造器
male("male"), female("female"), unkown;
private String sex;
// 枚举的构造器必须是私有的
SexEnum() {
this.sex = "unkown";
}
SexEnum(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
}
// 带有抽象方法的枚举
enum SexEnum2 {
// male是花括号中定义的匿名内部类的对象
// 该匿名内部类继承自枚举,必须重写枚举中定义的所有抽象方法
male {public String getSex(){return "男性";}},
female {public String getSex(){return "女性";}},
unkown {public String getSex(){return "未知";}};
public abstract String getSex();
}
public class test {
public static void main(String[] args) throws Exception {
// 枚举是一种创建型的数据结构,可以创建枚举类型的变量。
// + 通过枚举,可以限制变量的取值范围。
ColorEnum color = ColorEnum.red;
// 使用枚举的valueOf方法可以将字符串转换成枚举值
ColorEnum red = ColorEnum.valueOf("red");
System.out.println(red == color); // true
// 使用枚举值的toString方法可以将枚举值转换成字符串
System.out.println("red".equals(red.toString())); // true
// 遍历枚举
for (ColorEnum colorEnum: ColorEnum.values())
System.out.println(colorEnum);
// 获取枚举中,枚举值的个数
System.out.println(ColorEnum.values().length); // 3
// 获取枚举值在枚举中的索引,索引默认从0开始
System.out.println(red.ordinal()); // 0
// 枚举实现了java.lang.Comparable接口
System.out.println(red.compareTo(ColorEnum.green)); // -1
// 调用枚举的实例成员方法
System.out.println(SeasonEnum.autumn.getMonthRange()); // 9-10-11
System.out.println(SexEnum.female.getSex()); // female
System.out.println(SexEnum2.male.getSex()); // 男性
}
}
编译:
[root@iZ23dastruaZ t]# javac test.java [root@iZ23dastruaZ t]# ls ColorEnum.class SeasonEnum.class SexEnum2$2.class SexEnum2.class test.class SeasonEnum$1.class SexEnum2$1.class SexEnum2$3.class SexEnum.class test.java