Java 链接到子类中的另一个构造函数
我知道在继承的情况下,如果超类中缺少默认构造函数,子类构造函数应该显式调用超类构造函数 但是当链接到子类中的另一个构造函数时,为什么我们不必调用超类构造函数呢? 因为下面的代码没有给出编译错误 超类:Java 链接到子类中的另一个构造函数,java,oop,inheritance,constructor,Java,Oop,Inheritance,Constructor,我知道在继承的情况下,如果超类中缺少默认构造函数,子类构造函数应该显式调用超类构造函数 但是当链接到子类中的另一个构造函数时,为什么我们不必调用超类构造函数呢? 因为下面的代码没有给出编译错误 超类: public class Top { public Top(String n) { // TODO Auto-generated constructor stub } 子类: public class sub extends Top { public s
public class Top {
public Top(String n) {
// TODO Auto-generated constructor stub
}
子类:
public class sub extends Top {
public sub(int x){
super("");
}
public sub(String x) {
this(5);
}
}
如果构造函数必须精确匹配所有子类,并且该子类必须调用匹配的构造函数,那么就不会留下太多的更改空间。只要子类最终调用一个超类构造函数,一切都很好 因为“链式”构造函数将调用超类构造函数本身。否则,您将调用超类构造函数两次(因此父类构造函数的效果将执行两次,这可能会导致不一致的行为,例如调用实例初始值设定项两次)。更正式地说,构造函数调用的顺序解释如下:
此)
,则使用相同的五个步骤递归地评估参数和构造函数调用过程。如果构造函数调用突然完成,那么这个过程也会因为同样的原因突然完成;否则,继续执行步骤5
This
)。如果此构造函数用于非对象
的类,则此构造函数将以超类构造函数的显式或隐式调用开始(使用super
)。使用相同的五个步骤递归地评估超类构造函数调用的参数和过程。如果构造函数调用突然完成,那么此过程也会因为同样的原因突然完成。否则,继续执行步骤4
请注意,步骤2是递归的,适用于调用子类中其他构造函数的构造函数。步骤3适用于调用父类构造函数的构造函数。因为您链接到一个调用超类构造函数的构造函数。@jonsket所以不是每个构造函数都应该调用超类构造函数。。。仅仅链接到另一个调用super的构造函数就足够了吗?