首先看一下代码:
public class Fu {
public Fu() {
System.out.println("父中无参构造方法被调用");
}
public Fu(int age) {
System.out.println("父中带参构造方法被调用");
}
}
public class Zi extends Fu {
public Zi() {
System.out.println("子中无参构造方法被调用");
}
public Zi(int age) {
System.out.println("子中带参构造方法被调用");
}
}
public class TestDemo {
public static void main(String[] args) {
Zi z=new Zi();
/*父中无参构造方法被调用
子中无参构造方法被调用*/
Zi z1=new Zi(2);
/*
父中无参构造方法被调用
子中带参构造方法被调用
*/
}
}
最终的输出是:
父中无参构造方法被调用
子中无参构造方法被调用
父中无参构造方法被调用
子中带参构造方法被调用
可以发现:
1.子类调用构造方法创建对象,会自动调用父类的无参构造方法。
2.不管子类使用什么构造方法创建对象,都会自动调用父类的无参构造方法。
也就是,父类的带餐构造不会被调用。
这是因为,在子类调用构造方法的时候,默认会执行super();这个语句,这就是去调用父类的无参构造方法。
以上是官方一点的解释。
下面说一下我的理解:
首先,一个父类可以有一个无参构造方法,然后还可以有无数个带参构造方法(当然参数列表要不一样,也就是方法重载的作用),那么同理,子类也可以有一个无参构造方法,也可以有无数个带参数方法,你可以保证一个子类继承父类,但是不能保证子类和父类的带餐构造方法的参数列表保持一致,因为即使参数列表不一致,这两个类也可以构成继承的关系。
所以,由于参数列表不能保持一致,那么子类通过其中一个带参构造方法去创建对象的时候,子类就不知道去默认访问父类的哪个带参构造方法,所以开发Java语言的人就让其默认调用父类的无参构造方法,仔细一想,还是完全符合常理的。