我正在开发以下代码......
class P {
//public P(){}
public P(int i) {
}
}
class D extends P {
public D(){ // default constructor must be defined in super class
}
}
public class agf {
public static void main(String[] args) {
}
}
现在在类p中定义了显式参数化构造函数并且在类D中定义了默认构造函数但它仍然显示编译时错误,请解释
答案 0 :(得分:7)
您的父类P显式定义了一个构造函数,因此不会自动添加no-arg构造函数。当你为D类编写一个no-arg构造函数而没有使用super关键字对类P进行特定的构造函数调用时,如下所述,
Class D extends P {
public D() {
super(10);
}
}
你指示它调用P的no-arg构造函数。由于P只有你定义的构造函数,所以它不能调用P的no-arg构造函数。
简单来说,D的每个对象都有P的一部分。但它不知道如何初始化/构造P部分,因为它没有no-arg构造函数。
答案 1 :(得分:1)
在这个构造函数中:
public D()
{
// no call to super?? implicit call to super()
}
对超类的空构造函数有一个隐式调用(在你的情况下不存在)
在超类中实现一个空构造函数,或者显式调用参数化构造函数,例如:
public D()
{
super(1);
}
我建议你也阅读this tutorial。
答案 2 :(得分:1)
在子类中,如果不显式调用超类构造函数,则必须有一个VM可以为您调用的默认超类构造函数。
在超类中,如果显式地定义构造函数,则编译器不会生成默认的无参数构造函数。
因此,在您显示的情况中,您在超类中定义了一个非默认构造函数,这会阻止编译器生成默认的无参数构造函数。然后在子类中,您没有显式调用超类中的构造函数。编译器试图生成一个no-arg超类构造函数调用,但没有找到合适的构造函数来调用。
答案 3 :(得分:0)
在创建D类实例时,首先调用P的构造函数(因为D也是P)。问题是P的构造函数不能被调用,因为必须为它提供一个值,而这是你当前没有做的事情。 要解决这个问题,D的构造函数中的第一行必须是super( value ),而value可以是发送给D的构造函数的参数,或者是你想要的其他东西(如果你想要离开的话) D的构造函数是默认的)。
您可以在调试中逐步完成它,它可以帮助您解决问题。