繼承和組合是java中非常常用的兩種創建新類型的方法,兩者都能提高代碼的復用率。
繼承主要是想讓子類繼承父類的基本特性;組合技術通常用於想在新類中使用現有類的功能,而非它的接口。兩者的分別是"IS A"和"HAS A"的關系
繼承:
class Shape { public void draw() { System.out.println("draw a shape"); } public void erase() { System.out.println("erase"); } } class Square extends Shape { @Override public void draw() { System.out.println("draw a Square"); } public static void main(String[] args) { Square s = new Square(); s.draw(); s.erase(); } }
組合:
class Draw { public void draw() { System.out.println("draw"); } } class Erase { public void erase() { System.out.println("erase"); } } class Work { public void work() { new Draw().draw(); new Erase().erase(); } public static void main(String[] args) { new Work().work(); } }
一、相比於組合,繼承有以下優點:
1、在繼承中,子類自動繼承父類的非私有成員(default類型視是否同包而定),在需要時,可選擇直接使用或重寫。
2、在繼承中,創建子類對象時,無需創建父類對象,因為系統會自動完成;而在組合中,創建組合類的對象時,通常需要創建其所使用的所有類的對象。
二、組合的優點:
1、在組合中,組合類與調用類之間低耦合;而在繼承中子類與父類高耦合。
2、可動態組合。
總結:
雖然繼承是OOP的一大特性,但很多時候並不推薦使用,因為它常常容易使結構復雜化,容易出錯。因此,除非我們確信使用繼承會使程序效率最高,否則,不考慮使用它,
這也是六大設計原則之一的合成復用原則。
那我們該如何判斷是否應該使用繼承呢?在java編程思想中提供了一個簡單的判斷方法,就是在考慮“真的需要向上轉型嗎?”。