java類和類之間的關係
概覽
5種關係
- 依賴(dependency)
- 關聯(association)
- 聚合(aggregation)
- 組合(composition)
- 繼承(inheritance)可以更加細得分爲
實現
(realization)和泛化
(generalization)
從上至下依賴關係逐漸增強
詳細說明區別
其實依賴
、 關聯
、聚合
、組合
都是差不多的,在日常的表達中也很容易混爲一談,特別是聚合和組合更加容易混爲一談(我感覺也沒必要區分這麼細,都是 “我中有你”)。
詳細的含義如下
- 依賴:單向,類A依賴類B,是A在局部變量、方法入參、靜態調用中出現了B(我覺得方法出參中出現B應該也算依賴),類似
use a
- 關聯:可以單向 和 雙向(避免雙向,它是一種循環依賴),類之間是一種比較平等的關係。類似
has a
- 聚合:是特殊的關聯,跟關聯的區別僅僅是語義上,比如關聯的兩個類的關係比較平等,但是聚合是不平等的,聚合是整體和個體的區別。對象的生命週期是 “整體死了,但是個體還在”(詳細看代碼以加深印象)
- 組合:是特殊的聚合,也僅僅是語義的差別。聚合是 “整體死了,個體還在”,組合是 “整體死了,個體也死了”,個體是整體的組成部分(詳細看代碼以加深印象)
- 繼承:就是類繼承類,類繼承抽象類,類實現接口,接口繼承接口這些關係。跟上面4個很好區分。其中也可以再細分爲
實現
和泛化
,實現就是類實現接口,泛化就是類繼承類、類繼承抽象類、接口繼承接口。泛化是一種is a
用代碼說明區別
- 依賴
// use a
// 方法入參的依賴
public class Person {
public void drink(Water w) {
}
}
// 局部變量的依賴
public class Person {
public void goOut() {
Car car = new Car();
}
}
// 靜態調用的依賴
public class Person {
public void born() {
String idCardNo = IdCardUtil.getIdCardNo();
}
}
// 方法出參的依賴
public class Person {
public Profile getProfile() {
}
}
- 關聯(是一種平等的關係),表示
has a
(有一個),比如這裏的 “人有一個手機”
// has a
public class Person {
private Phone phone;
public void setPhone(Phone phone) {
this.phone = phone;
}
public Phone getPhone() {
return this.phone;
}
}
- 聚合:整體死了個體還沒死
// Team被JVM回收時,persons不被回收,個體還存在
public class Team {
private List<Person> persons;
public Team(List<Person> persons) {
this.persons = persons;
}
}
- 組合:整體死了,個體也死,個體是整體的組成部分
// Person被JVM回收後,各部分也被回收
public class Person {
private Head head;
private Body body;
private List<Arm> arms;
private List<Leg> legs;
public Person() {
this.head = new Head();
this.body = new Body();
this.arms = Lists.newArrayList<Arm>(new Arm("左臂"), new Arm("右臂"));
this.legs = Lists.newArrayList<Leg>(new Leg("左腿"), new Leg("右腿"));
}
}