Java - 为什么在构造函数之后或在构造函数中按顺序调用实例块?
Java - Why the instance block is called after the constructor or order wise in the constructor?
我们知道 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
正文之后调用,或者我们可以说为什么按顺序调用它?
{ System.out.println("Constructor Instance Block"); }
不是 instance block
,而是方法(在您的例子中是构造函数)中的另一行常见代码。所以它在 System.out.println("Constructor Body");
之后执行,这是很自然的。
static initializers
和 instance initializers
对应 class 和它的创建。请参阅:Static block vs. initializer block in Java? 这就是为什么它必须放在 class 的 body 中的原因。
否则(例如,在方法体中),您的 {...}
将被视为 指令块(如 C
语言)。如果您尝试将构造 static {...}
放在其他地方(而不是在 class 正文中),您将遇到编译错误。
希望回答对您有所帮助!
我们知道 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
正文之后调用,或者我们可以说为什么按顺序调用它?
{ System.out.println("Constructor Instance Block"); }
不是 instance block
,而是方法(在您的例子中是构造函数)中的另一行常见代码。所以它在 System.out.println("Constructor Body");
之后执行,这是很自然的。
static initializers
和 instance initializers
对应 class 和它的创建。请参阅:Static block vs. initializer block in Java? 这就是为什么它必须放在 class 的 body 中的原因。
否则(例如,在方法体中),您的 {...}
将被视为 指令块(如 C
语言)。如果您尝试将构造 static {...}
放在其他地方(而不是在 class 正文中),您将遇到编译错误。
希望回答对您有所帮助!