返回
揭秘 Java 对象初始化过程:代码块与构造器调用顺序
后端
2023-10-05 17:59:55
Java 对象的初始化过程是一个复杂而有序的过程,涉及代码块与构造器的调用顺序。本文将对 Java 对象的初始化过程进行详细的分析和整理,帮助您理解 Java 对象的创建过程,优化代码结构,提升程序性能。
-
父类静态代码块(静态变量 > 静态块)
- Java 对象的初始化过程首先从父类的静态代码块开始,静态代码块是类加载时执行的代码块,通常用于初始化静态变量。
- 静态代码块中的语句按照其在代码中的顺序执行,并只执行一次。
-
子类的静态代码块
- 接下来执行子类的静态代码块,静态代码块是类加载时执行的代码块,通常用于初始化静态变量。
- 静态代码块中的语句按照其在代码中的顺序执行,并只执行一次。
-
父类构造代码块、构造方法
- 父类的构造代码块和构造方法按照其在代码中的顺序执行,构造代码块是实例化对象时执行的代码块,通常用于初始化实例变量。
- 构造方法是实例化对象时调用的方法,用于初始化实例变量和执行其他初始化操作。
-
子类的构造代码块、构造方法
- 最后执行子类的构造代码块和构造方法,构造代码块是实例化对象时执行的代码块,通常用于初始化实例变量。
- 构造方法是实例化对象时调用的方法,用于初始化实例变量和执行其他初始化操作。
结论:
- 父类静态代码块(静态变量 > 静态块) > 子类的静态代码块 > 父类构造代码块、构造方法> 子类的构造代码块、构造方法
举个例子:
class Parent {
static int staticVariable = 10; // 父类静态变量
static { // 父类静态代码块
System.out.println("Parent: static block");
}
{ // 父类构造代码块
System.out.println("Parent: instance block");
}
public Parent() { // 父类构造方法
System.out.println("Parent: constructor");
}
}
class Child extends Parent {
static int staticVariable = 20; // 子类静态变量
static { // 子类静态代码块
System.out.println("Child: static block");
}
{ // 子类构造代码块
System.out.println("Child: instance block");
}
public Child() { // 子类构造方法
System.out.println("Child: constructor");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child(); // 创建子类对象
}
}
输出结果:
Parent: static block
Child: static block
Parent: instance block
Child: instance block
Parent: constructor
Child: constructor
分析:
- 首先执行父类的静态代码块,输出"Parent: static block"。
- 然后执行子类的静态代码块,输出"Child: static block"。
- 接下來执行父类的构造代码块,输出"Parent: instance block"。
- 然后执行子类的构造代码块,输出"Child: instance block"。
- 最后执行父类的构造方法,输出"Parent: constructor"。
- 最后执行子类的构造方法,输出"Child: constructor"。
通过这个例子,我们清晰地看到 Java 对象的初始化过程是如何进行的,代码块与构造器的调用顺序是遵循一定的规则的。