public enum myEnum {
VAL1(10), VAL2(20), VAL3("hai") {
public Object getValue() {
return this.strVal;
}
public String showMsg() {
return "This is your msg!";
}
};
String strVal;
Integer intVal;
public Object getValue() {
return this.intVal;
}
private myEnum(int i) {
this.intVal = new Integer(i);
}
private myEnum(String str) {
this.strVal = str;
}
}
在上面的枚举中,当我为VAL3添加一个常量特定的类体时,究竟会发生什么?
VAL3的类型绝对是myEnum的子类型,因为它有重载和其他方法。 (班级类型为'myEnum $ 1')
但是编译器如何创建一个扩展myEnum的子类型枚举,因为所有的枚举都已经扩展了java.lang.enum?
答案 0 :(得分:5)
您的类myEnum继承自java.lang.Enum。 VAL3是一个匿名内部类,它继承自myEnum,名为myEnum $ 1。将enum关键字视为合成糖。它为您设置具有普通继承树的类,但不允许您直接扩展java.lang.Enum或myEnum。
答案 1 :(得分:0)
来自反编译器
package com.sun.tools.xjc.outline;
public final class Aspect extends Enum
{
public static final Aspect EXPOSED;
public static final Aspect IMPLEMENTATION;
private static final Aspect $VALUES[];
static
{
EXPOSED = new Aspect("EXPOSED", 0);
IMPLEMENTATION = new Aspect("IMPLEMENTATION", 1);
$VALUES = (new Aspect[] {
EXPOSED, IMPLEMENTATION
});
}
public static final Aspect[] values()
{
return (Aspect[])$VALUES.clone();
}
public static Aspect valueOf(String name)
{
Aspect arr$[] = $VALUES;
int len$ = arr$.length;
for(int i$ = 0; i$ < len$; i$++)
{
Aspect aspect = arr$[i$];
if(aspect.name().equals(name))
return aspect;
}
throw new IllegalArgumentException(name);
}
private Aspect(String s, int i)
{
super(s, i);
}
}