java:为什么我必须在构造函数的第一行编写super()

Ale*_*rov 0 java inheritance class

可能重复:
为什么this()和super()必须是构造函数中的第一个语句?

我刚在学校学到了,但老师不知道为什么.

我可以想出一些很好的理由,但是我认为有些情况下可以在构造函数中稍后进行初始化 - 例如,在使用母类的变量之前.好的,变量应该从一开始就被初始化,但这并不总是必要的.

我猜是有更多的理由说明为什么必须将super()放在构造函数的第一行.

那么,为什么我必须在构造函数的第一行编写super(),当我继承一个类时?

Fle*_*exo 5

您继承的课程需要能够在您开始自己的课程之前完成其构建.

如果不这样做,你可以做很多"坏事",例如

  1. 其构造函数运行之前this,传递给使用基类的其他地方的另一个方法.这会打破很多假设
  2. 调用尚未正确"设置"的多态函数.除了类本身所做的任何事情之外,实现也可能使用构造函数调用来处理实现内部.

    在物体构建之前进入物体是不好的,就像炸鸡"是一只鸡"一样,你真的不想在炸鸡之前吃掉它(吃).

  3. 基类尝试承诺的基类的访问protected/ public成员变量将始终初始化为某个状态.

对于一个类来说,承诺它的任何实例总是处于某个给定的状态是完全合理的.如果你有机会在构造函数被调用之前做事,那么就没有办法兑现这样的承诺了.基本上"is-a"关系实际上不会成立,如果它"是"的东西实际上还不是那个东西!