zoukankan      html  css  js  c++  java
  • 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.然后执行静态代码块中的内容,此处没有静态代码块。

  • 相关阅读:
    Docker 部署net5程序
    如何将Docker升级到最新版本
    IntelliJ IDEA修改maven默认仓库地址
    PowerDesigner 导出表结构 到Excel
    gradle加载项目过慢
    linux安装docker配置阿里云镜像
    svn 新建文件不能直接提交终于解决了
    Vs2017 NPM 安装 部署
    MYSQL日期时间字符串互转
    消除svn选定(checkout)桌面上文件显示一大堆问号。
  • 原文地址:https://www.cnblogs.com/hetaoyuan/p/11263840.html
Copyright © 2011-2022 走看看