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

时间:2018-12-20 06:36:54

标签: java constructor static-block

我们知道instance blockconstructor之前被调用。 SpecificationsStack 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 block主体之后调用constructor,还是可以说为什么按顺序调用它?

2 个答案:

答案 0 :(得分:3)

{ System.out.println("Constructor Instance Block"); }不是instance block,而是方法(在您的情况下为构造函数)中的另一行通用代码。因此它是在System.out.println("Constructor Body");之后执行的,这很自然。

答案 1 :(得分:1)

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

否则(例如,在方法正文中),您的{...}将被视为一个指令块(与C语言一样)。如果尝试将构造static {...}放置在其他位置(不在类正文中),则会出现编译错误。

希望答案对您有所帮助!