这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
5.2.5、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()方法,重写了父类SuperClass中的方法。为了访问父类中的printMethod()方法,子类SubClass必须使用super关键字。编译并执行SubClass输出如下:
Printed in Superclass.
Printed in Subclass
子类构造器
下面的示例说明了如何使用super关键字调用父类构造器。前面的例子中,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的构造器为止。事实上,这被称为构造器链 ,当类有很长的层级关系时,尤其要注意这一点。