我在修复此错误时遇到问题。有人可以帮忙吗?我的提示和代码发布在下面。
编写一个封装矩形的超类。矩形有两个属性,表示矩形的宽度和高度。它有返回周长和矩形区域的方法。这个类有一个子类,封装了一个平行六面体或盒子。平行六面体有一个矩形作为基础,另一个属性是它的长度。它有两种计算和返回其面积和体积的方法。您还需要包含一个客户端类来测试这两个类。
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)
有人可以告诉我如何修复此错误吗?
答案 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);
}
这样您就可以在已定义的超类中调用构造函数,并让它设置它负责的字段。