Super关键字

调用父类 (Superclass) 的成员或者方法

  • 调用父类的构造函数

1.调用父类 (Superclass) 的成员或者方法

如果你的方法覆写一个父类成员的方法, 你可以通过 super 关键字调用父类的方法. 考虑下面的父类:

public class Superclass {

    public void printMethod() {
            System.out.println("Printed in Superclass.");
        }
}

 

下面是一个子类 (subclass), 叫做 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();
    }
}

 

输出

Printed in Superclass.
Printed in Subclass

 

2.调用父类的构造函数

使用 super 关键字调用父类的构造函数. 下面的 MountainBike 类是 Bicycle 类的子类. 它调用了父类的构造方法并加入了自己的初始化代码:

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

 

调用父类的构造体必须放在第一行,未放在第一行,则会显示super(parameter list);错误

使用

super();

 

或者:

super(parameter list);

 

通过 super(), 父类的无参构造体会被调用. 通过 super(parameter list), 父类对应参数的构造体会被调用.

注意: 构造体如果没有显式的调用父类的构造体, Java 编译器自动调用父类的无参构造. 如果父类没有无参构造, 就会报错 ( compile-time error).

 

在Java中,子类的构造过程中,必须 调用其父类的构造函数, 是因为有继承关系存在时, 子类要把父类的内容继承下来, 通过什么手段做到的? 这样: 当你new一个子类对象的时候, 必须首先要new一个父类的对象出来, 这个父类对象位于子类对象的内部, 所以说,子类对象比父类对象大, 子类对象里面包含了一个父类的对象, 这是内存中真实的情况.

构造方法是new一个对象的时候, 必须要调的方法, 这是规定, 要new父类对象出来, 那么肯定要调用其构造方法, 所以 第一个规则:子类的构造过程中,必须 调用其父类的构造方法

一个类, 如果我们不写构造方法, 那么编译器会帮我们加上一个默认的构造方法, 所谓默认的构造方法, 就是没有参数的构造方法, 但是如果你自己写了构造方法, 那么编译器就不会给你添加了

所以有时候当你new一个子类对象的时候,肯定调用了子类的构造方法,但是在子类构造方法中我们并没有显示的调用基类的构造方法,就是没写,如:super(); 并没有这样写,但是

第二个规则:如果子类的构造方法中没有显示的调用基类构造方法,则系统默认调用基类无参数的构造方法

注意:如果子类的构造方法中既没有显示的调用基类构造方法,而基类中又没有默认无参的构造方法,则编译出错,所以,通常我们需要显示的:super(参数列表),来调用父类有参数的构造函数

 

super()和this在构造体中的使用:

this() 在同一个类的构造体被调用. this("toto","tata",1)相当于调用对应参数的构造体.

super() 用来调用父类构造体.

posted @ 2019-02-27 11:19  Frances_FKYM  阅读(145)  评论(0)    收藏  举报