子类与父类的构造方法有两点原则:
1、子类的构造方法必须调用父类的构造方法(原因为什么,可参考此链接https://blog.csdn.net/y_dzaichirou/article/details/54920715)
2、被子类调用的父类构造方法必须存在(这个显而易见)
下面举个栗子
class Fu{
String s;
}
class Zi extends Fu{
public Zi() {
System.out.println("Zi ");
}
}
public class Test {
public static void main(String[] args) {
Zi zi = new Zi ();
}
}
上面这个代码完全可以正常运行,你可能会觉得违背了最初的两条的原则,其实不是。
1)首先在父类中没有定义任何的构造方法,那么在这种情况下,Java虚拟机会自动给它加上一个无参的构造方法,则父类其实是这样的
class Fu{
String s;
public Fu() {
}
}
2)在子类中,由于在无参的构造方法中没有调用父类的构造方法,所以Java虚拟机同样会给它加上对父类无参构造方法的引用,所以,子类其实是这样的
class Zi extends Fu{
public Zi() {
super();//调用父类的无参构造方法
System.out.println("Zi ");
}
}
3)因此,完全满足上述的两条规则。