18.1.3 类的连接
当类被加载之后,系统为之生成一个对应的Class
对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE
中。类连接又可分为如下三个阶段。
验证
:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致。准备
:类准备阶段则负责为类的类变量分配内存,并设置默认初始值
。解析
:将类的二进制数据中的符号引用替换成直接引用。
18.1.4 类的初始化
在类的初始化阶段,虚拟机负责对类进行初始化,主要就是对类变量进行初始化。在Java
类中对类变量指定初始值有两种方式:
①声明类变量时指定初始值;
②使用静态初始化块为类变量指定初始值。
例如下面代码片段。
1 | public calss Test |
对于上面代码,程序为类变量a、b都显式指定了初始值,所以这两个类变量的值分别为5、6,但类变量c则没有指定初始值,它将采用默认初始值0。
静态初始化块都将被当成类的初始化语句,JVM
会按这些语句在程序中的排列顺序依次执行它们.
JVM
初始化一个类包含如下几个步骤。
- 1.假如这个类还没有被加载和连接,则程序先加载并连接该类
- 2.假如该类的直接父类还没有被初始化,则先初始化其直接父类。
- 3.度如类中有初始化语句,则系统依次执行这些初始化语句。
当执行第2个步骤时,系统对直接父类的初始化步骤也遵循此步骤1到3;如果该直接父类又有直接父类,则系统再次重复这三个步骤来先初始化这个父类……依此类推,
所以JVM
最先初始化的总是java.langObject
类。当程序主动使用任何一个类时,系统会保证该类以及所有父类(包括直接父类和间接父类)都会被初始化。
原文链接: 18.1.3 类的连接 18.1.4 类的初始化