一个Case
public class Singleton {
private Singleton() {
}
private static class LazyHolder {
static final Singleton INSTANCE = new Singleton();
static final int i = 10;
static {
System.out.println("LazyHolder.");
System.out.println(i);
}
}
public static Object getInstance(boolean flag) {
if (flag) return new LazyHolder[2];
return LazyHolder.INSTANCE;
}
public static void main(String[] args) {
getInstance(true);
System.out.println("----");
getInstance(false);
}
}
问题 1:新建数组(第 16行)会导致 LazyHolder 的加载吗?会导致它的初始化吗?不会
问题 2:新建数组会导致 LazyHolder 的链接吗? 不会
解读:
- 新建数组会加载元素类LazyHolder;不会初始化元素类
- 新建数组不会链接元素类LazyHolder;在getInstance(false)时才真正链接和初始化
1.虚拟机必须知道(加载)有这个类,才能创建这个类的数组(容器),但是这个类并没有被使用到(没有达到初始化的条件),所以不会初始化。2.新建数组的时候并不是要使用这个类(只是定义了放这个类的容器),所以不会被链接,调用getInstance(false)的时候约等于告诉虚拟机,我要使用这个类了,你把这个类造好(链接),然后把static修饰的字符赋予变量(初始化)。