为什么在构造函数中调用super()?

mar*_*ark 56 java superclass

我正在处理一个扩展的类JFrame.

它不是我的代码,它super在开始构建GUI之前调用它.我想知道为什么这样做,因为我总是只是访问超类的方法而不必调用super();

Aer*_*diR 97

super()对于具有父级的所有类(这是Java中的每个用户定义的类)都存在一个没有参数的隐式调用- 因此通常不需要显式调用它.但是,如果父的构造函数接受参数,并且您希望指定它们,则可以使用super()带参数的调用.此外,如果父的构造函数接受参数,并且它没有默认的无参数构造函数,则需要super()使用参数调用.

一个例子,显式调用super()给你一些额外的控制帧的标题:

class MyFrame extends JFrame
{
    public MyFrame() {
        super("My Window Title");
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • _也很重要:__superclass_构造函数**的调用必须是_subclass_构造函数中的第一行**.相关信息:[为什么this()和super()必须是构造函数中的第一个语句?](/sf/ask/81784181/以待的先声明-IN-A-构造函数) (3认同)

Tim*_*ote 20

super()当您不自己完成对父类的空构造函数的调用时,将自动完成.这就是你从未在代码中做到这一点的原因.它是为你完成的.

当您的超类没有no-arg构造函数时,编译器将要求您super使用适当的参数进行调用.编译器将确保您正确地实例化该类.所以这不是你必须担心的事情.

无论是否super()在构造函数中调用,都不会影响调用父类方法的能力.

作为旁注,有人说为了清楚起见,通常最好手动拨打电话.


jum*_*key 9

上述答案都没有回答“为什么”。

在这里找到了一个很好的解释:

子类可以有自己的私有数据成员,因此子类也可以有自己的构造函数。

子类的构造函数只能初始化子类的实例变量。因此,当实例化子类对象时,子类对象也必须自动执行超类的构造函数之一。

您可能还想在此处阅读有关super关键字的所有内容,或在此处观看有关super关键字的所有内容。