连接阶段分为三个字阶段:验证、准备、解析
一、验证。主要包含如下四部分,具体详见《Java虚拟机规范》:
1.文件格式验证,比如文件是否以0xCAFEBABE开头,主次版本号是否满足当前Java虚拟机版本要求。
2.元信息验证,例如类必须有父类(super不能为空)。
3.验证程序执行指令的语义,比如方法内的指令执行到一半强行跳转到其他方法中去。
4.符号引用验证,例如是否访问了其他类中private的方法等。
二、准备
1、为静态变量分配内存并分配初始值
虽然为静态变量value赋值1,但在准备阶段,并不会赋值为1,而是初始化为0;
准备阶段只会给静态变量赋初始值,而每一种基本数据类型和引用数据类型都有其初始值,不同数据类型对应的初始值如下:
final修饰的基本数据类型的静态变量,准备阶段直接会将代码中的值进行赋值。
三、解析阶段
解析阶段主要是将常量池中的符号引用替换为直接引用。字节码文件中使用编号来访问常量池中的内容, 将类加载入内存后,直接引用不在使用编号,而是使用内存中地址进行访问具体的数据。