【问题标题】:Inheritance of constructors in javajava中构造函数的继承
【发布时间】:2018-10-30 07:52:17
【问题描述】:

每当在任何派生类中调用任何构造函数时,只有通过最终隐式或显式调用基类构造函数才能完成任务 (如果我在这里错了,请纠正我)。

因为我们打算创建一个派生类的实例,但是由于基类的构造函数最终被调用。

那么,尽管调用了基类的构造函数,派生类的实例是如何构造的呢?

【问题讨论】:

标签: java class-constructors inheriting-constructors


【解决方案1】:

构造函数不是很幸运的名字。它可能表明它负责创建(构造)对象,但实际上它负责已经存在的对象的初始化

对象由new 运算符创建。但是该对象已“设置”为使其所有字段都填充默认值:null、false、0(取决于类型)。为了使这样的对象在我们的应用程序中可用,我们需要正确地“设置”(初始化),这就是构造函数的工作。

但是由于类可以扩展其他类,因此子类的构造函数需要在超类的构造函数执行后才能执行其代码(例如,确保所有继承的字段都正确初始化,以便我们可以在构造函数中使用继承的方法它实际上使用了那些超类字段)。这就是为什么 super(..) 调用显式或隐式地放置在每个构造函数的开头(Object 类除外,因为它不扩展其他类)。

【讨论】:

    【解决方案2】:

    不要将构造函数视为创建实例。将其视为初始化该特定类的实例。

    所以初始化过程看起来像:

    • 分配内存
    • java.lang.Object 的角度初始化对象
    • your.package.Superclass 的角度初始化对象
    • your.package.Subclass 的角度初始化对象

    (即使您从调用new Subclass(...) 开始,首先执行超类构造函数体。)

    对象初始化的细节在JLS section 12.5中给出。

    【讨论】:

    • @BitcoinMurderousManiac:很高兴听到它对你有用 :)
    猜你喜欢
    • 2013-03-21
    • 2011-09-09
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2012-10-09
    相关资源
    最近更新 更多