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

时间:2012-05-08 23:52:15

标签: java superclass

我正在处理一个扩展JFrame的课程。

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

7 个答案:

答案 0 :(得分:88)

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

一个例子,显式调用super()可以对帧的标题进行一些额外的控制:

class MyFrame extends JFrame
{
    public MyFrame() {
        super("My Window Title");
        ...
    }
}

答案 1 :(得分:18)

如果您不自行完成对父类的空构造函数super()的调用,则会自动完成。这就是你从未在代码中做到这一点的原因。这是为你完成的。

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

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

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

答案 2 :(得分:2)

我们可以使用超级方法

访问超类元素

考虑我们有两个类,Parent类和Child类,以及方法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();
        }
    }

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我们可以使用super()

访问SuperClass成员

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

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中的名称。因此,要引用继承自Superclass的printMethod(),Subclass必须使用限定名,使用super,如图所示。编译和执行Subclass将打印以下内容:

Printed in Superclass.
Printed in Subclass

答案 5 :(得分:0)

以上答案都没有回答“为什么”。找到了一个很好的解释here

<块引用>

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

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

干杯

答案 6 :(得分:0)

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

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

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

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

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