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

枚举使用详解

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

175908_NIhQ_3132303.png

转载于:https://my.oschina.net/zhuqianli/blog/1512395

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值