【问题标题】:chaining to another constructor in the subClass链接到子类中的另一个构造函数
【发布时间】:2016-03-11 21:08:35
【问题描述】:

我知道在继承的情况下,如果超类中的默认构造函数丢失,子类构造函数应该显式调用超类构造函数

但是当链接到子类中的另一个构造函数时,为什么我们不必调用超类构造函数呢? 因为下面的代码没有给出编译错误

超类:

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

【问题讨论】:

  • 因为您正在链接到一个构造函数,该构造函数确实调用了超类构造函数。
  • @JonSkeet 所以不是每个构造函数都应该调用 superClass 构造函数...只是链接到另一个调用 superClass 的构造函数就足够了?

标签: java oop inheritance constructor


【解决方案1】:

因为“链式”构造函数会调用超类构造函数本身。否则,您将调用超类构造函数两次(因此父类构造函数的效果将执行两次,这可能会导致不一致的行为,例如调用实例初始化程序两次)。更正式地,构造函数调用的顺序在this section of the Java Language Specification中解释:

  1. 将构造函数的参数分配给此构造函数调用的新创建的参数变量。

  2. 如果此构造函数以同一类中另一个构造函数的显式构造函数调用(第 8.8.7.1 节)开始(使用 this,则评估参数并使用递归处理该构造函数调用同样的五个步骤。如果该构造函数调用突然完成,则此过程出于相同原因而突然完成;否则,继续第 5 步。

  3. 此构造函数不是以显式调用同一类中的另一个构造函数开始的(使用this。如果此构造函数用于Object 以外的类,则此构造函数将以显式或隐式调用超类构造函数开始(使用super)。使用这五个相同的步骤以递归方式评估超类构造函数调用的参数和过程。如果该构造函数调用突然完成,则此过程出于相同的原因突然完成。否则,继续第 4 步。

...

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

【讨论】:

    【解决方案2】:

    如果构造函数必须与所有子类完全匹配,并且该子类必须调用匹配的构造函数,则不会留下太多更改空间。只要子类最终调用超类构造函数之一,一切都很好。

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 2014-03-12
      • 2014-08-01
      • 1970-01-01
      相关资源
      最近更新 更多