使用Java类/继承时出错

时间:2013-06-09 20:41:54

标签: java class inheritance methods superclass

我在修复此错误时遇到问题。有人可以帮忙吗?我的提示和代码发布在下面。

  

编写一个封装矩形的超类。矩形有两个属性,表示矩形的宽度和高度。它有返回周长和矩形区域的方法。这个类有一个子类,封装了一个平行六面体或盒子。平行六面体有一个矩形作为基础,另一个属性是它的长度。它有两种计算和返回其面积和体积的方法。您还需要包含一个客户端类来测试这两个类。

            public class Rectangle1
        {

        protected double width;
        protected double height;


        public Rectangle1(double width, double height){
        this.width = width;
        this.height = height;


        }

        public double getWidth(){
        return width;
        }

        public void setWidth(double width) {
        this.width = width;

        }
        public double getHeight(){
        return height;

        }

        public void setHeight(double height){
        this.height = height;

        }



        public double getArea(){
        return width * height;
        }

        public double getPerimeter(){
        return 2 * (width + height);

        }
        }

    public class Box extends Rectangle1 {
        protected double length;

        public Box(double length){
            this.length = length;
        }

        public double getLength(){
            return length;
        }

        public void setLength(double length){
            this.length = length;
        }

        public double getVolume(){
            return width * height * length;
        }
    }

    public class TestRectangle {

    public static void main(String[] args) {

    Rectangle1 rectangle = new Rectangle1(2,4);
    Box box = new Box(5);

    System.out.println("\nA rectangle " + rectangle.toString());
    System.out.println("The area is " + rectangle.getArea());
    System.out.println("The perimeter is " +rectangle.getPerimeter());
    System.out.println("The volume is " + box.getVolume());
    }
    }

错误发生在

public Box(double length){
    this.length = length;
}

Eclipse IDE中的错误消息如下:

  

隐式超级构造函数Rectangle1()未定义。必须显式调用另一个构造函数。

当我尝试运行它时,它会给我:

  

线程“main”java.lang.Error中的异常:未解决的编译问题:           隐式超级构造函数Rectangle1()未定义。必须显式调用另一个构造函数

    at Box.<init>(Box.java:4)
    at TestRectangle.main(TestRectangle.java:7)

有人可以告诉我如何修复此错误吗?

3 个答案:

答案 0 :(得分:1)

您的 base Rectangle1有一个构造函数:

public Rectangle1(double width, double height) {
    this.width = width;
    this.height = height;
}

因为您编写了构造函数,所以默认的 no aruments 构造函数将不存在,因此super()将找不到正确的构造函数。您应该在super(0, 0)构造函数中写下:Box,它将匹配Rectangle1构造函数。

答案 1 :(得分:1)

首先,每个子类必须调用super(...)作为每个构造函数中的第一个语句。这有点痛苦,因此Java在没有调用super()的任何构造函数的开头添加了对super(...)的调用。由于Rectangle1没有没有参数的构造函数,因此Java尝试调用super()不起作用,您需要添加自己的构造函数。 Peter和Maroun报道了这一点。

更大的问题是你没有想过Box是什么。什么是盒子(5)? Rectangle1具有宽度和高度,而Box具有宽度,高度和深度。形状是盒子(5)?你的Box构造函数应该类似于

public Box (double width, double height, double depth)
{
    super (width, height);
    this.depth = depth;
}

在这个构造函数中,您可以看到参数告诉您需要了解的关于Box的所有内容,并且对super(height, width)的调用负责将所有矩形内容委托给基类。

答案 2 :(得分:0)

您必须调用您定义的超类构造函数。只有在未定义默认构造函数时,才存在默认构造函数。

此外,您不应尝试初始化由父级初始化的字段,因为这会破坏封装。我建议你这样做。

public Box(double length){
    super(length, length);
}

这样您就可以在已定义的超类中调用构造函数,并让它设置它负责的字段。