一个完整的类加载过程主要包括以下几个阶段:加载->验证->准备->解析->初始化。
加载阶段是通过类的全类名,然后通过类加载器将class文件的二进制字节流转化成运行时数据区的方法区中。
并且在内存中,会生成一个java.lang.Class对象,作为这个类的各种数据的访问入口。
验证阶段是检验字节码class文件中的字节码是否符合规范,增加里面的字节码不会损害JVM本身。
准备阶段是为类中的类变量(static修饰的变量,但没有被final修饰一起修饰)分配内存和初始化类变量的零值,这里不包括实例变量,实例变量是在对象一起分配在Java堆中。
所谓的零值也就是数据的默认初始值,比如int为0,boolean默认为false,float默认为0.0f,引用类型的默认为null。
解析阶段的作用是将虚拟机内的常量池的符号引用替换为直接引用的过程。
所谓的符号引用可以是任何形式的字面量,只要能定位到目标即可;而直接引用可以是指向目标的指针、对偏移量间接定位到目标的句柄。
较后是初始化,初始化是类加载的较后一个阶段,也是在这个阶段,Java虚拟机才真正开始执行类中的Java程序代码。
前面提到,在准备阶段变量已被初始化一次零值了,则在此阶段将变量初始化为程序代码中主观设置的值。