在Java中,如果一个类没有定义任何构造函数,那么编译器会默认为这个类提供一个无参的构造函数。
这个隐式的构造函数在继承的时候,子类会在自己的构造方法里面默认的调用这个构造函数。
但是,如果我们在父类中定义了一个有参构造函数,并且我们没有定义无参构造函数,那么我们必须要在子类的构造方法中显式调用自己定义的有参构造函数,否则就会编译错误。
也就是说,如果父类中没有无参构造函数,子类必须手动调用父类的构造函数,通过在子类的构造函数中使用`super`关键字来实现。
class Parent {
int x;
// 这是一个有参构造函数
Parent(int x) {
this.x = x;
}
}
class Child extends Parent {
// 子类没有定义构造函数,将默认继承父类的构造函数
// 如果父类没有无参构造函数,子类必须手动调用父类的构造函数
Child(int x) {
super(x); // 调用父类的有参构造函数
}
}
public class Test {
public static void main(String[] args) {
Child child = new Child(10); // 正确,子类手动调用父类的构造函数
}
}
如果子类定义了自己的构造函数,但父类没有无参构造函数,那么子类必须在其构造函数的第一行调用父类的某个构造函数,否则将无法编译通过。
这是因为子类需要初始化它从父类继承的成员变量和方法,而这通常是通过调用父类的构造函数来完成的。