Java静态变量初始化的坑
作者:互联网
class SingleTon { private static SingleTon singleTon = new SingleTon(); public static int count1; public static int count2 = 1; private SingleTon() { count1++; count2++; } public static SingleTon getInstance() { return singleTon; } } public class Test { public static void main(String[] args) { SingleTon singleTon = SingleTon.getInstance(); System.out.println("count1=" + singleTon.count1); System.out.println("count2=" + singleTon.count2); } }
执行结果:singTon.count1=1 singTon.count2=1
class SingleTon { public static int count1; public static int count2 = 1; private static SingleTon singleTon = new SingleTon(); private SingleTon() { count1++; count2++; } public static SingleTon getInstance() { return singleTon; } } public class Demo { public static void main(String[] args) { SingleTon singleTon = SingleTon.getInstance(); System.out.println("count1=" + singleTon.count1); System.out.println("count2=" + singleTon.count2); } }
执行结果:count1=1 count2=2
原因:实例的初始化流程
1.类被加载的时候,普通方法加载到方法区,静态方法和静态字段加载到方法区中的静态区
2.首先静态字段会进行默认初始化。即 singTon=null count1=0 count2=0
3.然后静态字段会进行显示初始化。问题就出现这里(这里就是影响结果的地方)
4(第一个例子先执行4).首先 singTon 进行显示初始化 它会创建 实例,调用构造函数,执行完成以后
5(第二个例子先执行5).然后才是静态变量 count1和count2进行显示初始化
6.然后执行静态代码块中的内容,此处没有静态代码块。
标签:初始化,SingleTon,Java,静态,singleTon,static,count1,count2,public 来源: https://www.cnblogs.com/hetaoyuan/p/11263840.html