这段代码:
public class Sandbox {
public enum E {
VALUE {
@Override
public String toString() {
return "I'm the value";
}
};
@Override
public String toString() {
return "I'm the enum";
}
}
public static void main(String[] args) {
System.out.println(E.VALUE);
}
}
印刷:
我是价值
但是,这段代码:
public class Sandbox {
public static final class C {
@Override
public String toString() {
return "I'm a C";
}
}
public static void main(String[] args) {
System.out.println(new C() {
@Override
public String toString() {
return "I'm anonymous";
}
});
}
}
导致编译错误:
cannot inherit from final HelloWorld.C
为什么可以E.VALUE
创建在我看来是匿名E
子类的东西,覆盖该toString
方法,而使用最终类而不是隐式最终枚举会引发编译时错误?
更具体地说,为什么可以VALUE
覆盖任何内容E
?我的印象是代码
public enum E {
VALUE;
}
大致相当于
public static final class E {
public static final E VALUE = new E();
}
在这种情况下,匿名性质是不允许的。
有什么不同?为什么枚举特别?