您的位置:首页 > 其它

枚举详解 自定义方法 EnumSet,EnumMap 的应用

2017-08-17 00:00 686 查看

枚举使用详解

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.C
7fe0
onstructor

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: