public class MyTest6 {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println("counter1: " + Singleton.counter1);
System.out.println("counter2: " + Singleton.counter2);
}
}
class Singleton {
public static int counter1 = 1;
private static Singleton singleton = new Singleton();
public Singleton() {
counter1++;
counter2++;//准备阶段的重要意义
System.out.println(counter1);
System.out.println(counter2);
}
public static int counter2 = 0;
public static Singleton getInstance() {
return singleton;
}
}
Singleton.getInstance() 调用此静态方法,表示对这个类的主动使用, 在主动使用这个类的初始化之前,有个准备阶段是给这个类的成员变量赋初始值(非用户指定,如int 赋值0, singleton赋值null), 上例子构造方法在准备阶段是没有执行的.
在准备阶段完成后,开始初始化时, counter1值被赋值为1, Singleton singleton = new Singleton();此时singleton被赋值的不是null,而是Singleton实例,此时Singleton()构造方法会执行, 此时 counter1++, counter2++ 中的变量值是已经初始化后的值, 构造方法中 System.out.println(counter1) 输出的值为2,
System.out.println(counter2)输出的值为1, 当初始化往后执行时, counter2再次被赋值为0,最终程序输入结果如下:
2
1
counter1: 2
counter2: 0
网友评论