【问题标题】:Java: How does a call to the super class constructor inside of a child class constructor work?Java:在子类构造函数中调用超类构造函数是如何工作的?
【发布时间】:2018-03-29 05:24:54
【问题描述】:

我只是想弄清楚这一点。假设我有以下超类 Geometry 的构造函数:

public Geometry(double x, double y)
    {
        this.position = new Point(x,y);
        this.collisionMesh = new ArrayList<Point>();
        this.displayMesh = new ArrayList<Point>();
    }

Geometry 具有成员 position、collisionMesh 和 displayMesh,其所有子类都将继承。

现在,我有一个子类 Particle。以下是一个有效的构造函数:

public Particle(double x, double y)
{
   super(x,y);
   this.collisionMesh.add(this.position);
   ...
}

我要确定的是:对 super(x,y) 的调用会自动实例化我的子对象的 ArrayLists 和 Point,因此我不需要这样做。

另外,在更深层次上,假设我能做到这一点,这里到底发生了什么?感觉就像我在构造函数内部调用构造函数。如果 Particle 对象尚未构建完成,那么在调用 super 期间会构建什么?

【问题讨论】:

  • 你做了很多与现实不太相似的假设。提示:所有这些都有很好且广泛的记录。
  • “构造函数”不是很幸运的名字。构造(在创建的意义上)对象是new 关键字。它创建了出现在它之后的类型对象,如new SomeClass。构造函数就像 initialize 已经创建对象到正确状态的方法(所以它就像 new 运算符调用的特殊方法,基于提供的参数)。
  • 谢谢你,@Pshemo,澄清了。对其他人:诚然,我本可以做更多的研究,但现在我只是很高兴看到反对票可以降到多低......
  • @MichaelStachowsky 这真是个坏主意。你看,人们实际上可以决定用垃圾邮件标记这样的评论。提出一个“不好的问题”是一回事......但是为了学习目的而去“嘿,让我们保留它”......不是一个好主意。如果你同意你提出了一个不好的问题:那么改进或删除它。

标签: java


【解决方案1】:

要生成对象,您需要调用超类的构造函数。它必须在构造函数的第一行。如果您不添加该行,java 会自动调用不带参数的超类构造函数(例如有一个不可见的 super() )。这又回到了 Object 类本身。这样,当您构造一个对象时,您有意(或者如果您不编写 super(),则不会)调用所有超类的构造函数。

如果超类没有无参数构造函数,如果您不使用正确的参数调用超构造函数,则会在子类中出现编译错误(因为这不能自动工作)。

当您创建一个类型 Particle 时,它​​首先创建一个 Object,然后将该对象扩展为 Geometry,然后扩展为 Particle。我希望我解释得当;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2021-09-19
    • 1970-01-01
    • 2013-10-20
    • 2012-12-17
    相关资源
    最近更新 更多