什么是初始化块?

我们可以将代码放在构造函数、方法或初始化块中。初始化块有什么用?每个java程序都必须拥有它吗?


答案 1

首先,有两种类型的初始化块

  • 实例初始化块,以及
  • 静态初始化块

此代码应说明它们的用法以及它们的执行顺序:

public class Test {

    static int staticVariable;
    int nonStaticVariable;        

    // Static initialization block:
    // Runs once (when the class is initialized)
    static {
        System.out.println("Static initalization.");
        staticVariable = 5;
    }

    // Instance initialization block:
    // Runs each time you instantiate an object
    {
        System.out.println("Instance initialization.");
        nonStaticVariable = 7;
    }

    public Test() {
        System.out.println("Constructor.");
    }

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

指纹:

Static initalization.
Instance initialization.
Constructor.
Instance initialization.
Constructor.

如果要运行某些代码而不考虑使用哪个构造函数,或者要对匿名类执行某些实例初始化,则实例初始化块非常有用。


答案 2

想补充一下@aioobe的答案

执行顺序:

  1. 超类的静态初始化块

  2. 类的静态初始化块

  3. 超类的实例初始化块

  4. 超类的构造函数

  5. 类的实例初始化块

  6. 类的构造函数。

要记住的几个额外的要点(第1点是重申@aioobe的答案):

  1. 静态初始化块中的代码将在类装入时执行(是的,这意味着每个类装入只有一次),在构造类的任何实例之前,在调用任何静态方法之前。

  2. 实例初始化块实际上由 Java 编译器复制到该类具有的每个构造函数中。因此,每次实例初始化块中的代码恰好在构造函数中的代码之前执行时。