关于java主动引用时,static部分的问题
class SingleTon {
private static SingleTon singleTon = new SingleTon();
public static int count1;
public static int count2 = 0;
public int count3 = 0;
private SingleTon() {
count1++;
count2++;
count3++;
}
public static SingleTon getInstance() {
return singleTon;
}
}
public class TestClassLoader {
public static void main(String[] args) {
SingleTon singleTon = SingleTon.getInstance();
System.out.println("count1=" + singleTon.count1);
System.out.println("count2=" + singleTon.count2);
System.out.println("count3=" + singleTon.count3);
}
}
运行结果是:
count1=1
count2=0
count3=1
答案的分析是:
1:SingleTon singleTon = SingleTon.getInstance();调用了类的SingleTon调用了类的静态方法,触发类的初始化
2:类加载的时候在准备过程中为类的静态变量分配内存并初始化默认值 singleton=null count1=0,count2=0
3:类初始化化,为类的静态变量赋值和执行静态代码快。singleton赋值为new SingleTon()调用类的构造方法
4:调用类的构造方法后count=1;count2=1
5:继续为count1与count2赋值,此时count1没有赋值操作,所有count1为1,但是count2执行赋值操作就变为0
在4,5之间有一个疑问,为什么在调用构造方法之后,又对static块进行了一次赋值?
一、类的主动引用是这样顺序:(1)static块"值"的初始化。(2)类的构造方法。(3)static块赋值?
二、类在主动引用时,static模块初始化了两次,且与类的实例化是异步完成的?