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,系统则在执行子类构造器之前,隐式调用父类无参数的构造器。