Java静态初始化顺序

引言

在Java中,静态初始化顺序是指类中静态成员和静态代码块的初始化顺序。对于刚入行的开发者来说,理解和掌握Java静态初始化顺序是很重要的。本文将详细介绍Java静态初始化顺序的流程,并给出相应的代码示例和注释。

流程概述

Java静态初始化顺序可以分为以下步骤:

  1. 加载父类
  2. 加载子类
  3. 初始化父类静态变量和静态代码块
  4. 初始化子类静态变量和静态代码块
  5. 初始化父类实例变量和实例代码块
  6. 调用父类构造方法
  7. 初始化子类实例变量和实例代码块
  8. 调用子类构造方法

下面我们逐步展开对每个步骤的详细解释。

步骤详解

1. 加载父类

在加载子类之前,Java会先加载父类。父类的加载过程会根据需要加载的父类是否已经加载来判断。如果父类已经加载,就不会再加载;如果父类还没有加载,就会先加载父类。

2. 加载子类

加载子类的过程相对简单,只需确保类的字节码已经被加载到内存中。

3. 初始化父类静态变量和静态代码块

在父类被加载后,会先初始化父类的静态变量和静态代码块。静态变量的初始化可以在定义时直接赋初值,也可以在静态代码块中进行初始化。

public class ParentClass {
    public static int staticVar = 1; // 静态变量初始化
    static {
        System.out.println("ParentClass static block"); // 静态代码块
    }
}

4. 初始化子类静态变量和静态代码块

在父类的静态变量和静态代码块初始化完成后,会继续初始化子类的静态变量和静态代码块。同样地,静态变量的初始化可以在定义时赋初值,也可以在静态代码块中进行初始化。

public class ChildClass extends ParentClass {
    public static int staticVar2 = 2; // 静态变量初始化
    static {
        System.out.println("ChildClass static block"); // 静态代码块
    }
}

5. 初始化父类实例变量和实例代码块

在静态成员初始化完成后,会初始化父类的实例变量和实例代码块。实例变量的初始化可以在定义时赋初值,也可以在实例代码块中进行初始化。

public class ParentClass {
    public int instanceVar = 3; // 实例变量初始化
    {
        System.out.println("ParentClass instance block"); // 实例代码块
    }
}

6. 调用父类构造方法

在父类的实例变量和实例代码块初始化完成后,会调用父类的构造方法。

public class ParentClass {
    public ParentClass() {
        System.out.println("ParentClass constructor"); // 构造方法
    }
}

7. 初始化子类实例变量和实例代码块

在父类的构造方法调用完成后,会初始化子类的实例变量和实例代码块。同样地,实例变量的初始化可以在定义时赋初值,也可以在实例代码块中进行初始化。

public class ChildClass extends ParentClass {
    public int instanceVar2 = 4; // 实例变量初始化
    {
        System.out.println("ChildClass instance block"); // 实例代码块
    }
}

8. 调用子类构造方法

在子类的实例变量和实例代码块初始化完成后,会调用子类的构造方法。

public class ChildClass extends ParentClass {
    public ChildClass() {
        System.out.println("ChildClass constructor"); // 构造方法
    }
}