Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在静态init块之后打印输出(继承) 问题描述_Java_Inheritance_Static - Fatal编程技术网

Java 为什么在静态init块之后打印输出(继承) 问题描述

Java 为什么在静态init块之后打印输出(继承) 问题描述,java,inheritance,static,Java,Inheritance,Static,从中提取的以下代码段产生以下输出: r1 r4 pre b1 b2 r3 r2 hawk 我的解决方案出错了:r1 r4 b1 b2 r3 r2 hawk之前的版本 这是我遵循的逻辑: 首先,我们从打印pre开始,它在hawk()的实例化之前 将首先打印static块中的内容:r1r4 从基类Bird打印块中的内容,然后打印构造函数中的内容:b1、b2 我们转到第一个子类Raptor,然后打印r3,r2 最后我们打印hawk,它在类hawk 本书提供的解决方案说明 静态初始化块在类加载

从中提取的以下代码段产生以下输出:

r1 r4 pre b1 b2 r3 r2 hawk
我的解决方案出错了
r1 r4 b1 b2 r3 r2 hawk之前的版本

这是我遵循的逻辑:

  • 首先,我们从打印
    pre
    开始,它在
    hawk()的实例化之前

  • 将首先打印
    static
    块中的内容:
    r1r4

  • 从基类
    Bird
    打印块中的内容,然后打印构造函数中的内容:
    b1、b2
  • 我们转到第一个子类
    Raptor
    ,然后打印
    r3,r2
  • 最后我们打印
    hawk
    ,它在类
    hawk


本书提供的解决方案说明 静态初始化块在类加载时执行;实例初始化 块在构造函数中调用super()后立即运行。什么时候 单个类型的多个init块出现在一个类中,它们在 顺序,从上到下


问题
  • 静态初始化块在类加载时执行:这也是Hawk的类加载时间,对吗?加载hawk类后,它将自动进入继承树?甚至在打印
    pre
    之前
  • 为什么解决方案不是:
    r1r4b1b2r3r2pre-hawk
  • 就像它在继承过程中一直向上打印
    静态
    方法中的内容,然后一直向下打印
    pre
    。然后它又一次向上打印
    中的块
    构造函数
    中的内容。然后最后打印了hawk

这让我有点困惑。抱歉,如果我破坏了java语言。

b1 b2 r3 r2
不是静态的,因此虽然它们确实是实例构造的一部分,但它们只有在创建后才会被调用(
new Hawk();
后面的
pre

一般来说,你是对的,它会一直上升到惯性树,它会上升两次:
-静态部分的首次使用

-第二次是构造函数,由创建新的
Hack
触发,因此在pre

之后,类加载的顺序是:

static initialization blocks
instance initialization blocks
constructor
调用
Hawk
main
方法时,必须加载其类层次结构。从基类开始,将按顺序调用静态初始化块:

r1 r4
调用第一个
println

pre
hawk
该类是自下而上初始化的。在每个类中,实例初始化块在ctor之前被调用。在
Bird中

b1 b2
在猛禽中

r3 r2
然后调用最后一个println

pre
hawk

是的,但是为什么
r3
要在
r2
r@JordanGS实例初始化块在ctors@HaniGoc-是的,它们都是静态初始化块的一部分。pre是静态
main
方法的一部分,非常有趣。非常感谢。