Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
如果你的方法覆盖其超类的方法之一,则可以通过使用关键字 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 示例 MountainBike 是 Bicycle 的子类。这是 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),将调用具有匹配参数列表的超类构造函数。
Object 有 这样的构造函数,所以如果 Object 是唯一的超类,也没有问题。
如果子类构造函数显式或隐式地调用其超类的构造函数,你可能会认为将调用一整个构造函数链,一直回到 Object 的构造函数。事实上,情况就是这样。它被称为 constructor chaining (构造函数链),当有很长的类后代时你需要注意它。