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

  • 相关阅读:
    Servlet页面跳转实现方法的区别
    谈JSP与XML的交互
    xml可以用做什么?
    Struts1.2入门知识
    做java web 开发的简单项目必须具备的知识
    Web工程师必备的18款工具
    css的四种调用方式
    jQuery Utilities
    历年考研数学常考题型考试必备
    。net思维导图
  • 原文地址:https://www.cnblogs.com/hetaoyuan/p/11263840.html
Copyright © 2020-2023  润新知