【问题标题】:Error using Java Classes/Inheritence使用 Java 类/继承时出错
【发布时间】:2013-06-05 12:33:14
【问题描述】:

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

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

            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() 未定义。必须显式调用另一个构造函数。

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

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

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

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

【问题讨论】:

    标签: java class inheritance methods superclass


    【解决方案1】:

    你的 baseRectangle1 有一个构造函数:

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

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

    【讨论】:

    • 感谢您的帮助。我该如何解决这个问题?
    【解决方案2】:

    首先,每个子类都必须调用super(...) 作为每个构造函数中的第一条语句。这有点麻烦,所以 Java 在没有调用 super(...) 的任何构造函数的开头添加了对 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) 的调用负责将所有矩形内容委托给基类。

    【讨论】:

      【解决方案3】:

      你必须调用你定义的超类构造函数。默认构造函数只有在你没有定义的时候才存在。

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-05-15
        • 2012-04-08
        • 2021-05-25
        • 1970-01-01
        • 2021-05-12
        • 2012-02-25
        • 2015-11-16
        • 1970-01-01
        相关资源
        最近更新 更多