public class Wolf extends Animal {
public Wolf() {
super("熊大",2);
System.out.println("wolf无参构造器");
}
public static void main(String[] args) {
new Wolf();
}
}
class Animal extends Creature{
public Animal(){
System.out.println("Animal 无参构造器");
}
public Animal(String name) {
System.out.println("Animal 有参构造器,name:"+name);
}
public Animal(String name,int age) {
this(name);
System.out.println("Animal两个参数构造器,其age:"+age);
}
}
class Creature{
public Creature() {
System.out.println("Creature 无参构造器");
}
}
执行结果:
Creature 无参构造器
Animal 有参构造器,name:熊大
Animal两个参数构造器,其age:2
wolf无参构造器
如果Creature没有定义无参的构造器,而只定义了有参构造器,Animal构造器会报错:Implicit super constructor Creature() is undefined. Must explicitly invoke another constructor,编译不通过。
public class Wolf extends Animal {
public Wolf() {
super("熊大",2);
System.out.println("wolf无参构造器");
}
public static void main(String[] args) {
new Wolf();
}
}
class Animal extends Creature{
public Animal(){
System.out.println("Animal 无参构造器");
}
public Animal(String name) {
System.out.println("Animal 有参构造器,name:"+name);
}
public Animal(String name,int age) {
this(name);
System.out.println("Animal两个参数构造器,其age:"+age);
}
}
class Creature{
/*public Creature() {
System.out.println("Creature 无参构造器");
}*/
public Creature(String name) {
System.out.println("Creature 无参构造器"+name);
}
}
结论:
子类中所有的构造器默认都会访问父类中空参数的构造器
当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,且必须放在构造器的第一行
如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错