对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块、构造器。)
继承与初始化分为三步 (p273):
1 找到所有的基类从根基类开始加载
2.根基类的static初始化然后是下一个导出类 以此类推
3.所有的类都已经加载完 对象可以被创建了,首先对象中所有基本类型都会被设为默认值,对象引用都被设为null,赋初值,构造器从根往下执行赋值
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
首先,你的代码和下面代码是等价的:
new Z()
之后,调用Z
的无参构造函数;因为
Z
继承了X
,所以去调用X
的无参构造函数(执行super()
);X
的无参构造函数第一行代码为Y b = new Y()
,所以去调用Y
的无参构造函数,此时输出 Y;Y b = new Y()
执行完毕之后,回到X
的无参构造函数,输出 X;然后回到
Z
的无参构造函数,执行Y y = new Y()
输出 Y,最后输出 Z。所以图中提到的 先执行 X 的构造函数 的说法是错误的,应该最先执行的是 Y 的构造函数。