一个没有继承关系的类中构造函数中的super()方法是什么意思?

5

以下代码是我在Java视频教程中看到的类的缩短版本。

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()"?

4
没错,而且没有理由。无论如何,Object类的构造函数都会被调用。 - Eran
3
无论类是否拥有除Object以外的超类,显式调用super()���是多余的,因为如果您没有调用,编译器会将其作为所有构造函数的第一条指令添加上去。所发布的代码不一致,因为它在一个构造函数中使用了super(),但在另一个构造函数中没有使用。我对在视频教程中发现这种丑陋的代码并不感到惊讶。Youtube适合放萌宠视频。免费的视频教程大部分质量都很差。 - JB Nizet
2
每个类都有一个超类,如果没有明确指定,则为Object。 - Mark Rotteveel
很可能,YouTube教程的作者使用了IDE代码生成的一些默认设置。通常情况下,super()被省略了。 - dvelopp
@dvelopp 是的。我想这就是它发生在那里的真正原因。就像我所猜测的,答案也证实了:没有更深层次的原因。 - cluster1
2个回答

4
当您让IDE自动生成类的构造函数时,会得到这样的结果。由于该类没有继承任何内容,因此调用super与调用对象类的构造函数相同,实际上对
类的实现没有任何影响。
所以在您的情况下:
public Address() {
    super();
}

相同。
public Address() {

}

4
当你创建一个类的实例时,超类的构造函数也会被调用。如果你的类明确地扩展了某个类,则有两个选项:
  • 如果超类有默认构造函数,则会调用它;
  • 如果没有默认构造函数,则应指定要调用哪个构造函数并发送相应的参数。
调用不带参数的super()基本上意味着你调用默认构造函数。这是不必要的,因为即使你不明确调用,它也会被调用。
由于Java中所有的对象都隐式地扩展Object,因此在创建类的实例时始终会调用Object的默认构造函数。super()只是使它更明确。但是,为什么我们需要给已经很清楚的东西加上显性呢?
此外,当你使用代码生成工具(如Eclipse)时,有时IDE会自动添加它。
你可以在准备OCA考试的书籍中阅读关于类/超类构造函数如何工作的非常好的描述:https://www.amazon.com/OCA-Certified-Associate-Programmer-1Z0-808/dp/1118957407

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接