[英]sub-classes in Java
我的朋友給了我這項任務,而我在最后一個方面苦苦掙扎,它要求我:
“實現一個名為Square的類,該類代表一個正方形。Square類必須從Rectangle派生。請確保重寫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);
}
}
除了構造函數和toString()
以外,無需覆蓋其他內容。 由於正方形只是邊長相等的特殊矩形,您可以將它們初始化為相同的值,所有其他方法將按預期工作:
public class Square extends Rectangle {
public Square(double width) {
super(width, width);
}
@Override
public String toString() {
return "Square[width:" + width + "]Area:" + getArea() +
",Perimeter:" + getPerimeter();
}
請注意,在現實世界中,在這種情況下,您可能不會使用繼承,因為這會引入一些歧義-您仍然可以使用矩形構造函數創建正方形,而且人們可能會誤導使用instanceof檢查來確定給定的矩形是一個正方形。 相反,可能會添加一個參數構造函數並檢查toString中的寬度/高度等效項。
您應該注意,子類和超類不需要主類。 您應該有一個單獨的主類,您可以在其中初始化這些對象。
要覆蓋方法,請使用@Override
。 這樣做是因為可以將子類初始化為超類,例如Rectangle square = new Square(...)
。 當您調用square.toString()
,輸出不應為Rectangle[width...]
,而應為Square[width...]
。
@Override
public String toString() {
return return "Square[width "+size+",height "+size+"]Area:"+getArea()+",Perimeter:"+getPerimeter();
}
如果不重寫方法,則該功能將與超類的功能相同(對於getArea()
和getPerimeter()
來說就很好了getPerimeter()
。
請注意: Square
通常只有一個參數而不是兩個參數,因為這就是使其成為Square
。 ;)
您的“朋友”可能想要您做的是使用超級構造函數。 正如Peter Lawrey所解釋的那樣,您無需在擴展類中定義寬度和高度。 以這種方式隱藏字段被認為是不好的做法。 Square類將基於extends關鍵字從其超類Rectangle繼承這些字段:
public class Sqaure extends Rectangle
這就是您可能在情況下使用超級構造函數的方式。
public Sqaure(double side) {
super(side, side);
}
這將調用超類的構造函數:
public Rectangle(double width, double height)
然后,它將Square的繼承字段的width和height分配給相同的值,使其成為正方形。 繼承的方法getArea()和getPerimeter()仍將起作用,因此無需重寫它們。
您將需要重寫toString()方法,因為它包含單詞Rectangle。 我相信您可以自己弄清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.