猿问

即使子类已经定义了构造函数,父类是否也总是需要一个默认的或无参数的构造函数?

我无法编译此代码。


class Horse {

    private int age;

    Horse(int age) {

        this.age = age;

    }

}


class Pony extends Horse {

    private int age;

    Pony(int age) { //here compiler complains about no default constructor in parent class

        this.age = age;

    }

}

我知道当父类只有带有参数的构造函数时,您必须为子类定义一个构造函数,这就是我所做的。但是,编译器抱怨父类没有默认构造函数。


我得出父类总是需要默认或无参数构造函数的结论是否正确?如果我希望父类和子类只有带参数的构造函数怎么办?


胡子哥哥
浏览 107回答 2
2回答

呼如林

我得出父类总是需要默认或无参数构造函数的结论是否正确?不。子类构造函数必须做的第一件事是调用其中一个超类构造函数。如果你不这样做,那么编译器会为你调用超类的无参数构造函数。但是,如果超类没有,那当然会失败。你的代码应该是:class Pony extends Horse {    Pony(int age) {        super(age);    }}看,超类已经有一个年龄字段,可能还有使用该字段的方法。所以在子类中重新声明一个是错误的并且适得其反。

心有法竹

要使其编译为您需要调用super(int)而不是super()隐式调用。Pony(int age) {     super(age);         this.age = age; }然后您可能会注意到两者Horse都有Pony完全相同的字段,其中包含完全相同的数据。如果类基于 ( ) 已经定义了这个字段,为什么还Pony需要这个字段?agePonyHorsePony(int age) {     super(age); }这就是继承的美妙之处:您可以使用基类中已经编写的任何内容。但是,编译器抱怨父类没有默认构造函数。它抱怨是因为,正如我上面提到的,它无法调用super().如果构造函数体不以显式构造函数调用开始,并且声明的构造函数不是原始类 Object 的一部分,则构造函数体隐式地以超类构造函数调用“super();”开始,这是对构造函数的调用它的直接超类不带参数。如果我希望父类和子类只有带参数的构造函数怎么办?然后子类应该总是明确声明它想调用父类的构造函数。我得出父类总是需要默认或无参数构造函数的结论是否正确?不,有一个没有默认构造函数的父类是可以的,只要它的子类不调用super().
随时随地看视频慕课网APP

相关分类

Java
我要回答