【问题标题】:Why should the derived class constructor always access base class constructor?为什么派生类构造函数总是要访问基类构造函数?
【发布时间】:2011-02-24 23:42:40
【问题描述】:

我在我的一篇试卷中看到了这个问题:

为什么派生类构造函数总是要访问基类构造函数?

我想知道这个问题是否有效?

【问题讨论】:

  • 因为应该构造基类!
  • 因为需要构造基类!

标签: java derived-class base-class


【解决方案1】:

这样您就可以在开始弄乱派生对象中的继承功能之前拥有一个“Base”类型的有效对象!

【讨论】:

    【解决方案2】:

    这是无效的。没有“应该”:它必须,编译器通过调用基类的默认构造函数(如果存在)来强制执行它,如果存在则给你一个编译错误没有,这会迫使您调用现有的构造函数之一。

    【讨论】:

      【解决方案3】:

      总是有一个例外,超类中的默认构造函数通常不称为显式。

      如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。 Object 确实有这样的构造函数,所以如果 Object 是唯一的超类,则没有问题。

      【讨论】:

        【解决方案4】:

        因为基类可能会做你不知道的工作。

        【讨论】:

          【解决方案5】:

          因为基类可能有需要初始化的成员。

          【讨论】:

            【解决方案6】:

            由于派生类构造函数要继承基类构造函数,所以需要调用基类构造函数。否则,如果你不这样做,你将不会继承在基类构造函数中初始化的值。

            【讨论】:

              【解决方案7】:

              调用超类构造函数不是必须,而是应该与强烈建议配对 - 只要超类具有默认构造函数。否则编译器会强制你调用至少一个超类构造函数。

              如果存在默认构造函数,则无论如何都会调用它,即使在子类构造函数中没有显式的 super() 语句。

              类构造的一个可见部分是字段的初始化。但还有更多内容(内存分配、注册等)。所有这些都必须在创建派生类时为所有超类完成。

              【讨论】:

                猜你喜欢
                • 2014-06-23
                • 2016-07-19
                • 2017-12-18
                • 2018-07-21
                • 2013-01-28
                • 2015-08-18
                • 2018-07-16
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多