为什么我的初始化块会向后运行?

时间:2015-11-26 04:02:39

标签: java

打印出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 ");
   }
}

1 个答案:

答案 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 ");
}

这就是你获得输出的原因。