原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/11/26/2789722.html
访问父类的成员
如果你覆盖了父类的方法,你可以通过super调用父类被覆盖的方法,也可以通过super引用被隐藏的变量(尽管隐藏变量是不推荐的方式).
假设父类是这样的:
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(),覆盖了父类的printMethod()方法,如果要引用父类的printMethod()方法,必须使用一个被修饰的名字,如上使用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(); or: super(parameter list);
super()是调用父类的无参构造方法, super(parameter list)是调用父类对应的参数的构造方法。
注意:如果子类不显式调用父类的构造方法,java编译器会自动插入一条调用父类的无参构造方法的指令,如果父类没有无参构造方法,会出现一个编译时异常.Object没有这个问题,如果object是唯一的父类,就不存在问题。
如果子类的构造方法调用父类的构造方法,不管显式还是隐式,你也许会思考整个构造方法经过所有对象的链路.事实上是存在的,它称之为构造方法链,而且你必须意识到,有一个同样的链路从最顶层的类返回。