理解枚举类型
枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据结构,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束。
枚举的定义
package t6;
// 定义枚举类型
enum Day{
MONDAY, TUESDAY, WEDNEDAT,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class Run {
public static void main(String[] args) throws InterruptedException {
// 直接引用
Day day = Day.MONDAY;
}
}
枚举实现原理
实际上在使用enum创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了Java API中的java.lang.Enum类,也就是说通过关键字enum创建枚举类型在编译后事实上也是一个类类型,而且该类继承自java.lang.Enum类。
用javac编译前面的Run.java文件后,分别生成Day.class和Run.class文件。Day.class就是枚举类型。
反编译Day.class文件:
//反编译Day.class
final class Day extends Enum
{
//编译器为我们添加的静态的values()方法
public static Day[] values()
{
return (Day[])$VALUES.clone();
}
//编译器为我们添加的静态的valueOf()方法,注意间接调用了Enum也类的valueOf方法
public static Day valueOf(String s)
{
return (Day)Enum.valueOf(com/zejian/enumdemo/Day, s);
}
//私有构造函数
private Day(String s, int i)
{
super(s, i);
}
//前面定义的7种枚举实例
public static final Day MONDAY;
public static final Day TUESDAY;
public static final Day WEDNESDAY;
public static final Day THURSDAY;
public static final Day FRIDAY;
public static final Day SATURDAY;
public static final Day SUNDAY;
private static final Day $VALUES[];
static
{
//实例化枚举实例
MONDAY = new Day("MONDAY", 0);
TUESDAY = new Day("TUESDAY", 1);
WEDNESDAY = new Day("WEDNESDAY", 2);
THURSDAY = new Day("THURSDAY", 3);
FRIDAY = new Day("FRIDAY", 4);
SATURDAY = new Day("SATURDAY", 5);
SUNDAY = new Day("SUNDAY", 6);
$VALUES = (new Day[] {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
});
}
}
编译器确实帮助我们生成了一个Day类,该类是final类型的,无法被继承。而且该类继承自java.lang.Enum类,该类是一个抽象类。
该类包括:
- 将定义的几个枚举实例 实例化为该类的对象。
- 生成两个静态方法,分别是values()和valueOf()。
https://blog.csdn.net/javazejian/article/details/71333103
https://blog.csdn.net/testcs_dn/article/details/78604547