1

我无法修复此错误。有人可以帮忙吗?我的提示和代码发布在下面。

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

            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)

有人可以告诉我如何解决这个错误吗?

4

3 回答 3

1

您的Rectangle1有一个构造函数:

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

因为你写了一个构造函数,默认的无参数构造函数是不存在的,所以super()会找不到合适的构造函数。你应该写:super(0, 0)在你的Box构造函数中,它将匹配Rectangle1构造函数。

于 2013-06-09T20:46:40.967 回答
1

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

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

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

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

于 2013-06-09T22:41:16.257 回答
0

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

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

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

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

于 2013-06-09T21:05:26.990 回答