创建一个枚举类:
public enum MyEnum {
A("AA"),B("BB"),C("CC");
String value;
MyEnum(String value) {
this.value = value;
}
}
编译之后,拿到字节码文件进行反编译:
public final class MyEnum extends Enum
{
public static final MyEnum A;
public static final MyEnum B;
public static final MyEnum C;
String value;
private static final MyEnum $VALUES[];
public static MyEnum[] values()
{
return (MyEnum[])$VALUES.clone();
}
public static MyEnum valueOf(String name)
{
return (MyEnum)Enum.valueOf(com/zq/provider/MyEnum, name);
}
private MyEnum(String s, int i, String value)
{
super(s, i);
this.value = value;
}
static
{
A = new MyEnum("A", 0, "AA");
B = new MyEnum("B", 1, "BB");
C = new MyEnum("C", 2, "CC");
$VALUES = (new MyEnum[] {
A, B, C
});
}
}
反编译之后,可以看到:
- 我们创建的枚举类是继承Enum的final类
- 枚举类中声明的枚举值其实就是该枚举类的静态常量引用,并会声明一个静态常量的引用数组。枚举值是public,而引用数组为private。
- 静态代码块中对枚举值和引用数组初始化,构造函数默认就有两个参数,默认参数为枚举变量名,数值(1,2,3),调用super方法,给父类构造函数初始化,我们给的枚举值则是第三个参数。
private MyEnum(String s, int i, String value)
{
super(s, i);
this.value = value;
}
- 自动生成两个公共静态方法values和valueOf