打印出r1 r4 pre b1 b2 r3 r2 hawk
但是我不明白为什么它打印r3 r2而不是r2 r3,这似乎是向后的。如果初始化块自上而下执行,为什么它从底部语句r3开始并以r2结束?在超类Bird中,它执行正如我所期望的b1和b2,从上到下,但在超类Raptor中,在构造函数运行之后,控制似乎首先跳转到最后一个语句并自行回到顶部。有什么想法吗?
这让我发疯了。
class Bird {
{ System.out.print("b1 "); }
public Bird()
{ System.out.print("b2 ");
}
class Raptor extends Bird {
static { System.out.print("r1 "); }
public Raptor()
{System.out.print("r2 "); } // don't these two print backwards?
{System.out.print("r3 "); } // ???
static { System.out.print("r4 "); }
}
class Hawk extends Raptor {
public static void main(String[] args) {
System.out.print("pre ");
new Hawk();
System.out.println("hawk ");
}
}
答案 0 :(得分:1)
您的班级Raptor
有一个初始化块。它被复制到构造函数中。
public Raptor()
{System.out.print("r2 "); } // don't these two print backwards?
{System.out.print("r3 "); } // ???
变为
public Raptor() {
super();
System.out.print("r3 "); // <-- initialization block copied in.
System.out.print("r2 ");
}
这就是你获得输出的原因。