枚举使用详解
http://www.cnblogs.com/hyl8218/p/5088287.html
Java源码分析--Enum
http://blog.csdn.net/qiuchengjia/article/details/52910948
/**
* @author hollis
*/
public final class Color extends Enum<Color> {
public static final Color[] values() { return (Color[])$VALUES.clone(); }
public static Color valueOf(String name) { ... }
private Color(String s, int i) { super(s, i); }
public static final Color RED;
public static final Color BLUE;
public static final Color GREEN;
private static final Color $VALUES[];
static {
RED = new Color("RED", 0);
BLUE = new Color("BLUE", 1);
GREEN = new Color("GREEN", 2);
$VALUES = (new Color[] { RED, BLUE, GREEN });
}
}
public static void main(String[] args) { Color blue = Color.blue; } enum Color { red,blue; Color() { System.out.println("无参构造"); } }
控制台输出:
无参构造
无参构造
疑问????? 枚举类什么时候调用Color类的无参构造方法
2017年10月30日21:14:21添加
public final class com.edu.zql.Color extends java.lang.Enum{
public static final com.edu.zql.Color red;
public static final com.edu.zql.Color blue;
public static com.edu.zql.Color[] values();
Code:
0: getstatic #1; //Field $VALUES:[Lcom/edu/zql/Color;
3: invokevirtual #2; //Method "[Lcom/edu/zql/Color;".clone:()Ljava/lang/Object;
6: checkcast #3; //class "[Lcom/edu/zql/Color;"
9: areturn
public static com.edu.zql.Color valueOf(java.lang.String);
Code:
0: ldc_w #4; //class com/edu/zql/Color
3: aload_0
4: invokestatic #5; //Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
7: checkcast #4; //class com/edu/zql/Color
10: areturn
static {};
Code:
0: new #4; //class com/edu/zql/Color
3: dup
4: ldc #10; //String red
6: iconst_0
7: ldc #11; //String 123
9: invokespecial #12; //Method "<init>":(Ljava/lang/String;ILjava/lang/String;)V ****
12: putstatic #13; //Field red:Lcom/edu/zql/Color;
15: new #4; //class com/edu/zql/Color
18: dup
19: ldc #14; //String blue
21: iconst_1
22: invokespecial #15; //Method "<init>":(Ljava/lang/String;I)V
25: putstatic #16; //Field blue:Lcom/edu/zql/Color;
28: iconst_2
29: anewarray #4; //class com/edu/zql/Color
32: dup
33: iconst_0
34: getstatic #13; //Field red:Lcom/edu/zql/Color;
37: aastore
38: dup
39: iconst_1
40: getstatic #16; //Field blue:Lcom/edu/zql/Color;
43: aastore
44: putstatic #1; //Field $VALUES:[Lcom/edu/zql/Color;
47: return
}
****标记的地方或许可以解释为什么会调用Color中声明的无参构造
以下是个人的理解:编译器在编译enum时,会将在enum中声明的所有构造方法中的参数前添加两个参数(String,int) 构造方法中都先调用super(string, i)
枚举类不能实例化的原因
java.lang.reflect.Constructor