在子类中,我们可以使用子类的构造函数初始化数据成员,该构造函数在内部调用超类的构造函数super()
。如果子类不能从其超类继承构造函数,那么super()
如何调用初始化超类?
答案 0 :(得分:34)
来自子类的构造函数可以从超类中调用构造函数,但它们不会被继承。
要明确,这意味着如果你有类似的东西:
public class Super
{
public Super(int x)
{
}
}
public class Sub extends Super
{
public Sub()
{
super(5);
}
}
然后你不能写:
new Sub(10);
因为没有Sub(int)
构造函数。
将构造函数视为未初始化的静态方法,并初始化对象的隐式参数可能会有所帮助。
来自Java Language Spec, section 8.8:
构造函数声明不是成员。它们永远不会被继承,因此不会被隐藏或覆盖。
答案 1 :(得分:2)
没有子类不能继承其超类的构造函数。
构造函数是类的特殊函数成员,因为它们不是由子类继承的。构造函数用于在创建时为对象提供有效状态。
其中一个主要原因是因为您可能不希望覆盖超类构造函数,如果它们是继承的,那么它们是可能的。通过为开发人员提供覆盖超类构造函数的能力,您将侵蚀该语言的封装能力。
答案 2 :(得分:2)
super
是用于引用超类的Java关键字,而super()
是调用超类的构造函数的方法。构造函数不是继承的,但您仍然可以调用它。
答案 3 :(得分:0)
首先,构造函数不是类的成员,只有成员是继承的。
其次,我们可以想象我们不希望子类具有与父类相同的构造函数的情况。
想象一个抽象类Vehicle,带有构造函数Vehicle(int wheels)和子类Bicycle。
根据定义,一辆自行车有2个轮子所以我们可以想象自行车构造器会调用super(2)并且在这种情况下自行车不暴露构造器Bicycle(int wheel)会不会更好?
答案 4 :(得分:0)
No ..根本没有...一个子类不继承它的Superclass构造函数。而且它调用它可以调用它的超类构造函数使用关键字“super()”...
答案 5 :(得分:0)
public class Super
{
public Super(int x)
{
}
}
public class Sub extends Super
{
public Sub(int x)
{
super(x); // call constructor from Super class
}
}
Sub obj = new Sub(5);