- 如果父类拥有无参构造方法(无论隐式的还是显式的)且子类中的构造方法又没有明确指定调用父类的哪个构造方法,则子类中没有调用该子类其它构造方法的构造方法使用super()隐式调用父类的无参构造方法,如下代码:
public class Father {
public Father() {
System.out.println("父类构造方法");
}
}
//创建Father父类并创建无参构造方法
public class Son extends Father {
public Son() {
System.out.println("子类构造方法");
}
public static void main(String[] args) {
new Son();
}
}
//创建Son子类并创建无参构造方法
执行结果为
可以看到,显然父类方法被调用了,原因是我们是用super()来调用父类的构造方法,但是在此时,父类有无参构造方法,同时子类中的构造方法没有明确调用父类哪个构造方法,于是在子类构造方法方法体的第一行会默认有一个super()来调用父类的无参构造方法
public class Father {
public Father() {
System.out.println("父类构造方法");
}
}
public class Son extends Father {
public Son() {
super(); //前一段代码的实质,在这一行有super()隐式调用了父类无参构造方法
System.out.println("子类构造方法");
}
public static void main(String[] args) {
new Son();
}
}
那么如果我们明确了子类调用哪个父类构造方法呢?
在这段代码中,我们在父类里加入了一个有参构造方法,并且子类明确使用super调用父类的有参构造方法,此时执行程序,可以看到父类的无参构造方法不再被调用。
除此之外,还有一种情况可以不让父类的无参构造方法被调用,那就是在子类的构造方法中先调用了本类的其他构造方法
- •如果父类没有无参构造方法(无论隐式的还是显式的),则要求子类构造方法必须直接或间接指定调用父类哪个构造方法并且放在有效代码第一行,如下代码: 如果不如此做,那么程序会报错。
因此我们可以总结说:子类必须调用父类的构造方法