类加载机制导致静态变量出错问题

it2025-11-03  11

先看代码:

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

 

转载于:https://www.cnblogs.com/billmiao/p/9872214.html

最新回复(0)