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

java: Why must I write super() in the first line of the constructor

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why does this() and super() have to be the first statement in a constructor?

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

我可以考虑一些很好的理由,但我认为有些情况下可以在稍后的构造函数中完成初始化——例如,在使用来自母亲类的变量之前。好的,变量应该从一开始就初始化,但这并不总是必要的。

我想还有更多的原因可以解释为什么必须将super()放在构造函数的第一行。

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


在您开始使用自己的类之前,您从中继承的类需要能够完成其构造。

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

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

    在构建一个对象之前访问它是不好的,就像油炸鸡一样——一个你真的不想在油炸之前访问(吃)那个鸡的鸡。

  • 访问基类试图承诺的基类的protectedpublic成员变量将始终初始化为某种状态。

  • 对于一个类来说,承诺它的任何实例都将始终处于某个给定状态是完全合理的。如果你有机会在构造函数被调用之前做一些事情,那么就没有办法兑现这样的承诺。本质上,如果"是"的事情还不是真的那样的话,"是"的关系就不会维持下去了!


    除了Advand回答:你不必写Sub(),因为Java编译器会自动调用层次结构中的所有默认构造函数。

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