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

 

 private static SingleTon singleTon = new SingleTon();  这句代码再static int ...之前只影响未被赋值的变量,在static int...之后,全部影响

原因:实例的初始化流程

1.类被加载的时候,普通方法加载到方法区,静态方法和静态字段加载到方法区中的静态区

2.首先静态字段会进行默认初始化。即 singTon=null       count1=0        count2=0

3.然后静态字段会进行显示初始化。问题就出现这里(这里就是影响结果的地方)

4(第一个例子先执行4).首先 singTon 进行显示初始化 它会创建 实例,调用构造函数,执行完成以后 

5(第二个例子先执行5).然后才是静态变量 count1和count2进行显示初始化

6.然后执行静态代码块中的内容,此处没有静态代码块。

posted @ 2019-07-29 14:51  何浩源  阅读(5598)  评论(0编辑  收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中