为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡子哥哥 2023-04-26 14:32:58
我无法编译此代码。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;    }}我知道当父类只有带有参数的构造函数时,您必须为子类定义一个构造函数,这就是我所做的。但是,编译器抱怨父类没有默认构造函数。我得出父类总是需要默认或无参数构造函数的结论是否正确?如果我希望父类和子类只有带参数的构造函数怎么办?
查看完整描述

2 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

我得出父类总是需要默认或无参数构造函数的结论是否正确?


不。子类构造函数必须做的第一件事是调用其中一个超类构造函数。如果你不这样做,那么编译器会为你调用超类的无参数构造函数。但是,如果超类没有,那当然会失败。


你的代码应该是:


class Pony extends Horse {

    Pony(int age) {

        super(age);

    }

}

看,超类已经有一个年龄字段,可能还有使用该字段的方法。所以在子类中重新声明一个是错误的并且适得其反。


查看完整回答
反对 回复 2023-04-26
?
心有法竹

TA贡献1866条经验 获得超5个赞

要使其编译为您需要调用super(int)而不是super()隐式调用。

Pony(int age) {
    super(age);
        this.age = age;
}

然后您可能会注意到两者Horse都有Pony完全相同的字段,其中包含完全相同的数据。如果类基于 ( ) 已经定义了这个字段,为什么还Pony需要这个字段?agePonyHorse

Pony(int age) {
    super(age);
}

这就是继承的美妙之处:您可以使用基类中已经编写的任何内容。


但是,编译器抱怨父类没有默认构造函数。

它抱怨是因为,正如我上面提到的,它无法调用super().

如果构造函数体不以显式构造函数调用开始,并且声明的构造函数不是原始类 Object 的一部分,则构造函数体隐式地以超类构造函数调用“super();”开始,这是对构造函数的调用它的直接超类不带参数。


如果我希望父类和子类只有带参数的构造函数怎么办?

然后子类应该总是明确声明它想调用父类的构造函数。


我得出父类总是需要默认或无参数构造函数的结论是否正确?

不,有一个没有默认构造函数的父类是可以的,只要它的子类不调用super().


查看完整回答
反对 回复 2023-04-26
  • 2 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信