目录
1. 加载
二进制流中的信息转换为内存中类的二进制数据结构,存储在方法区,形成java.long.Class的一个实例。
2. 链接
2.1. 验证
这个阶段JVM会对字节码文件进行检查。如果没有通过这个阶段,JVM不会正确装载这个类,如果通过了这个阶段的检查,也不能说明这个类是完全正确的。
2.2. 准备
这个阶段分为一下几种情况。
第一种情况是被static修饰但是不被final修饰的变量,这个阶段会进行初始化,并赋予该变量类型的默认值。
第二种情况是被static final修饰的并且显示赋值的变量,被final关键字修饰的变量在编译期间就会进行分配,在这个阶段是被显示的进行初始化,将显示赋予的值给该变量。
第三章情况是被static final修饰,但是并未进行显示赋值的变量,赋值语句可能需要执行某一些方法得到的值赋予该变量,那么在这个阶段是和第一种情况是一样的。
2.3. 解析
符号引用变为直接引用
什么是符号引用?
这应该很清楚了,就是用符号代表常量池中的常量,然后去引用这个符号。
什么是直接引用?
个人理解就是内存地址。
3. 初始化
赋予显示给定的值。
什么是主动使用?
主动使用就是主动加载类,并完成类的加载过程。比如反射的class.forName(全类名)。
什么是被动使用?
被动使用不会引起类的初始化,并不是在代码中出现的类,就一定会被加载或者初始化。比如说当通过子类引用父类的静态变量,就不会导致子类初始化。