如下图所示,Java的类加载机制主要分为三个部分,分别为加载、链接、初始化。其中链接又分为三个小部分——验证、准备、解析。
- **加载**——在经过对Java代码进行编译后,JVM将Java类编译后的二进制文件即字节码文件以二进制的形式加载到内存放中,以便后面的步骤进行,如果没有找到指定的类,就会抛出错误,进程到这里也就结束了。 - **验证**——验证即验证Java加载进内存的二进制文件是否符合JVM以及Java规范,并且不会危害虚拟机的自身安全。比如说符号引用中的类、字段、方法的访问性(private、protected、public、default)是否可被当前类访问、类中的字段、方法是否与父类产生矛盾…… - **准备**——准备阶段是指准备要执行的制定的类,这包含了给这个类的静态变量和其他数据分配内存空间(**仅仅是分配内存空间,具体初始化在最后一步**)。 - **解析**——解析阶段是指检查指定的类是否引用了其他的类、接口,然后**对于这些内容递归的进行以上加载、验证、准备三个步骤**。 - **初始化**——在这最后一步中,JVM用赋值或者缺省值将静态变量进行初始化,并执行静态初始化程序(static块中的代码),初始化发生在执行main方法之前,但在指定的类初始化之前他的父类必须先初始化,若其父类仍然存在父类,那也需递归的初始化。 例如,如果一个类中包含声明`public static int a=5;`那么变量a被赋值为5的过程将在**初始化**阶段进行,另外倘若静态变量并没有指定初值,那么JVM会自动给静态变量赋予一个初值,下表给出Java基本类型和引用变量的缺省值。
类型 | 默认值 | 类型 | 默认值 | 类型 | 默认值 |
---|---|---|---|---|---|
boolean | false | int | 0 | float | 0.0f |
byte | 0 | long | 0L | double | 0.0d |
short | 0 | char | \u0000 | object reference | null |
参考资料: Java编程指南 http://www.importnew.com/25295.html