Java - 为什么在构造函数之后或在构造函数中按顺序调用实例块?

Java - Why the instance block is called after the constructor or order wise in the constructor?

我们知道 instance blockconstructor 之前被调用。 Specifications, Stack Overflow Answer

因此,我们期望从以下代码中获得的输出:

class Test{
    static { System.out.println("Static Block"); }
    { System.out.println("Instance Block"); }
    Test(){
        System.out.println("Constructor Body");
        { System.out.println("Constructor Instance Block"); }
    }
}
class TestApp{
    public static void main(String[] args){
        new Test();
    }
} 

应该是:

Static Block
Instance Block

Constructor Instance Block
Constructor Body

那么为什么我得到以下输出:

Static Block
Instance Block

Constructor Body
Constructor Instance Block

但是如果我更改 constructor 中语句的顺序,例如:

class Test{
    static { System.out.println("Static Block"); }
    { System.out.println("Instance Block"); }
    Test(){
        { System.out.println("Constructor Instance Block"); }
        System.out.println("Constructor Body");
    }
}

然后它输出预期的结果,但这不应该是这样,因为文档说 instance blockconstructor.

之前被调用

为什么 instance blockconstructor 正文之后调用,或者我们可以说为什么按顺序调用它?

{ System.out.println("Constructor Instance Block"); } 不是 instance block,而是方法(在您的例子中是构造函数)中的另一行常见代码。所以它在 System.out.println("Constructor Body"); 之后执行,这是很自然的。

static initializersinstance initializers 对应 class 和它的创建。请参阅:Static block vs. initializer block in Java? 这就是为什么它必须放在 class 的 body 中的原因。

否则(例如,在方法体中),您的 {...} 将被视为 指令块(如 C 语言)。如果您尝试将构造 static {...} 放在其他地方(而不是在 class 正文中),您将遇到编译错误。

希望回答对您有所帮助!