0%

18.1.3 类的连接 18.1.4 类的初始化

18.1.3 类的连接

当类被加载之后,系统为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中。类连接又可分为如下三个阶段。

  • 验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致。
  • 准备:类准备阶段则负责为类的类变量分配内存,并设置默认初始值
  • 解析:将类的二进制数据中的符号引用替换成直接引用。

18.1.4 类的初始化

在类的初始化阶段,虚拟机负责对类进行初始化,主要就是对类变量进行初始化。在Java类中对类变量指定初始值有两种方式:
①声明类变量时指定初始值;
②使用静态初始化块为类变量指定初始值。
例如下面代码片段。

1
2
3
4
5
6
7
8
9
10
11
public calss Test
{
//声明变量a时指定初始值
static int a=5;
static int b;
static int c;
static{
//使用静态初始化块为变量b指定初始值
b=6;
}
}

对于上面代码,程序为类变量a、b都显式指定了初始值,所以这两个类变量的值分别为5、6,但类变量c则没有指定初始值,它将采用默认初始值0。
静态初始化块都将被当成类的初始化语句,JVM会按这些语句在程序中的排列顺序依次执行它们.

JVM初始化一个类包含如下几个步骤。

  • 1.假如这个类还没有被加载和连接,则程序先加载并连接该类
  • 2.假如该类的直接父类还没有被初始化,则先初始化其直接父类。
  • 3.度如类中有初始化语句,则系统依次执行这些初始化语句。

当执行第2个步骤时,系统对直接父类的初始化步骤也遵循此步骤1到3;如果该直接父类又有直接父类,则系统再次重复这三个步骤来先初始化这个父类……依此类推,

所以JVM最先初始化的总是java.langObject当程序主动使用任何一个类时,系统会保证该类以及所有父类(包括直接父类和间接父类)都会被初始化

原文链接: 18.1.3 类的连接 18.1.4 类的初始化