Java 讲讲类的实例化顺序
1. 流程概述
在 Java 中,当我们创建一个类的实例时,实际上会经历一系列的步骤。这些步骤包括加载类、链接类和初始化类等过程。我们来看一下整个流程的步骤表:
步骤 | 描述 |
---|---|
加载类 | 将类的字节码文件加载到内存中,创建一个 java.lang.Class 对象,并将它的引用存储在运行时常量池中。这个过程由类加载器完成。 |
链接类 | 链接阶段主要包括三个步骤:验证、准备和解析。验证阶段确保类的字节码是合法且安全的;准备阶段给类的静态变量分配内存,并将其初始化为默认值;解析阶段将符号引用转换为直接引用。这个过程由 JVM 完成。 |
初始化类 | 初始化阶段是类的静态初始化代码块执行的阶段,它会按照顺序执行静态变量的赋值语句和静态初始化块。这个过程由 JVM 完成。 |
接下来,我们将详细介绍每个步骤,并给出相应的代码示例。
2. 加载类
public class MyClass {
// 类的成员变量和方法
}
在上述示例中,我们定义了一个名为 MyClass
的类。接下来,我们将通过加载它来创建一个类的实例。
3. 链接类
链接阶段包括三个步骤:验证、准备和解析。
3.1 验证
验证阶段会检查类的字节码是否合法且安全。这个过程由 JVM 完成,我们只需要关注类的定义是否符合语法规范。
3.2 准备
准备阶段会为类的静态变量分配内存,并将其初始化为默认值。在 Java 中,静态变量默认会被初始化为与其类型对应的默认值,例如 int
类型的静态变量默认为 0。
public class MyClass {
public static int staticVar; // 静态变量,默认为0
}
3.3 解析
解析阶段会将符号引用转换为直接引用。符号引用是一种用于表示引用目标的符号名称,它与直接引用相对应。解析过程由 JVM 完成,我们只需要关注类的引用是否正确。
4. 初始化类
初始化阶段是类的静态初始化代码块执行的阶段,它会按照顺序执行静态变量的赋值语句和静态初始化块。
public class MyClass {
public static int staticVar = 10; // 静态变量赋值
static {
// 静态初始化块
System.out.println("静态初始化块执行");
}
}
在上述示例中,我们定义了一个静态变量 staticVar
并进行了赋值,然后使用静态初始化块输出了一条信息。
5. 总结
通过以上的讲解,我们可以总结出类的实例化顺序如下:
- 加载类:将类的字节码文件加载到内存中,并创建一个
java.lang.Class
对象。 - 链接类:包括验证、准备和解析三个步骤。
- 初始化类:执行静态变量的赋值语句和静态初始化块。
以上就是关于 Java 类的实例化顺序的讲解,希望能对你有所帮助。
甘特图
gantt
dateFormat YYYY-MM-DD
title 类的实例化顺序甘特图
section 加载类
加载类 :done, a1, 2022-01-01, 1d
section 链接类