1

我正在开发以下代码....

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 类中定义了默认构造函数,但它仍然显示编译时错误,请解释

4

4 回答 4

7

您的父类 P 显式定义了一个构造函数,因此不会自动添加无参数构造函数。当您为类 D 编写无参数构造函数时,没有使用如下所述的 super 关键字为类 P 调用特定构造函数时,

Class D extends P {
    public D() {
        super(10);        
    }
}

您正在指示它调用 P 的无参数构造函数。由于 P 只有您定义的构造函数,它不能调用 P 的无参数构造函数。

简单来说,D 的每个对象都将具有 P 的一部分。但是它不知道如何初始化/构造该 P 部分,因为它没有无参数构造函数。

于 2012-04-29T04:56:23.023 回答
1

在这个构造函数里面:

public D()
{ 
    // no call to super?? implicit call to super()
}

对超类的空构造函数有一个隐式调用(在您的情况下不存在)

要么在超类中实现一个空构造函数,要么显式调用参数化构造函数,例如:

public D()
{ 
    super(1);
}

我建议您也阅读本教程

于 2012-04-29T04:56:29.203 回答
1

在子类中,如果您不显式调用超类构造函数,则必须有 VM 可以为您调用的默认超类构造函数。

在超类中,如果显式定义构造函数,则编译器不会生成默认的无参数构造函数。

因此,在您展示的情况下,您在超类中定义了一个非默认构造函数,这阻止了编译器生成默认的无参数构造函数。然后在子类中,您没有显式调用超类中的构造函数。编译器试图生成一个无参数的超类构造函数调用,但没有找到合适的构造函数来调用。

于 2012-04-29T04:56:34.517 回答
0

在创建类 D 的实例时,首先调用 P 的构造函数(因为 D 也是 P)。问题是不能调用 P 的构造函数,因为必须向它提供一个值,而这是你目前没有做的事情。为了解决这个问题,D 的构造函数中的第一行必须是 super( value ),而 value 可以是发送给 D 的构造函数的参数,或者..任何你想要的东西(如果你想把 D 的构造函数保留为默认值)。

您可以在调试中逐步完成它,它可以帮助清除问题。

于 2012-04-29T05:03:03.217 回答