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. 总结

通过以上的讲解,我们可以总结出类的实例化顺序如下:

  1. 加载类:将类的字节码文件加载到内存中,并创建一个 java.lang.Class 对象。
  2. 链接类:包括验证、准备和解析三个步骤。
  3. 初始化类:执行静态变量的赋值语句和静态初始化块。

以上就是关于 Java 类的实例化顺序的讲解,希望能对你有所帮助。

甘特图

gantt
    dateFormat  YYYY-MM-DD
    title 类的实例化顺序甘特图

    section 加载类
    加载类    :done, a1, 2022-01-01, 1d

    section 链接类