Java静态初始化顺序
引言
在Java中,静态初始化顺序是指类中静态成员和静态代码块的初始化顺序。对于刚入行的开发者来说,理解和掌握Java静态初始化顺序是很重要的。本文将详细介绍Java静态初始化顺序的流程,并给出相应的代码示例和注释。
流程概述
Java静态初始化顺序可以分为以下步骤:
- 加载父类
- 加载子类
- 初始化父类静态变量和静态代码块
- 初始化子类静态变量和静态代码块
- 初始化父类实例变量和实例代码块
- 调用父类构造方法
- 初始化子类实例变量和实例代码块
- 调用子类构造方法
下面我们逐步展开对每个步骤的详细解释。
步骤详解
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"); // 构造方法
}
}
















