繼承
指的是一個類或者接口繼承另一個類或者接口,而且可以增加自己的新功能。
實現
指的是一個class類實現interface接口。
依賴
簡單說,就是一個類中的方法用到了另一個類,一般依賴關系在java中提現為局部變量、方法的形參,或者對靜態方法的調用。是一種弱關系。例如人用筆寫字,人與筆之間的關系就是依賴。
關聯
關聯是一種強關系,類與類或者類與接口之間的一種強依賴關系。一般以類的屬性形式出現在關聯類中,在java中關聯關系一般使用成員變量來實現。
聚合
聚合是關聯的一種特例,體現的是整體與部分的關系,即has-a的關系。
has-a 不是must has,例如飛機場和飛機,飛機場可以停有飛機,也可以沒有停飛機,飛機可以停在飛機場,也可以飛在天上。
他們有各自的生命周期。
組合
組合也是關聯的一種特例,他體現的是contains-a的關系,比聚合更強。
組合同樣體現整體和部分的關系,但是整體和部分是不可分割的,他們有共同的生命周期。
例如,人有耳朵鼻子等,一旦人死了,耳朵鼻子也就死了。
對於繼承和實現應該沒有什么疑問,他們體現的是類與類、類與接口直接的一種縱向關系。其他四中體現的是類與類、類與接口之間的引用、橫向關系,很難區分。代碼上沒什么太大區別,主要是語義上的區別。
幾種關系強弱程度依次為:組合>聚合>關聯>依賴。
聚合和組合
- 聚合和組合都是一種關聯關系,只是具有不同的整體-部分的意義。
- 整體部分中,部分的生命周期不同。聚合關系中,整體不會擁有部分的生命周期,整體刪除時,部分不會被刪除,多個整體共享同一個部件。組合關系中,整體擁有部分的生命周期,整體刪除時,部分一定會被刪除。
而且,多個整體不可以同時共享同一個部分。(區分某個關聯關系是組合還是聚合,看兩個類的生命周期是否同步,同步就是組合關系,不同步就是聚合關系)
3.聚合是has-a 關系,組合是contains-a 關系。
舉個簡單的例子:
大家需要去公司上班,所以很多員工組成了公司,每個公司都有自己的員工,每個員工也有自己的公司。員工和公司就是聚合的關系。另外,每個員工都有手腳,人和手腳的關系就是組合,不可分割,擁有相同的生命周期。
聚合關系圖:
組合關系圖:
代碼上看區別:
public class Company { public List<Company> companyList; public Company(List<Company> companyList) { this.companyList = companyList; } }
public class Employee { public Hand hand; public Employee() { this.hand = new Hand(); } }
信息的封裝性不同
在聚合關系中,調用者可以同時了解公司和員工類,因為他們都是獨立的
而在組合關系中,調用者只認識員工,根本就不知道手的存在,因為手類被嚴密的封裝在員工類中。
http://blog.csdn.net/qq_31655965/article/details/54645220