我们知道instance block
在constructor
之前被调用。 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 block
在constructor
之前被调用。
为什么在instance block
主体之后调用constructor
,还是可以说为什么按顺序调用它?
答案 0 :(得分:3)
{ System.out.println("Constructor Instance Block"); }
不是instance block
,而是方法(在您的情况下为构造函数)中的另一行通用代码。因此它是在System.out.println("Constructor Body");
之后执行的,这很自然。
答案 1 :(得分:1)
static initializers
和instance initializers
对应于类及其创建。请参阅:Static block vs. initializer block in Java?这就是为什么必须将其放在类的 body 中的原因。
否则(例如,在方法正文中),您的{...}
将被视为一个指令块(与C
语言一样)。如果尝试将构造static {...}
放置在其他位置(不在类正文中),则会出现编译错误。
希望答案对您有所帮助!