【发布时间】:2011-03-04 12:02:21
【问题描述】:
在子类中,我们可以使用子类的构造函数来初始化数据成员,该构造函数在内部调用超类的构造函数super()。如果子类不能从其超类继承构造函数,那么super() 调用如何初始化超类?
【问题讨论】:
-
你是什么意思,'如果子类不能继承构造函数'?
-
每个类都有自己的构造函数,包括子类
标签: java constructor
在子类中,我们可以使用子类的构造函数来初始化数据成员,该构造函数在内部调用超类的构造函数super()。如果子类不能从其超类继承构造函数,那么super() 调用如何初始化超类?
【问题讨论】:
标签: java constructor
子类的构造函数可以调用超类的构造函数,但它们不会被继承。
明确地说,这意味着如果你有类似的东西:
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:
构造函数声明不是成员。它们永远不会被继承,因此不会被隐藏或覆盖。
【讨论】:
没有子类不能继承其超类的构造函数。
构造函数是类的特殊函数成员,因为它们不被子类继承。构造函数用于在创建时为对象提供有效状态。
其中一个主要原因是因为您可能不想覆盖超类构造函数,如果它们被继承,这将是可能的。通过让开发人员能够覆盖超类构造函数,您将削弱语言的封装能力。
【讨论】:
super 是用于引用超类的Java 关键字,super() 是调用超类构造函数的方式。构造函数没有被继承,但你仍然可以调用它。
【讨论】:
不..从来没有...子类不继承其超类构造函数..相反,它调用它可以调用其超类构造函数使用关键字“super()”...
【讨论】:
首先,构造函数不是类的成员,只能继承成员。
其次,我们可以想象我们不希望子类具有与父类相同的构造函数的情况。
想象一个带有构造函数 Vehicle(int Wheels) 和子类 Bicycle 的抽象类 Vehicle。
根据定义,自行车有 2 个轮子,因此我们可以想象 Bicycle 构造函数将调用 super(2),在这种情况下,Bicycle 不公开构造函数 Bicycle(int Wheels) 不是更好吗?
【讨论】:
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);
【讨论】: