2017-06-04 106 views
3

下面的代码(类的缩写版)我在Java视频教程中看到过。super()在没有继承的类的构造函数中

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(),而在另一个构造函数中使用super()。我对在视频教程中发现那种丑陋的代码并不感到惊讶。 YouTube是为lolcats。免费的视频教程大多数时间质量很差。 –

+2

如果没有明确指定,每个类都有一个超类:对象 –

回答

3

创建类的实例时会调用超类的构造函数。如果你的类明确地扩展了,有两种选择:

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

不带参数调用super()基本上意味着你调用一个默认的构造函数。这是没有必要的,因为即使你没有明确地做,它也会被调用。

由于java中的所有对象都隐式扩展Object,因此在创建类的实例时始终调用Object的默认构造函数。 super()只是使其明确。但是,为什么我们应该明确地加入已经很清楚的事情。此外,当您使用代码生成工具(例如Eclipse)时,IDE有时会添加该代码。

你可以阅读真的很好的说明了如何在一本书OCA制剂类/超工作consturtors:https://www.amazon.com/OCA-Certified-Associate-Programmer-1Z0-808/dp/1118957407

3

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

所以你的情况

public Address() { 
    super(); 
} 

效果是一样的

public Address() { 

}