1.(类的验证)类被加载后,就进入连接阶段。就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。
类验证的内容
(1)类文件的结构检查
确保类文件遵从java类文件的固定格式
(2)语义检查
确保类本身符合java语言的语法规定,如验证final类型的类有没有子类,以及final类型的方法有没有被覆盖
(3)字节码验证
确保字节码流可以被java虚拟机安全的执行,字节码流代表java方法(包括静态方法和实例方法),它是由被称为操作码的单字节指令组成的序列,每个操作码后都跟着一个或者多个操作数。字节码验证步骤会检查每个操作码是否合法,即是否有着合法的操作数
(4)二进制兼容性的验证
确保相互引用的类之间的协调一致
2.(类的准备)在准备阶段,虚拟机为类的静态变量分配内存,并设置默认的初始值。例如如下代码
public static int a=4; public static long b=5; static { b=8; }
在准备阶段的int类型的静态变量分配4个字节内存空间,并赋予默认值0,为long类型的静态变量分配8个字节内存空间,并赋予默认值0
3.(类的解析阶段)虚拟机会把类的二进制数据中的符号引用替换为直接引用。如car类中的run方法会引用stop方法
public class car{ public static void run(){ } public void stop(){ Test2.run(); } }
4.(类的初始化)虚拟机执行类的初始化语句,为类的静态变量赋予初始值,在程序中,静态变量的初始化由两种途径:
(1)在静态变量的声明处进行初始化
(2)在静态代码块中进行初始化,例如静态变量a和b都被显示初始化,而静态变量c没有被显示初始化,它将保持默认值0
public static int a=4; public static long b; public static long c; static { b=8; }