1)依賴
依賴關系是類與類之間的聯接。一個類依賴於另一個類的定義。如,一個人(Person)可以買車(Car)和房子(House),Person類依賴於Car和House的定義,因為Person引入了Car和House。與關聯不同的是,Person類中沒有Car和House的屬性,Car和House的實例是以參量的方式傳入到buy()方法中的。一般而言,依賴關系在Java語言中體現為局部變量,方法形參,或者對靜態方法的調用。
2)關聯
關聯是類與類之間的聯接,使一個類知道另一個類的屬性和方法。關聯可以是雙向,也可以是單向的。一般使用成員變量來實現。
3)聚合
聚合是一種強的關聯關系。是整體和個體之間的關系。例如,汽車類與引擎類,輪胎類之間的關系就是整體與個體之間的關系。與關聯關系一樣,聚合關系也是通過實例變量實現的。但是關聯關系涉及的兩個類在同一層次,而聚合關系中兩個類處在不平等的層次上,一個代表整體,一個代表部分。
4)組合
組合也是關聯關系的一種,一種比聚合關系強的關系。組合關系中的部分類不能獨立於整體類存在。整體類和部分類有相同的生命周期。如Person類和Leg類。
5)繼承/泛化
泛化和繼承其實是一個逆過程 泛化就是有子類抽象出一個父類 而繼承就是由父類具體化一個子類 例如足球比聯賽跟什么西甲 意甲 英超之間就是泛化/繼承的關系
6)組合和聚合的區別
組合和聚合都屬於關聯,所以它們之間難免有相似之處,區別舉例來說明:
程老師的《大話》里舉大那個大雁的例子很貼切 在此我就借用一下 大雁喜歡熱鬧害怕孤獨 所以它們一直過着群居的生活 這樣就有了雁群 每一只大雁都有自己的雁群 每個雁群都有好多大雁 大雁與雁群的這種關系就可以稱之為聚合 另外每只大雁都有兩只翅膀 大雁與雁翅的關系就叫做組合 有此可見 聚合的關系明顯沒有組合緊密 大雁不會因為它們的群主將雁群解散而無法生存 而雁翅就無法脫離大雁而單獨生存——組合關系的類具有相同的生命周期
聚合關系圖:
聚合關系圖:
雁群類:
public class GooseGroup { publi Goose goose; public GooseGroup(Goose goose){ this.goose=goose; } }
大雁類:
public class Goose{ public Wings wings; public Goose() { wings=new Wings(); } }
從構造函數來看,GooseGroup的構造函數要用到Goose作為參數把值傳進來,Goose可以脫離GooseGroup獨立存在。
組合關系中整體類含有部分類的實例化,Goose在實例化之前,一定要先實例化Wings,兩個類緊密耦合在一起,它們有相同的生命周期,Wings不能獨立於Goose存在。
從信息封裝來看,聚合關系中,客戶端同時了解GooseGroup和Goose,因為它們是獨立的。
而在組合關系中,客戶端只認識大雁類,根本不知道翅膀類的存在,因為翅膀類被嚴密封裝在大雁類中。