9
public enum A {
     A(1);

     private A(int i){
     }

     private A(){
         super(); // compile - error
             // Cannot invoke super constructor from enum constructor A()
     }

}

这是enum Aextends from abstract java.lang.Enumextends的层次结构java.lang.Object

Class c = Class.forName("/*path*/.A");
System.out.println(c.getSuperclass().getName());
System.out.println(Modifier.toString(c.getSuperclass().getModifiers()).contains("abstract"));
System.out.println(c.getSuperclass().getSuperclass().getName());
4

4 回答 4

9

枚举在编译器和运行时级别暗示了很多魔法,以保证 == 比较始终有效:

尝试显式实例化枚举类型(第 15.9.1 节)是编译时错误。Enum 中的 final clone 方法确保了枚举常量永远不会被克隆,而序列化机制的特殊处理确保了不会因为反序列化而创建重复的实例。禁止枚举类型的反射实例化。这四件事一起确保枚举类型的实例不存在超出枚举常量定义的实例。

Java 语言规范第 8.9 节

没有无参数的 Enum() 构造函数,只有 Enum(String name, int ordinal)。但是允许用错误的参数调用那个显然会造成麻烦。

于 2010-12-24T08:32:52.090 回答
7

来自枚举的Java 教程:

所有枚举都隐式扩展 java.lang.Enum。由于 Java 不支持多重继承,因此枚举不能扩展其他任何东西。

您不能调用super()构造函数,因为编译器会自动将隐藏调用插入super(name, ordinal)到您定义的任何构造函数中。

于 2010-12-24T08:28:05.383 回答
1

事实上,您不能将 an 声明enum为扩展另一个类。因此,只有一个可能的super构造函数enum

我想,因为除了super()他们认为根本不值得superenum构造函数中使用之外,你不能链接到任何东西。

无论哪种方式,您都不会失去任何东西。

于 2010-12-24T08:21:53.947 回答
1

因为没有 super() 构造函数,请参阅 dogbane 的答案,并且因为编译器会自动插入所需的 super(...) 调用,同上。

为什么这是个问题?

于 2010-12-24T09:48:09.090 回答