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

时间:2012-01-19 09:45:46

标签: java class inheritance

  

可能重复:
  Why does this() and super() have to be the first statement in a constructor?

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

    在它被构造之前访问一个对象是不好的,就像炸鸡一样#34; -a"鸡肉你真的不想在鸡肉被油炸之前吃掉(吃掉)。

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

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

答案 1 :(得分:1)

除了awoodlands之外回答:你不必编写super(),因为Java-Compiler会自动调用层次结构中的所有默认构造函数。

异常:如果基类中没有默认构造函数,则必须使用super(ConstructorArgs args)调用自定义构造函数。