【问题标题】:super() in a constructor of a class without inheritance [duplicate]super() 在没有继承的类的构造函数中[重复]
【发布时间】:2017-06-04 09:15:46
【问题描述】:

我在 Java Video-Tutorial 中看到的以下代码(类的简化版本)。

public class Address {
    private String firstName;
    private String lastName;

    public Address() {
        super();
    }

    public Address(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    ...
}

那里显示的类没有extend 关键字。尽管如此,super() 在没有参数的构造函数中使用。

它调用了Object类的构造函数?我说的对吗?

但是为什么呢?

拨打super()的原因是什么?

【问题讨论】:

  • 你是对的,没有任何理由。无论如何都会调用Object 类的构造函数。
  • 无论该类是否具有 Object 以外的超类,显式调用 super() 始终是多余的,因为如果您不这样做,编译器会添加一个,作为对所有对象的第一条指令构造函数。发布的代码不一致,因为它在一个构造函数上使用了 super(),而在另一个构造函数中却没有。在视频教程中发现那种丑陋的代码我并不感到惊讶。 Youtube 适用于笑笑猫。免费视频教程大部分时间质量都很差。
  • 如果没有明确指定,每个类都有一个超类:Object
  • 很可能,youtube 教程的作者使用了一些默认设置来生成 IDE 代码。通常 super() 只是被省略。
  • @dvelopp 是的。我想这就是它发生在那里的真正原因。就像我想的那样,答案证实:没有更深层的原因。

标签: java inheritance


【解决方案1】:

这就是当你让你的 IDE 自动生成你的类的构造函数时你得到的。因为那个类没有扩展任何东西,所以调用 super 与调用对象类的构造函数是一样的,这实际上没有任何效果关于Address 类的实现

在你的情况下

public Address() {
    super();
}

一样
public Address() {

}

【讨论】:

    【解决方案2】:

    创建类的实例时会调用超类的构造函数。如果您的类显式扩展某事,有两种选择:

    • 如果超类有默认构造函数,则调用它;
    • 如果没有默认构造函数,您应该指定调用哪个构造函数并为其发送相应的参数。

    在没有参数的情况下调用 super() 基本上意味着您调用了默认构造函数。这不是必需的,因为即使您没有明确执行它也会被调用。

    由于java中的所有对象都隐式地扩展了Object,所以在你创建类的实例时都会调用Object的默认构造函数。 super() 只是让它明确。但是,我们为什么要在已经很清楚的事情上添加明确性。

    此外,IDE 有时会在您使用代码生成工具(例如 Eclipse)时添加它。

    您可以在 OCA 准备的书中阅读关于类/超类的构造函数如何工作的非常好的描述:https://www.amazon.com/OCA-Certified-Associate-Programmer-1Z0-808/dp/1118957407

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-26
      • 2015-05-25
      • 2015-08-22
      • 2021-06-30
      • 2017-03-11
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      相关资源
      最近更新 更多