我在大學開始學習 Java,我們有一項作業要求我們使用形狀的超類和擴展形狀的子類。
這是完整的問題:
創建一個超類“Shape”,從中派生出兩個子類“Square”和“Rectangle”,并帶有計算正方形面積和矩形面積的函式。此外,函式“toString”顯示正方形和矩形資訊。從 square 派生出另一個子類“Cube”,其中包含一個函式來計算其面積,以及一個函式“toString”來顯示立方體資訊。”
我們需要做的是使用類計算形狀。我應該從哪里開始或繼續解決分配問題?
這是我認為我應該開始的地方,但需要一些指導
public class Shapes {
class Shape {
}
class Rectangle extends Shape {
}
class Square extends Shape {
}
}
uj5u.com熱心網友回復:
首先,Shapeclass 應該是abstract,因為您不會創建此類的任何特定物件,您只會將其用作“畫布”。這個類必須有一個抽象方法,我們稱之為getArea(),您必須在子類中覆寫它以適應每種形狀的指定要求。
該toString()方法屬于Object類,因為Java中的每個類的擴展Object,你沒有定義任何東西,只是重寫此方法以回傳所需的String每一個子類。
根據您發布的定義,Cube該類將是一個組合Square(立方體由正方形組成,但它不是正方形),因此我將其擴展Shape并定義為 aList或 6 的陣列Square,因此getArea()ofCube將是其中每個Square區域的總結。
uj5u.com熱心網友回復:
拋開問題的質量:
您有一個包含方法的 Shape 類calculateSomething()。Shape 沒有定義特定的形狀,所以很可能你可以回傳 -1 或 0?
現在,我們可以確定 Shape 類的方法沒有為我們提供任何真正的值/資訊。即使你創建了一個Shape shape = new Shape()物件并呼叫了它的方法,它也對我們沒有任何幫助。
相反,它為我們提供了一個方法,每個子類都必須重寫該方法才能獲得預期的結果。
這是什么意思以及它是如何作業的?
為了讓您不必總是Rectangle rect = new Rectangle()為每個類和物件都做,Rectangle 成為 Shape 類的子類。
這使您可以在以后執行Shape rect = new Rectangle(). 這樣做的最大好處是您創建了一種抽象機制,這意味著您有很多形狀,矩形或三角形等,但它們最終都是 Shape 物件。
所以稍后你可以這樣做:
Shape rect = new Rectangle();
Shape triangle = new Triangle();
rect.calculate();
triangle.calculate();
而不是更細致:
Rectangle rect = new Rectangle();
Triangle triangle = new Triangle();
rect.calculate();
triangle.calculate();
前者可以通過以下方式進一步利用:
// Putting all the objects in a list
List<Shape> shapes = new ArrayList<>();
// Create objects and add them
Shape rect = new Rectangle();
Shape triangle = new Triangle();
shapes.add(rect);
shapes.add(triangle);
正如您自己看到的那樣,處理和迭代所有元素都是型別/類 Shape 的串列更容易。
// Basic example
for (Shape shape : shapes)
shape.calculateSomething();
想象一下,如果你有一百種不同的形狀,除了矩形和三角形。后一種方法在不使用繼承的情況下,很快就會在不斷結束的維護和代碼更改試驗中消耗您的專案。
通過以其他方式利用繼承,您可以根據需要增加 Shape 類的數量,并且用于 Shape 的相同方法仍然適用于所有未來的新物件。
它在實踐中如何運作?如何創建子類?
如您所知,您可以通過關鍵字鏈接您的課程extend。但這只是開始。
為了能夠利用繼承,您必須在子類中覆寫您選擇的方法。
以前面的例子為例:
Shape rect = new Rectangle();
rect.calculate();
但這提出了一個問題,calculate()當Shape類從它回傳 -1 或 0 并且rect變數現在是型別時,如何獲得方法的正確值Shape?
很容易,您可以通過@Override標記覆寫父類的方法,并通過在子類上再次實作相同的方法但使用不同的計算。例子:
class Shape {
public void calculate() { return 0; }
}
class Rectangle extends Shape {
@Override
public void calculate() { return 2; }
}
請注意,方法的名稱、變數等必須相同。
現在在以下情況下:
Shape rect = new Rectangle();
rect.calculate();
該calculate()方法將回傳數字2。發生這種情況是因為即使rect物件是 型別Shape,它也是Rectangle. 每個矩形都是一個形狀。因此,當您嘗試呼叫所需的方法時,程式知道選擇 Rectangle 類的覆寫方法,因為本質上它是一個 Rectangle,被抽象 Shape 覆寫。
這適用于任意數量的 Shape 子類,每個子類都有自己獨特的方法實作。
另請注意, Rectangle 子類可以有自己的私有欄位,用于其他方法:
class Rectangle extends Shape {
private int height;
private int width;
// constructor
public Rectangle(int h, int w) {
this.height = h;
this.width = w;
}
@Override
public void calculate() {
return this.w * this.h;
}
}
因此,要回答您的問題,您只需根據需要覆寫每個類所需的方法。如果方法未被覆寫,則Shape運行父類的原始方法。
我希望這對您對抽象和繼承的困惑有所啟發。
PS: 我知道您可能會感到困惑,但是有數百個答案和論壇在那里解釋了這個確切的事情,這就是我們所有人的學習方式。不幸的是,它需要時間,但如果你自己看一些東西,你會有更深入的理解。我敢肯定,您已經嘗到了在這里提出的“錯誤”或“壞”的定義,并且考慮到需要材料,您將來會更容易自己研究它。我只是試圖與您聯系,因為我一直在您的位置上,并且相信我可以通過我的方法產生影響。
如果您有任何其他要添加或要更正的內容,請隨時在評論部分中提出。
編輯: 正如另一個回答的人所提到的,Shape 類可以而且應該是一個抽象類。我只是假設你希望它是一個正常的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/396927.html
下一篇:在類中如何從檔案中讀取引數?
