在构造子类时。子类创建完,即拥有父类的属性,所以在构造子类之前一定会构造父类。
其实子类的所有构造方法的第一行都有一条隐示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;
}
}