深度剖析类加载器系列文章:一、Java类的加载、链接、初始化

时间:2023-01-02 17:51:32

深度剖析类加载器系类文章:一、Java类的加载、链接、初始化

1.先上一段代码,分析控制台输出的结果

package com.wzm;

public class Test1 {
/**
* @ClassName: Test1
* @Description:
* @author nameisbill
* @date 2017年1月18日 下午2:01:55
*
*/
public static void main(String[] args) {

System.out.println(Singleton.count1);
System.out.println(Singleton.count2);
}
}
class Singleton{
private static Singleton singleton=new Singleton();
public static int count1;
public static int count2=0;
private Singleton() {
count1++;
count2++;
}
public static Singleton getInstance(){
return singleton;
}
}

上面一段代码控制台输出的结果是:1、0
如果我们理解Java的类加载过程,我们就会理解为什么上一段代码的输出结果是:1、0
下面就开始介绍Java的类加载过程

2.Java类的加载、链接、初始化

1. 加载:查找并加载类的字节码文件

2. 链接

a.验证:确保被加载类的正确性
b.准备:为类的静态变量分配类存,并执行隐式初始化(有虚拟机把静态变量初始化为其默认值)
c.解析:把类的符号引用转换为直接引用

3. 初始化:为类的变量赋予正确的初始值。(执行静态变量的赋值语句、静态代码块)

上面就是Java类的加载过程,知道了类的加载过程,我们就能分析为什么上面一段代码的输出结果是:1、0
分析:
准备阶段:singleton=null;count1=0;count2=0;
初始化阶段:执行singleton=new Singleton();这时count1=1,count2=1;
执行count2=0;这时count2又变为0;所以最终的输出结果为:1、0