簡體   English   中英

Java繼承層次結構

[英]Java Inheritance hierarchy

矩形是父類,而正方形是矩形(父類)的子類。 這種關系正確嗎?

顯然,正方形在矩形的前面更具體,可以將其與矩形建立IS-A關系。 但是,如果我們以這種方式看到內存使用率會更高(在堆中創建正方形對象時,實例變量length和breath會像矩形一樣分別分配內存)。

而我們可以通過將Square與矩形平行放置來聲明Square類中的一個變量,從而將其減少一半。 因此,在堆中創建Square對象時,只會分配一個實例變量內存。

那么哪種方法會更有效?

  1. 通過將Square作為矩形的子級。

     Or 
  2. 鑒於有效的堆內存利用率,通過將Square放在繼承層次結構中的並行分支上?

如果我在任何時候錯了,請糾正我。

繼承最適合用來表示對象之間的“是”關系。

例如,這是繼承的一種錯誤用法:

public class List<E> {
    :
}

public class Vector<E> extends List<E> {
    :
}

您可能會問:“如果Vector使用了List的所有功能,那么為什么這是一個不好的繼承示例?” 這是次優的,因為Vector不是列表。 結果可能是List類可能以對Vectors不重要的方式演化,或者更糟的是,它會在Vectors中創建安全漏洞或缺陷。 在這種情況下,組合會更好,即,向量“具有”列表(而不是強迫向量成為列表)。

子類別確實應該是其父類別的示例(例如,MountainBike是自行車)。 如果不是這樣,則很可能關系不是應該由繼承層次結構表示的關系。

但是如果以這種方式看到內存使用率會更高(在堆中創建正方形對象時,實例變量的長度和呼吸將分別分配給內存,例如矩形

層次結構是鼓勵代碼重用和改善模塊化的工具。 如果在項目的此階段擔心內存分配,則應該選擇與Java不同的語言。 使用Java 是因為您希望獲得與抽象和面向對象有關的設計改進。

您不能肯定這is-a設計方法在這里是顯而易見的選擇。 相反,您可以將Rectangle作為基礎,並且當寬度等於高度時它將是一個正方形。 盡管Square 是一個 Rectangle,但您也可以使用Rectangle屬性對其進行建模。

但我同意,從概念上講,將Square建模為擴展Rectangle似乎更好。

您關於減少空間復雜性的問題

這個層次結構現在很簡單,因此您在問這個問題,但是假設您正在使用同時包含寬度和高度的操作來構建Rectangle 這些操作也將對Square有效。 例如:

public int calculateArea(int width, int height);

如果從Rectangle擴展Square ,則可能會使用相同的方法。 現在,要執行此操作,您必須通過構造函數初始化寬度高度 您要做的就是將這些設置為相同,然后您可以得到該區域。 您不必出於任何原因而覆蓋它。 但是,如果Square是分開的,那么您將如何進行面積計算? 您是否僅出於空間復雜性不可知的設計考慮而將它單獨插入。

如果擴展正方形,圍繞寬度高度構建的所有內容都可以被正方形同樣利用。

您建議的節省空間的方法放棄了代碼的可重用性。 因此,最好擴展Square而不是節省該內存。

那么哪種方法會更有效?

 By putting Square as a child of rectangle. Or By Putting Square at a parallel branch in inheritance hierarchy in view of effective heap memory utilization? 

效率的提高是以犧牲代碼的可重用性為代價的。 因此,答案是“ 通過將Square作為矩形的子代。

但是,請稍等...您也許也可以節省內存!

如果width和height都不是基元,則可以使Width和Height之類的引用指向同一對象,而不是2個不同的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM