枚举常量初始化时会调用到构造函数,因为隐式语句就是 public static final Test A = new Test(); 而枚举常量本身的类型是public static final且它们一定会在枚举中的最前面,优先级不比本例中的 i 低,所以应该会按照顺序来初始化。
用一个普通类来模拟下从而证明这个结论的话,就是:
class Enum{
public static final Enum A = new Enum();
public static final Enum B = new Enum();
public static int i = 3;
Enum(){
System.out.println(i);
}
}
class Test{
public static void main(String[] args){
new Enum();
}
}
复制代码
打印的结果是 0 0 3 。
但如果把public static int i = 3;放到第一行时,结果又会变为3 3 3。但在枚举中,这是不允许的。
但在普通类中,还可以访问到尚未显式初始化的i。枚举中却不可以。所以,枚举和普通类在内存加载上还是存在着差别。这样,楼上兄台的猜想“我怀疑枚举的构造函数先于或者同时和静态的属性i出现在内存中”应该是成立的。只是,先于静态属性i的可能性大些。如果说是同时,应该和类一样,至少可以访问默认初始化的i。