java中继承与构造函数之间的关系

来源:www.jianshu.com 更新时间:2023-05-25 21:55

继承的对象会保存父类的成员,也包括父类所声明的变量。因此,在创建子类的新对象时,所有继承下来的构造函数也会被执行。执行子类的构造函数会先触发父类的构造函数,连锁反应一直到最上层的父类构造函数。父类的构造函数必须在子类构造函数之前结束。

super关键字的使用

在构造函数中只能使用super调用父类的构造函数。对super的调用必须是构造函数的第一个语句。在自定义的构造函数中调用super会把父类构造函数放在堆栈的最上方,然后一路执行到子类的构造函数。
example: 定义一个抽象类Animal

public abstract class Animal{
    private String name;
    public String getName(){
        return name; //父类定义了一个getter,会被子类继承
    }
    public Animal(String theName){
        name = theName;
    }
}

调用无参数的父类构造函数

example:

public class Duck extends Animal {
    int size;
    
    public Duck(int newSize){
        super(); //调用父类无参的构造函数
        size = newSize;
    }
}

如果我们没有调用super(), 编译器会自动加上super()的调用无参的父类构造函数。注意即使父类有多个构造函数,也只有无参的版本会被调用。

调用有参数的父类构造函数

public class Hippo extends Animal(){
    public Hippo(String name){
        super(name);//调用父类的有参的构造函数
    }
}

this关键字的使用

this用来从某个构造函数调用同一个类的另外一个构造函数(比如在无参的构造函数中调用同一个类中的有参的构造函数)。 this在java中可以看作是对对象本身的引用,只能出现在构造函数中,并且和super一样必须是第一行语句。每个构造函数可以选择super或者this,但不能同时调用两者。 应注意java中重载的构造函数只能用变量类型和数量区分,有相同的变量类型和数量的构造函数会被视为同一个构造函数从而无法通过编译
example:

class Hippo extends Animal{
    private String sex;
    public Hippo(){
        this("unknown");
    }

    public Hippo(String name){
        super(name);
        sex = "unknown";
    }
    public Hippo(String theSex, String name){
        super(name);
        sex = theSex;
    }
}