77

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

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

4

7 回答 7

130

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

一个示例,其中显式调用super()为您提供了对框架标题的一些额外控制:

class MyFrame extends JFrame
{
    public MyFrame() {
        super("My Window Title");
        ...
    }
}
于 2012-05-09T00:05:58.437 回答
34

super()当您不自己进行调用时,会自动调用父类的空构造函数。这就是您不必在代码中执行此操作的原因。它是为你完成的。

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

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

作为旁注,有人说,为了清楚起见,通常最好手动进行调用。

于 2012-05-08T23:53:45.150 回答
2

我们可以使用 super 关键字访问超类元素

考虑我们有两个类,父类和子类,具有不同的方法 foo 实现。现在在子类中,如果我们想调用父类的方法 foo,我们可以通过 super.foo(); 我们还可以通过 super 关键字访问父元素。

    class parent {
    String str="I am parent";
    //method of parent Class
    public void foo() {
        System.out.println("Hello World " + str);
    }
}

class child extends parent {
    String str="I am child";
    // different foo implementation in child Class
    public void foo() {
        System.out.println("Hello World "+str);
    }

    // calling the foo method of parent class
    public void parentClassFoo(){
        super.foo();
    }

    // changing the value of str in parent class and calling the foo method of parent class
    public void parentClassFooStr(){
        super.str="parent string changed";
        super.foo();
    }
}


public class Main{
        public static void main(String args[]) {
            child obj = new child();
            obj.foo();
            obj.parentClassFoo();
            obj.parentClassFooStr();
        }
    }
于 2017-06-23T10:56:29.790 回答
1

它只是调用超类的默认构造函数。

于 2012-05-08T23:55:59.230 回答
1

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

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

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

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

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

于 2021-04-03T14:28:51.217 回答
1

我们使用 super 关键字来调用超类的成员。

由于子类从其父类继承所有成员(字段、方法、嵌套类),并且由于构造函数不是成员(它们不属于对象。它们负责创建对象),因此它们不会被子类继承。

因此,如果我们需要为超类创建对象,我们必须显式地调用父构造函数,以便构造函数链保持连接。在创建对象时,只能调用一个构造函数。通过 super,我们可以在需要时从当前构造函数中调用另一个构造函数。

如果您正在考虑为什么它存在于不扩展任何其他类的类,那么请记住默认情况下每个类都遵循对象类。因此,在构造函数中保留 super 是一个好习惯。

注意:即使您的第一条语句中没有 super(),编译器也会为您添加它!

于 2021-06-10T18:24:26.500 回答
0

我们可以使用 super 关键字访问超类成员

如果您的方法覆盖了其超类的方法之一,您可以通过使用关键字来调用被覆盖的方法super。您也可以使用 super 来引用隐藏字段(尽管不鼓励隐藏字段)。考虑这个类,超类:

public class Superclass {

    public void printMethod() {
        System.out.println("Printed in Superclass.");
    }
}

// 这是一个名为 Subclass 的子类,它覆盖printMethod()

public class Subclass extends Superclass {

    // overrides printMethod in Superclass
    public void printMethod() {
        super.printMethod();
        System.out.println("Printed in Subclass");
    }
    public static void main(String[] args) {
        Subclass s = new Subclass();
        s.printMethod();    
    }
}

在 Subclass 中,简单名称printMethod()是指在 Subclass 中声明的名称,它覆盖在 Superclass 中的名称。因此,要引用printMethod()继承自 Superclass,Subclass 必须使用限定名称,使用 super 如图所示。编译和执行子类打印以下内容:

Printed in Superclass.
Printed in Subclass
于 2015-08-11T12:09:15.543 回答