📜  Java中初始化块和构造函数的执行顺序(1)

📅  最后修改于: 2023-12-03 15:16:19.475000             🧑  作者: Mango

Java中初始化块和构造函数的执行顺序

在Java中,初始化块和构造函数都用于初始化对象的状态。但它们之间存在着一些差别,比如执行顺序等。在本文中,我们将探讨Java中初始化块和构造函数的执行顺序。

初始化块

初始化块是一个代码块,其中编写的代码在创建对象时被执行一次,用于初始化对象的状态。在Java中,有两种类型的初始化块:静态初始化块和实例初始化块。

静态初始化块

静态初始化块是用于初始化静态变量的代码块,它在类加载时被执行,且仅执行一次。下面是一个静态初始化块的例子:

public class MyClass {
    static {
        // 静态初始化块代码
    }
    // 其他类成员和方法
}
实例初始化块

实例初始化块是用于初始化实例变量的代码块,它在对象创建时被执行。下面是一个实例初始化块的例子:

public class MyClass {
    {
        // 实例初始化块代码
    }
    // 其他类成员和方法
}
构造函数

构造函数是用于初始化对象的代码块,它在对象创建时被执行。下面是一个构造函数的例子:

public class MyClass {
    public MyClass() {
        // 构造函数代码
    }
    // 其他类成员和方法
}
执行顺序

在Java中,当创建一个新对象时,其初始化块和构造函数会按照下面的顺序执行:

  1. 静态变量初始化块(仅在类加载时执行一次)
  2. 静态变量声明
  3. 实例变量初始化块
  4. 父类构造函数(如果有)
  5. 父类实例变量初始化块
  6. 子类构造函数
  7. 子类实例变量初始化块
例子

class Parent {
    int parentVariable = 10;

    {
        System.out.println("Parent instance initialization block.");
    }

    Parent() {
        System.out.println("Parent constructor.");
    }
}

class Child extends Parent {
    int childVariable = 20;

    {
        System.out.println("Child instance initialization block.");
    }

    Child() {
        System.out.println("Child constructor.");
    }

    public static void main(String[] args) {
        new Child();
    }
}

这个程序会输出下面的内容:

Parent instance initialization block.
Parent constructor.
Child instance initialization block.
Child constructor.

可以看出,初始化块的执行顺序与它们在代码中出现的顺序是一致的,构造函数的执行顺序在其前面。