java super的使用(翻译自Java Tutorials)

原文出自 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是唯一的父类,就不存在问题。

如果子类的构造方法调用父类的构造方法,不管显式还是隐式,你也许会思考整个构造方法经过所有对象的链路.事实上是存在的,它称之为构造方法链,而且你必须意识到,有一个同样的链路从最顶层的类返回。

原文地址:https://www.cnblogs.com/ggjucheng/p/2789722.html