在构造子类时。子类创建完,即拥有父类的属性,所以在构造子类之前一定会构造父类。 其实子类的所有构造方法的第一行都有一条隐示super()或者显示的super()
隐示super() 先说一下什么情况下会有隐示的super()。 1.子类构造函数中没写super()并且子父类具有无参构造函数。那么子类第一行便会自动一条隐身的语句super 父类代码:具有无参构造函数 public class Fruit { private String name; public Fruit() { } public Fruit(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }子类代码:可以看到子类的两个构造函数都没有显示的写super(),那么在构造子类的时候就会自动产生super(),并且执行父类的无参构造函数
public class Apple extends Fruit { boolean isRed; public Apple() { } public Apple(boolean isRed) { this.isRed = isRed; } public boolean isRed() { return isRed; } public void setRed(boolean red) { isRed = red; } }如果父类没有无参构造函数,那么不能自动生成super(),编译会报错:There is no default constructor available in xxxx
显示的super() 如果父类没有无参构造函数,或者需要调用父类的有参构造函数就需要显示的调用super(); 父类:没有无参构造函数 public class Fruit { private String name; public Fruit(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }子类:显示调用父类的构造函数,并且传入参数
public class Apple extends Fruit { boolean isRed; public Apple(boolean isRed,String name) { super(name); this.isRed = isRed; } public boolean isRed() { return isRed; } public void setRed(boolean red) { isRed = red; } }