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

  • 相关阅读:
    eclipse 中配置maven环境
    洛谷 P5015 标题统计
    洛谷 P1228 【地毯填补问题】
    洛谷 P3328 【[SDOI2015]音质检测】
    OJ 大整数减法
    NOIP 2018数据点
    NOIP 2017 图书管理员
    NOIP 成绩
    洛谷P1001 A+B Problem
    洛谷P1000 超级玛丽游戏
  • 原文地址:https://www.cnblogs.com/billmiao/p/9872214.html
Copyright © 2011-2022 走看看