Java继承错误:隐式超级构造函数未定义

时间:2012-02-04 18:31:29

标签: java inheritance constructor

我是Java的新手,只是学习OOP概念。请查看我的代码。我收到以下错误.- 隐式超级构造函数未定义。

class BoxSuper
{
    int height;
    int length;
    int width;

    BoxSuper(BoxSuper obj)
    {
        height=obj.height;
        length=obj.length;
        width=obj.width;
    }
    BoxSuper(int a,int b,int c)
    {
        height=a;
        length=b;
        width=c;
    }
    BoxSuper(int val)
    {
        height=length=width=val;
    }
    int volume()
    {
        return height*length*width;
    }
}

class BoxSub extends BoxSuper
{
    int weight;
    BoxSub(int a,int b,int c,int d)
    {
        height=a;
        length=b;
        width=c;
        weight=d;
    }
}

2 个答案:

答案 0 :(得分:11)

您收到此错误,因为BoxSuper没有no-arg构造函数。在BoxSub中构造函数调用期间,如果没有定义超级构造函数,则调用Java尝试自动调用no-arg super()构造函数。

在BoxSuper中定义一个超级构造函数调用,如下所示:

class BoxSub extends BoxSuper
{
    int weight;
    BoxSub(int a,int b,int c,int d)
    {
        super(a, b, c);
        weight=d;
    }
}

或在BoxSuper中定义一个无参数构造函数:

class BoxSuper
{
    int height;
    int length;
    int width;

    BoxSuper(){}
...

答案 1 :(得分:7)

构造函数始终调用超级构造函数, 始终 。如果没有对超级构造函数进行显式调用,则编译器会尝试将其设置为调用默认的无参数构造函数。如果不存在默认的无参数构造函数,则会显示您看到的编译错误,编译将失败。

你的情况下的解决方案是显式地调用相应的超级构造函数作为你Box的构造函数的第一行,如果你想到它,这也很有意义,因为你想要初始化超级与a,b和c一样,正如其构造函数中所写:

class BoxSub extends BoxSuper
{
    int weight;
    BoxSub(int a,int b,int c,int d)
    {
        super(a, b, c);
        // height=a;
        // length=b;
        // width=c;
        weight=d;
    }
}