Java中的子类
我的朋友给了我这个任务,我正在努力完成最后一个任务,它要求我:
"implement a class called Square that represents a square. Class Square must be derived from Rectangle. Make sure you override toString()."
我甚至不认为我已经接近得到它,但任何帮助都将是伟大的
矩形。爪哇
public class Rectangle {
public double width;
public double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public double getArea() {
return width * height;
}
public double getPerimeter() {
return 2*width+2*height;
}
@Override
public String toString() {
return "Rectangle[width "+width+",height "+height+"]Area:"+getArea()+",Perimeter:"+getPerimeter();
}
public static void main(String[] args) {
double width = (10);
double height = (10);
Rectangle rectangle = new Rectangle(width, height);
System.out.println(rectangle);
}
}
斯夸尔。爪哇
public class Sqaure extends Rectangle {
private final double width, height, area, perimeter;
public Sqaure(double width, double height) {
this.width = width;
this.height= height;
}
public static void main(String[] args) {
double width = (10);
double height = (10);
Sqaure sqaure = new Sqaure(width, height);
System.out.println(square);
}
}
# 1 楼答案
您应该注意,子类和超类不需要主类。应该有一个单独的主类来初始化这些对象
要重写方法,请使用
@Override
。之所以这样做,是因为可以将子类初始化为超类,例如Rectangle square = new Square(...)
。调用square.toString()
时,输出不应该是Rectangle[width...]
,而应该是Square[width...]
如果你不重写一个方法,那么它的功能将与超级类的功能相同(对于
getArea()
和getPerimeter()
来说,这很好)请注意:
Square
通常只有一个参数,而不是两个,因为这就是它成为Square
的原因# 2 楼答案
你的“朋友”可能希望你使用超级构造函数。正如Peter Lawrey所解释的,你不需要在你的扩展课程中定义宽度和高度。以这种方式隐藏字段被认为是一种不好的做法。Square类将根据extends关键字从其超类矩形继承这些字段:
这就是在您的案例中使用超级构造函数的方式
这将调用超级类的构造函数:
通过这样做,它将把正方形的继承字段宽度和高度分配给相同的值,使其成为正方形。继承的方法getArea()和getPermission()仍然有效,因此不需要重写它们
您需要重写toString()方法,因为它包含单词Rectangle。我相信你自己能弄明白
# 3 楼答案
只需要重写构造函数和
toString()
。由于正方形只是一个边长相等的特殊矩形,您可以将其初始化为相同的值,所有其他方法都将按预期工作:请注意,在现实世界中,在这种情况下,您可能不会使用继承,因为这会引入一些模糊性,您仍然可以使用矩形构造函数创建正方形,人们可能会被误导,使用instanceof检查来确定给定的矩形是否为正方形。相反,我们可能会添加一个单参数构造函数,并检查toString中的宽度/高度等效性