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 (构造函数链),当有很长的类后代时你需要注意它。