关于建设者

时间:2012-04-29 04:52:00

标签: java

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

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 个答案:

答案 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的构造函数是默认的)。

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