zoukankan      html  css  js  c++  java
  • 类加载机制导致静态变量出错问题

    先看代码:

     1 public class Test {
     2     public static void main(String[] args) {
     3         Singleton singleton = Singleton.getInstance();
     4         System.out.println("i1:" + Singleton.i1);
     5         System.out.println("i2:" + Singleton.i2);
     6     }
     7 }
     8 
     9 class Singleton {
    10 
    11     public static int i1;
    12 
    13     private static Singleton singleton = new Singleton();
    14 
    15     private Singleton() {
    16         i1++;
    17         i2++;
    18     }
    19 
    20     public static int i2 = 0;
    21 
    22     public static Singleton getInstance() {
    23         return singleton;
    24     }
    25 
    26 }

    运行结果是

    i1:1
    i2:0
    
    Process finished with exit code 0


    代码分析:

    整个执行过程,分为加载、链接、初始化,主要分析链接和初始化阶段代码的逻辑

    1.链接阶段:会为类的静态变量分配内存,并且将其初始化为 默认值,在这里,Singleton类的执行流程是

    a.为i1分配内存,并且初始化为默认值0

    b.为singleton分配内存,并且初始化为null

    c.为i2分配每次,并且初始化为默认值0

    2.初始化阶段,由于执行了Singleton.getInstance()方法,是对Singleton类的主动调用,会进行Singleton类的初始化(初始化会做的事情:为类的静态成员变量赋予正确的初始值)的过程为:

    a.i1置为初始值,这里i1没有主动赋值,跳过

    b.singleton置为初始值,这里是new一个对象,并且,这时候对象的i1为主动赋值之后的值(0),i2是分配的默认值(0),进行自增操作以后,i1=1 i2=1

    c.i2置为初始值,这里是0,所以,到这里 i1=1 i2=0

  • 相关阅读:
    html5对分辨率和设备的嗅探方法
    给前端苦手的同学们一点建议——前端之所以难学,可能的原因
    css3学习笔记
    关于viewport的一些问题
    js通过as完成socket通信
    【数学】数论常识
    AbstractFactory 模式
    State 模式
    Strategy 模式
    error LNK2001
  • 原文地址:https://www.cnblogs.com/billmiao/p/9872214.html
Copyright © 2011-2022 走看看