文档

Java™ 教程-Java Tutorials 中文版
使用 super 关键字
Trail: Learning the Java Language
Lesson: Interfaces and Inheritance
Section: Inheritance

使用 super 关键字

访问超类成员

如果你的方法覆盖其超类的方法之一,则可以通过使用关键字 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

子类构造函数

以下示例说明如何使用 super 关键字来调用超类的构造函数。回想一下 Bicycle 示例 MountainBikeBicycle 的子类。这是 MountainBike(子类)构造函数,它调用超类构造函数,然后添加自己的初始化代码:

public MountainBike(int startHeight, 
                    int startCadence,
                    int startSpeed,
                    int startGear) {
    super(startCadence, startSpeed, startGear);
    seatHeight = startHeight;
}   

调用超类构造函数必须是子类构造函数中的第一行。

调用超类构造函数的语法是

super();  
或:
super(parameter list);

使用 super(),将调用超类无参构造函数。使用 super(parameter list),将调用具有匹配参数列表的超类构造函数。


注意: 如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类的无参构造函数的调用。如果超类没有无参构造函数,则会出现编译时错误。Object 这样的构造函数,所以如果 Object 是唯一的超类,也没有问题。

如果子类构造函数显式或隐式地调用其超类的构造函数,你可能会认为将调用一整个构造函数链,一直回到 Object 的构造函数。事实上,情况就是这样。它被称为 constructor chaining (构造函数链),当有很长的类后代时你需要注意它。


Previous page: Hiding Fields
Next page: Object as a Superclass