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);
    }
}

如果构造函数必须精确匹配所有子类,并且该子类必须调用匹配的构造函数,那么就不会留下太多的更改空间。只要子类最终调用一个超类构造函数,一切都很好

因为“链式”构造函数将调用超类构造函数本身。否则,您将调用超类构造函数两次(因此父类构造函数的效果将执行两次,这可能会导致不一致的行为,例如调用实例初始值设定项两次)。更正式地说,构造函数调用的顺序解释如下:

  • 为此构造函数调用将构造函数的参数分配给新创建的参数变量

  • 如果此构造函数以同一类中另一个构造函数的显式构造函数调用(§8.8.7.1)开始(使用
    ,则使用相同的五个步骤递归地评估参数和构造函数调用过程。如果构造函数调用突然完成,那么这个过程也会因为同样的原因突然完成;否则,继续执行步骤5

  • 此构造函数不会以同一类中另一个构造函数的显式构造函数调用开始(使用
    This
    。如果此构造函数用于非
    对象
    的类,则此构造函数将以超类构造函数的显式或隐式调用开始(使用
    super
    )。使用相同的五个步骤递归地评估超类构造函数调用的参数和过程。如果构造函数调用突然完成,那么此过程也会因为同样的原因突然完成。否则,继续执行步骤4


  • 请注意,步骤2是递归的,适用于调用子类中其他构造函数的构造函数。步骤3适用于调用父类构造函数的构造函数。

    因为您链接到一个调用超类构造函数的构造函数。@jonsket所以不是每个构造函数都应该调用超类构造函数。。。仅仅链接到另一个调用super的构造函数就足够了吗?