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
方法的一部分,非常有趣。非常感谢。