# 使用关键字 super
# 访问超类成员
如果你的方法覆盖了它的一个超类的方法,你可以通过使用关键字 super 来调用重写的方法。您也可以使用 super 引用隐藏字段(虽然不鼓励隐藏字段)。考虑这个类,Superclass:
public class Superclass {
public void printMethod() {
System.out.println("Printed in Superclass.");
}
}
2
3
4
5
6
是一个叫做 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();
}
}
2
3
4
5
6
7
8
9
10
11
12
其中 printMethod()
是指在 Subclass 中声明的名称,该名称将覆盖 Superclass 其中的名称。
所以,要引用 Superclass 的 printMethod()
,Subclass 必须使用一个合格的名称,使用 super。编译和执行 Subclass 打印如下:
Printed in Superclass.
Printed in Subclass
2
# 子构造
以下示例说明如何使用 super 关键字来调用超类的构造函数。回想一下这个 Bicycle 例子的一个子类 MountainBike。这里是 MountainBike(子类)调用超类构造函数的构造函数,然后添加自己的初始化代码:
public MountainBike(int startHeight,
int startCadence,
int startSpeed,
int startGear) {
super(startCadence, startSpeed, startGear);
seatHeight = startHeight;
}
2
3
4
5
6
7
调用超类的构造函数必须是子类构造函数的第一行。
调用超类构造函数的语法是
super();
or:
super(parameter list);
2
3
super()
,超类无参数构造函数被调用。用 super(parameter list)
,带有匹配参数列表的超类构造函数被调用。
TIP
如果构造函数没有显式地调用超类构造函数,那么 Java 编译器会自动插入对超类的无参构造函数的调用。 如果超类没有没有参数的构造函数,你会得到一个编译时错误。Object 确实有这样的构造函数,所以如果 Object 是唯一的超类,没有问题。
如果一个子类的构造函数调用了它的父类的构造函数,无论是显式的还是隐式的,你可能会认为将会有一整个调用的构造函数链,一直返回到 Object 构造函数。事实上,情况就是如此。它被称为 构造函数链,并且当需要长时间的类下降时需要注意它。
← 隐藏的字段 Object 作为超类 →