加载 -- 链接 -- 初始化
一、加载完成的事情:
- 通过类的全限定名获取定义此类的二进制字节流
- 将字节码文件加载到方法区中
- 创建在堆中类对象,作为方法区该类的访问入口
二、链接完成的事情:
验证 -- 准备 -- 解析
- 验证
- 它的目的是保证加载的字节码是合法、合理并符合规范的。
- 准备
- 为静态变量分配内存,并初始化默认值
- final static 修饰的变量在编译阶段就已经放到使用类的常量池中(字节码文件)
- 解析
- 将常量池的符号引用解析为直接引用
- 符号引用[java]JVM之运行时常量池里到底有什么 - 简书 (jianshu.com)
- 将Java代码编译成Class文件后,Class文件并不会保存方法、字段等在内存中的布局。为了解决这个问题,Class文件会在常量池内保存方法、字段等的符号引用。所谓符号引用,我们可以简单的理解为真正内存布局的占位符,在类加载过程的解析阶段,符号引用会被替换为真正的直接引用。
- 将常量池中的符号引用替换为直接引用,主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符等7类符号引用
三、初始化完成的事情:
- 为 static 修饰的变量初始化赋值
- 静态变量直接赋值和静态代码块会被合并成一个 方法,在初始化时被调用
- 初始化是懒惰执行
final static c = 1;
Student.c
上述语句并不会进行Student类加载,因为final修饰的变量,
在一个编译时候会将该final变量直接复制到使用类中或者到使用类的常量池中,
所以不会触发拥有者的类加载。