返回

揭秘 Java 对象初始化过程:代码块与构造器调用顺序

后端

Java 对象的初始化过程是一个复杂而有序的过程,涉及代码块与构造器的调用顺序。本文将对 Java 对象的初始化过程进行详细的分析和整理,帮助您理解 Java 对象的创建过程,优化代码结构,提升程序性能。

  1. 父类静态代码块(静态变量 > 静态块)

    • Java 对象的初始化过程首先从父类的静态代码块开始,静态代码块是类加载时执行的代码块,通常用于初始化静态变量。
    • 静态代码块中的语句按照其在代码中的顺序执行,并只执行一次。
  2. 子类的静态代码块

    • 接下来执行子类的静态代码块,静态代码块是类加载时执行的代码块,通常用于初始化静态变量。
    • 静态代码块中的语句按照其在代码中的顺序执行,并只执行一次。
  3. 父类构造代码块、构造方法

    • 父类的构造代码块和构造方法按照其在代码中的顺序执行,构造代码块是实例化对象时执行的代码块,通常用于初始化实例变量。
    • 构造方法是实例化对象时调用的方法,用于初始化实例变量和执行其他初始化操作。
  4. 子类的构造代码块、构造方法

    • 最后执行子类的构造代码块和构造方法,构造代码块是实例化对象时执行的代码块,通常用于初始化实例变量。
    • 构造方法是实例化对象时调用的方法,用于初始化实例变量和执行其他初始化操作。

结论:

  • 父类静态代码块(静态变量 > 静态块) > 子类的静态代码块 > 父类构造代码块、构造方法> 子类的构造代码块、构造方法

举个例子:

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

分析:

  1. 首先执行父类的静态代码块,输出"Parent: static block"。
  2. 然后执行子类的静态代码块,输出"Child: static block"。
  3. 接下來执行父类的构造代码块,输出"Parent: instance block"。
  4. 然后执行子类的构造代码块,输出"Child: instance block"。
  5. 最后执行父类的构造方法,输出"Parent: constructor"。
  6. 最后执行子类的构造方法,输出"Child: constructor"。

通过这个例子,我们清晰地看到 Java 对象的初始化过程是如何进行的,代码块与构造器的调用顺序是遵循一定的规则的。