使用关键字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
Subclass Constructors
下面的示例说明如何使用super
关键字调用超类的构造函数。回想一下Bicycle的示例,MountainBike
是Bicycle
的子类。这是MountainBike
(子类)构造函数,该构造函数调用超类构造函数,然后添加其自身的初始化代码:
public MountainBike(int startHeight,
int startCadence,
int startSpeed,
int startGear) {
super(startCadence, startSpeed, startGear);
seatHeight = startHeight;
}
父类构造函数的调用必须是子类构造函数的第一行。
调用超类构造函数的语法是
super();
or:
super(parameter list);
使用super()
,将调用超类无参数构造函数。使用super(parameter list)
,将调用具有匹配参数列表的超类构造函数。
Note:
如果构造函数没有显式调用超类构造函数,则 Java 编译器会自动将调用插入到超类的无参数构造函数中。如果超类没有无参数构造函数,则将出现编译时错误。 Object
确实具有这样的构造函数,因此,如果Object
是唯一的超类,则没有问题。
如果子类构造函数显式或隐式调用其超类的构造函数,则您可能会认为将调用整个构造函数链,一直返回到Object
的构造函数。实际上就是这种情况。这称为构造函数链接,当类下降很 Long 时,您需要意识到这一点。