在java中,这样的枚举类型编译成什么?

下面是定义枚举类型的代码。

enum Company{ EBAY(30), PAYPAL(10), GOOGLE(15), YAHOO(20), ATT(25); private int value; private Company(int value){ super(this.name()); this.value = value; } public int getValue(){ return value; } } 

内部编译到,

 final class Company extends Enum{ public final static Company EBAY = new Company(30); public final static Company PAYPAL = new Company(10); public final static Company GOOGLE = new Company(15); public final static Company YAHOO = new Company(20); public final static Company ATT = new Company(25); private int value; private Company(int value){ super(this.name(),Enum.valueOf(Company.class, this.name())); this.value = value; } public int getValue(){ return value; } } 

我的理解是否正确?

function上,是的。 字面上没有(你不能明确地将Enum子类Enum一件事)。 enum(s)有一个toString 。 并且你的enum不是有效的代码(你不能调用super() )和getValue需要一个返回类型。

 enum Company{ EBAY(30), PAYPAL(10), GOOGLE(15), YAHOO(20), ATT(25); private int value; private Company(int value){ this.value = value; } public int getValue(){ return value; } } 

几乎,你的第二个片段确实代表了编译器内部生成的内容(字节码),但它并不完全相同。

已编译的枚举将包含ACC_ENUM标志,该标志指示此类或其超类被声明为枚举类型,并且将由JVM对其进行处理。

你的第二个片段不会(假设它会编译)在字节码中包含这个标志:


ENUM

 final class Company extends java.lang.Enum minor version: 0 major version: 52 flags: ACC_FINAL, ACC_SUPER, ACC_ENUM 

 final class Company minor version: 0 major version: 52 flags: ACC_FINAL, ACC_SUPER 

至于你的其余逻辑(仍然认为它会编译),这是正确的。 在内部,枚举将表示为扩展java.lang.Enumfinal类。 但是,请注意,您无法直接扩展java.lang.Enum因为这些内容在创建枚举时由编译器完成,如果您尝试自己编译,则会导致编译错误。

如果删除对super调用是非法的,而this.name作为参数也是非法的,编译它并在类上运行javap,这是输出:

 $ /usr/lib/jvm/java-7-oracle/bin/javap -p Company.class Compiled from "Company.java" final class Company extends java.lang.Enum { public static final Company EBAY; public static final Company PAYPAL; public static final Company GOOGLE; public static final Company YAHOO; public static final Company ATT; private int value; private static final Company[] $VALUES; public static Company[] values(); public static Company valueOf(java.lang.String); private Company(int); public int getValue(); static {}; } 

这是静态的字节码,部分是静态的

 static {}; flags: ACC_STATIC LineNumberTable: line 2: 0 line 1: 75 Code: stack=5, locals=0, args_size=0 0: new #4 // class Company 3: dup 4: ldc #8 // String EBAY 6: iconst_0 7: bipush 30 9: invokespecial #9 // Method "":(Ljava/lang/String;II)V 12: putstatic #10 // Field EBAY:LCompany;