枚举类型到底是什么类呢?是enum吗?明显不是,enum就和class一样,只是一个关键字,他并不是一个类,那么枚举是由什么类维护的呢,首先写一个简单的枚举
publicenumT {
APPLE,BANANA,ORANGE;
}
使用反编译查看源码:
publicfinalclass T extends Enum
{
private T(String s, int i)
{
super(s, i);
}
publicstatic T[] values()
{
T at[];
int i;
T at1[];
System.arraycopy(at = ENUM$VALUES, 0, at1 = newT[i = at.length], 0, i);
return at1;
}
public static T valueOf(String s)
{
return (T)Enum.valueOf(demo/T, s);
}
publicstaticfinal T APPLE;
publicstaticfinal T BANANA;
publicstaticfinal T ORANGE;
privatestaticfinal T ENUM$VALUES[];
static
{
APPLE = newT("APPLE", 0);
BANANA = newT("BANANA", 1);
ORANGE = newT("ORANGE", 2);
ENUM$VALUES = (newT[] {
APPLE, BANANA, ORANGE
});
}
}
通过反编译后代码我们可以看到,public final class T extends Enum,说明,该类是继承了Enum类的,同时final关键字告诉我们,这个类也是不能被继承的。当我们使用enmu来定义一个枚举类型的时候,编译器会自动帮我们创建一个final类型的类继承Enum类,所以枚举类型不能被继承,我们看到这个类中有几个属性和方法。
其中
publicstaticfinal T APPLE;
publicstaticfinal T BANANA;
publicstaticfinal T ORANGE;
privatestaticfinal T ENUM$VALUES[];
static
{
APPLE = newT("APPLE", 0);
BANANA = newT("BANANA", 1);
ORANGE = newT("ORANGE", 2);
ENUM$VALUES = (new T[] {
APPLE, BANANA, ORANGE
});
}
都是static类型的,因为static类型的属性会在类被加载之后被初始化,当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的。所以,创建一个enum类型是线程安全的。