枚举是一个“数据集”,这个数据集中的数值是稳定,并且有限的。
比如,“四季”这个数据集中,有四个元素---春、夏、秋、冬。
“星期”这个数据集中,有七个元素---“星期一”至“星期日”。
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