Java 中繼承和組合的區別
在計算機程式設計中,“可重用程式碼”的概念是指在構建新軟體時利用以前開發的軟體。程式碼的可重用性被認為是高效功能的重要組成部分。面向物件程式設計使用的一種方法來促進這一點是建立類之間的關聯。
在面向物件程式設計中,構建這些關係主要有兩種方法:繼承和組合。
在面向物件程式設計 (OOP) 中,繼承是指一個物件可以獲取一個或多個其他物件的屬性的過程。在 OOP 中,它是建立程式碼可重用性的最強大的概念之一。使用繼承時,可以透過與現有類建立父子關係來構建新類。這允許建立現有類的新的子型別。
類繼承的替代方法是所謂的“物件組合”。組合是指在一個物件內使用另一個物件的過程。組合是 OOP 促成的一種新的類間關係形式。
由於透過利用先前建立的、設計良好的類作為元件來開發複雜的類很容易,因此你會發現有很多情況你希望將一個物件用作另一個類中的欄位。這個過程稱為“組合”。
儘管在許多情況下繼承和組合提供的功能大致相似,但物件組合被認為比類繼承是一種更好的重用方法。閱讀本文,瞭解有關繼承和組合的更多資訊以及這兩個概念有何不同。
什麼是組合?
組合,也稱為“has-a 關係”,是 OOP 為類提供的另一種相互關聯的方式。
當一個物件的屬性必須以某種方式包含在另一個物件中才能使關係有意義時,需要組合。為了從現有類建立新的組合類,必須將每個現有類的物件宣告為新類的成員。
組合是將一個東西巢狀在另一個東西內的花哨說法,可以很簡單地解釋。在許多情況下,你希望將已定義的物件用作另一個類中的欄位。在組合中,在類內工作時使用物件。
與類繼承相反,物件組合是透過物件獲取對其他類物件的引用在執行時動態定義的。組合之所以有益,是因為它提供了一種更好的使用物件而不破壞物件內部資訊的方法。這是組合的另一個好處。
組合示例
public class Student { } public class College { private Student student; public College() { this.student = new Student(); } }
什麼是繼承?
在面向物件程式設計中實現程式碼可重用性時,最強大的工具之一是繼承。這是一種能力,允許一個物件透過使用另一個物件來獲取一個或多個其他物件的屬性。
Java 允許你構建從其他類派生其屬性的類。這意味著你專門化一個類以在類之間構建“is-a 關係”,這最終會導致基類和派生類之間強耦合。
由於實現繼承時,新類是從現有類生成的,因此程式碼可重用性得到了提高。類繼承使得更改被重用的實現變得容易得多。但是,類繼承也有一些缺點。繼承在編譯時定義,因此你無法在執行時更改從父類繼承的實現。
繼承的性質可以是單層、多層、層次結構、多層或混合的。繼承也可以採取混合繼承的形式。
繼承示例
class Animal{ String name="Orio"; } public class Dog extends Animal{ String type="Dog"; public static void main(String args[]){ Dog p=new Dog(); System.out.println("Name:"+p.name); System.out.println("Type:"+p.type); } }
輸出
Name:Orio Type:Dog
組合和繼承的比較
下表重點介紹了面向物件程式設計中組合和繼承的主要區別:
比較依據 | 組合 | 繼承 |
---|---|---|
關係 | 這是一種“has-a”情況。 | 這是一種“is-a”情況。 |
功能 | 我們可以評估我們正在使用的類的功能,而不必擔心它們是父類還是子類。 | 如果不先測試父類,就不能測試子類。 |
如果不先測試父類,就不能測試子類。 | 由於組合,即使在最終類中也可以重用程式碼。 | 繼承不能用於擴充套件最終類的功能。 |
意義 | 只需宣告我們想要在組合中使用的型別,就可以讓它儲存多個實現,每個實現根據呼叫的上下文具有不同的行為。 | 在繼承中,我們負責定義將成為“超類”的類,並且一旦使用,此定義就是不可變的。 |
類組合 | 組合使使用者可以靈活地將多個類的特性和功能混合到單個實體中。 | Java 不支援多重繼承,這意味著不能擴充套件多個類。 |
結論
組合是一種聚合,其中所有權是假設的而不是明確宣告的。考慮以下物件:一個與學校相關,一個與教室相關。如果沒有學校物件,教室物件就不可能存在。因此,這兩個物件被稱為相互依賴。因此,我們可以稱之為組合。換句話說,如果某些東西不可能獨立於整體而存在,那麼它就被稱為組合。
組合,通常稱為“has-a”關係,是面向物件程式設計為類提供的另一種相互關聯的方式。如果一個物件的屬性必須以某種方式包含在另一個物件中才能使關係有意義,則需要組合。為了從現有父類建立新的組合類,必須將每個類的物件宣告為當前類的成員。