子类是否从它的超类inheritance构造函数?
在子类中,我们可以使用子类的构造函数初始化数据成员,该构造函数在内部调用超类的构造函数super()
。 如果子类不能从其超类inheritance构造函数,那么super()
调用如何初始化超类?
子类中的构造函数可以从超类中调用构造函数,但它们不会像这样inheritance。
要清楚,这意味着如果你有类似的东西:
public class Super { public Super(int x) { } } public class Sub extends Super { public Sub() { super(5); } }
那么你不能写:
new Sub(10);
因为没有Sub(int)
构造函数。
将构造函数视为未初始化的静态方法,并初始化对象的隐式参数可能会有所帮助。
从Java语言规范,第8.8节 :
构造函数声明不是成员。 它们永远不会被遗传,因此不会被隐藏或覆盖。
super
是用于引用超类的Java关键字,而super()
是调用超类的构造函数的方法。 构造函数不是inheritance的,但您仍然可以调用它。
没有子类不能inheritance其超类的构造函数。
构造函数是类的特殊函数成员,因为它们不是由子类inheritance的。 构造函数用于在创建时为对象提供有效状态。
其中一个主要原因是因为您可能不希望覆盖超类构造函数,如果它们是inheritance的,那么它们是可能的。 通过让开发人员能够覆盖超类构造函数,您将侵蚀该语言的封装能力。
另请参见: 构造函数永远不会被inheritance
没有……根本没有…一个子类不inheritance它的超类构造函数。它调用它可以调用它的超类构造函数使用关键字“super()”…
首先,构造函数不是类的成员,只有成员是inheritance的。
其次,我们可以想象我们不希望子类具有与父类相同的构造函数的情况。
想象一个抽象类Vehicle,带有构造函数Vehicle(int wheels)和一个子类Bicycle。
根据定义,一辆自行车有2个轮子所以我们可以想象自行车构造器会调用超级(2)并且在这种情况下自行车不暴露构造器自行车(int车轮)不是更好吗?