先看代码:
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