JAVA初始化块 [英] JAVA initialization blocks
问题描述
正如一些消息来源所说,Java实例初始化块在创建实例时或在构造函数之前执行。但想象一下这种情况:
As some sources say, the Java instance initialization blocks are executed whenever instance is created or right before constructor. But imagine this case:
public class Foo {
{
System.out.println("Foo init");
}
public Foo()
{
{
System.out.println("Foo constr");
}
}
}
public class Main extends Foo {
{
System.out.println("Main init");
}
public Main()
{
{
System.out.println("Main constr");
}
}
public static void main(String[] args) {
new Main();
}
}
输出是(如预测的那样):
And the output is (as predicted):
Foo init
Foo constr
Main init
Main constr
所以我的问题是 - 实例初始化块的正确定义是什么,因为它显然不是在构造函数之前执行,因为输出应该是
So my question is - what is right definition of instance initialization block, because it obviously isn't executed right before constructor, because output should be
Main init
Foo init
Foo constr
Main constr
因为在调用super()之前调用了Main()构造函数,而Main初始化块应该是第一个。
because Main() constructor is called before call to super() and Main initialization block should be first.
推荐答案
不。初始化块直接复制到构造函数中。显然,那里也有一个隐含的超级。所以你的例子变成了
No. The initialization blocks are copied directly into the constructor(s). Obviously there is an implicit super in there as well. So your example becomes
public class Foo {
public Foo()
{
{System.out.println("Foo init");} // initializer.
{System.out.println("Foo constr");}
}
}
public class Main extends Foo {
public Main()
{
super(); // super constructor.
{System.out.println("Main init");} // initializer.
{System.out.println("Main constr");}
}
public static void main(String[] args) {
new Main();
}
}
这解释了您观察到的行为
Which explains your observed behavior of
Foo init
Foo constr
Main init
Main constr
这篇关于JAVA初始化块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!