文档

Java™教程
隐藏目录
使用关键字super
指引:学习Java语言
课程:接口和继承
章节:继承

使用关键字super

访问父类成员

如果你的方法覆盖了父类的方法,你可以通过使用关键字super来调用被覆盖的方法。你也可以使用super来引用隐藏的字段(虽然隐藏字段是不推荐的)。考虑这个类Superclass

public class Superclass {

    public void printMethod() {
        System.out.println("在父类中打印。");
    }
}

这是一个子类Subclass,它覆盖了printMethod()

public class Subclass extends Superclass {

    // 覆盖了Superclass中的printMethod
    public void printMethod() {
        super.printMethod();
        System.out.println("在子类中打印。");
    }
    public static void main(String[] args) {
        Subclass s = new Subclass();
        s.printMethod();    
    }
}

Subclass中,简单名称printMethod()指的是在Subclass中声明的方法,它覆盖了Superclass中的方法。因此,为了引用从Superclass继承的printMethod()Subclass必须使用限定名称,如示例中所示使用super。编译和执行Subclass会打印出以下结果:

在父类中打印。
在子类中打印。

子类构造方法

下面的示例说明了如何使用super关键字来调用父类的构造方法。回想一下Bicycle 示例,MountainBikeBicycle的子类。下面是MountainBike(子类)的构造方法,它调用了父类的构造方法,然后添加了自己的初始化代码:

public MountainBike(int startHeight, 
                    int startCadence,
                    int startSpeed,
                    int startGear) {
    super(startCadence, startSpeed, startGear);
    seatHeight = startHeight;
}   

调用父类构造方法必须是子类构造方法中的第一行。

调用父类构造方法的语法是

super();  
或者:
super(参数列表);

使用super()会调用父类的无参构造方法。使用super(参数列表)会调用父类具有相匹配参数列表的构造方法。


注意: 如果一个构造方法没有显式调用父类的构造方法,Java编译器会自动插入对父类的无参构造方法的调用。如果父类没有无参构造方法,将会产生编译错误。Object 这样的构造方法,所以如果Object是唯一的父类,就没有问题。

如果一个子类构造方法显式或隐式地调用了其父类的构造方法,你可能会认为会有一整条构造方法链被调用,一直回溯到Object的构造方法。事实上,确实是这样的。这被称为构造方法链,在存在长链的类衍生时,你需要注意它。


上一页:隐藏字段
下一页:作为超类的对象