本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Why does this() and super() have to be the first statement in a constructor?
我刚在学校学的,但老师不知道为什么。
我可以考虑一些很好的理由,但我认为有些情况下可以在稍后的构造函数中完成初始化——例如,在使用来自母亲类的变量之前。好的,变量应该从一开始就初始化,但这并不总是必要的。
我想还有更多的原因可以解释为什么必须将super()放在构造函数的第一行。
所以,当我继承一个类时,为什么必须在构造函数的第一行中编写super()?
"并不总是必要的",但你能想出一个不应该的理由吗?
我的意思是:在使用变量或对象之前,可以先声明一行。为什么不能用super()来完成呢?奥德兰给了我一个很好的答案。
在您开始使用自己的类之前,您从中继承的类需要能够完成其构造。
如果不这样做,你可以做很多"坏"的事情,例如
在其构造函数运行之前,将this传递给另一个使用基类的方法。这将打破许多假设
调用尚未正确"设置"的多态函数。除了类本身所做的任何事情之外,实现也可能使用构造函数调用来处理实现内部。
在构建一个对象之前访问它是不好的,就像油炸鸡一样——一个你真的不想在油炸之前访问(吃)那个鸡的鸡。
访问基类试图承诺的基类的protected或public成员变量将始终初始化为某种状态。
对于一个类来说,承诺它的任何实例都将始终处于某个给定状态是完全合理的。如果你有机会在构造函数被调用之前做一些事情,那么就没有办法兑现这样的承诺。本质上,如果"是"的事情还不是真的那样的话,"是"的关系就不会维持下去了!
这解释了很多。谢谢!
除了Advand回答:你不必写Sub(),因为Java编译器会自动调用层次结构中的所有默认构造函数。
例外:如果在基类中没有默认的构造函数,则必须使用super(ConstructorArgs args)调用自定义构造函数。