組合和繼承,都能實現對類的擴充套件。
區別如下表所示 組合
繼承has-a關係
is-a關係
執行期決定
編譯期決定
不破壞封裝,整體和區域性松耦合
破壞封裝,子類依賴父類
支援擴充套件,隨意增加組合類
只能繼承乙個父類,必須包含所有方法,增加系統複雜性
動態選擇組合類方法
復用父類方法
下面通過乙個例子說明,子類繼承必須包含所有父類方法,增加了出錯率,修改父類方法會引起所有子類功能變化。
/**
* 呼叫基類
* * @author peter_wang
* @create-time 2014-5-20 下午4:30:33
*/public class supercallclass
public void operate1()
public void operate2()
/*** 冗餘的函式,導致子類臃腫,破壞了封裝,增加了出錯機會
*/public void redundant()
}
/**
* 呼叫子類
* * @author peter_wang
* @create-time 2014-5-20 下午4:32:22
*/public class subcallclass
extends supercallclass
@override
public void call()
}
/**
* 分析繼承和組合
* * @author peter_wang
* @create-time 2014-5-20 下午4:37:31
*/public class callclassdemo
}
組合類的使用
/**
* 呼叫組合類
* * @author peter_wang
* @create-time 2014-5-20 下午5:11:34
*/public class combinecallclass
public void operate1()
/*** 只需要使用到supercallclass中的operate2方法
*/public void operate2()
public void call()
}
綜上概述:
組合通常優於繼承,
1.考慮使用多型,可以用繼承。
2.考慮復用父類方法,而且父類很少改動,可以用繼承。
其他情況請慎重使用繼承。
java 組合優於繼承
組合和繼承。都能實現對類的擴充套件。差別例如以下表所看到的 組合繼承has a關係 is a關係 執行期決定 編譯期決定 不破壞封裝,總體和區域性松耦合 破壞封裝,子類依賴父類 支援擴充套件,任意新增組合類 僅僅能繼承乙個父類,必須包括全部方法,新增系統複雜性 動態選擇組合類方法 復用父類方法 以下...
復合優於繼承
public class testhashsetextends hashset override public boolean add e e override public boolean addall collection c public int getcount public static ...
java 繼承和組合
1.is a 是乙個 的關係是用繼承來表述 2.has a 有乙個 的關係是用組合來表述 3.組合語法 組合技術通常用於想在新類中使用現有累的功能而非它的介面的情況下。即在新類中放入某個類的物件,讓其實現所需要的功能,但是新類的使用者看到的只是為新類所定義的介面,而非嵌入類物件的介面。其實組合在編碼...