当前位置: 首页 > 知识库问答 >
问题:

为什么我的初始化块向后运行?[副本]

宋经赋
2023-03-14

这将打印出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个答案

闻安宜
2023-03-14

您的类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 ");
}

这就是为什么你会得到你所做的输出。

 类似资料:
  • 我有一个JavaFX应用程序,它与用Java编写的控制器类一起使用FXML。在Java控制器中,在FXML节点初始化之前,我需要小心不要对其进行操作(否则我会得到一个NullPointerException),这在运行初始化方法之前是无法保证的。所以我发现自己经常这样做: 控制器在FXML文件中设置如下: 然后是Java文件中的控制器。 这是可行的,但它笨重且重复。我必须创建globalValue

  • 问题内容: 我们可以将代码放入构造函数或方法或初始化块中。初始化块有什么用?每个Java程序都必须有它吗? 问题答案: 首先,有两种类型的初始化块: 实例初始化块,以及 静态初始化块。 此代码应说明它们的用法以及执行顺序: 印刷品: 如果要运行某些代码而不管使用哪个构造函数,或者想要对匿名类进行一些实例初始化,则实例迭代块很有用。

  • 所以我想用java编写一个Tic-Tac-Toe游戏。 现在点击一个按钮,我想把按钮的图像设置为“十字”或“圆圈”,但是一旦一个类型跟随代码,按钮就会消失,直到我悬停在它们上面,然后它们就会返回。 没有上面的代码会是什么样子 这里的项目结构

  • 我试图在循环中初始化数组C,但它给出了错误: C是类ipdata的数组,我已经声明了它,并试图在循环中初始化它。 有什么问题吗?它表示:无法访问cluster_anlysis类型的封闭实例。必须使用cluster_anlysis类型的封闭实例限定分配(例如,x.new A(),其中x是cluster_anlysis的实例)。

  • 我有我的文件下面: 我也有例子。: 出于某种原因,当我做在我的根目录(不是)我得到错误: 有人能给我解释一下这个错误中的问题吗?这是因为我的依赖项没有正确安装,还是因为其他原因?

  • 问题内容: 我有2节课: Class A: Class B: I create a Main class which just creates new A: The output I get is: 如您所见,A的构造函数在其静态初始值设定项之前被调用。 我了解它与我创建的循环依赖关系有关,但我印象中静态初始化程序应始终在构造函数之前运行。 发生这种情况的原因是什么(技术上在Java实现中)? 是