子类调用父类构造器原则

class Creature {
    {
        System.out.println("Creature的非静态初始块");
    }

    public Creature() {
        System.out.println("Creature的无参构造器");
    }

    public Creature(String name) {
        this();
        System.out.println("Creature带有name参数的构造器,name=" + name);
    }
}

class Animal extends Creature {
    {
        System.out.println("Animal的非静态初始块");
    }

    public Animal(String name) {
        super(name);
        System.out.println("Animal带一个参数的构造器,name=" + name);
    }

    public Animal(String name, int age) {
        this(name);
        System.out.println("Animal带两个参数的构造器,name=" + name + ",age" + age);
    }

}

class Wolf extends Animal {
    {
        System.out.println("Wolf的非静态代码块");
    }

    public Wolf() {
        super("灰太狼", 3);
        System.out.println("Wolf的无参数构造");
    }

    public Wolf(double weight) {
        this();
        System.out.println("Wolf带一个参数的构造器,weight=" + weight);
    }
}

class Test {
    public static void main(String[] args) {
        new Wolf(5.6);
    }
}

答案:
Creature的非静态初始块
Creature的无参构造器
Creature带有name参数的构造器,name=灰太狼
Animal的非静态初始块
Animal带一个参数的构造器,name=灰太狼
Animal带两个参数的构造器,name=灰太狼,age3
Wolf的非静态代码块
Wolf的无参数构造
Wolf带一个参数的构造器,weight=5.6

分析:考查子类初始化时,是如何调用父类构造器的。原则如下:
1.子类构造器执行体的第一行使用super显式调用父类构造器,系统将根据super中的实参来确定调用父类的哪个构造器
2.子类构造器执行体的第一行代码使用this显式调用本类中重载的构造器,系统根据this传入的实参,来确定本类的顶一个构造器(执行本类的另一个构造器时即进入第一种情况)
3.子类构造器执行体中既没有this,也没有super,系统则在执行子类构造器之前,隐式调用父类无参数的构造器。

你可能感兴趣的:(子类调用父类构造器原则)