一、定義上區別:
聚合與組合都是表示整體和個體的關聯關系,他們之間最大的區別在於子類被父類控制的程度。組合的父子類關系比聚合要強
聚合:has-a關系,父類包含子類,子類可以獨立於父類存在
聚合關系用下圖符號表示:表示B由A聚合而成
組合:part-of關系,父類擁有子類,子類不能獨立於父類存在
組合關系用下圖符號表示:表示B由A組合而成
(不過,一個關聯關系是聚合還是組合,需要根據實際的業務需求來斷定。為什么這么說,因為可能相同超類和子類,在不同的業務場景,關聯關系會發生變化。)
舉例說明: 有三個類Name,Student,Address,反應的是學生與姓名和地址之間的關系,若類的使用方法如下,則代表Name和Address與Student之間是一個聚合關系.因為此時Name和Address類在Student類中出現都是以一種地址的形式,這兩種對並沒有在Student類中開辟新的空間,而是將已有的對象地址傳給了Student類的屬性。那么當外面的name和address對象的屬性值發生改變的時候,那么Student類中的屬性值會自動的發生改變。
public class Name{ public class Student { public class Address{
private Name name;
private Address address;
public Student(Name name,Address address){
this.name = name;
this.address = address;
}
} } }
若是Student類以下面的方式使用Name和Address類,那么他們之間就是一種組合的關系,因為我們可以在下面的代碼中看到,在Student類中Name和Address開辟新的空間,有了自己獨立的空間和屬性值,此時傳給Student類中屬性的值不是一個地址,而是一個獨立的對象,這個對象和外面name,address沒有任何關系,出了屬性值一樣以外,外面對象值的改變不會對Student中name和address對象屬性只有任何的影響。
、
public class Name{ public class Student { public class Address{
private Name name;
private Address address;
public Student(Name name,Address address){
this.name = new Name(name);
this.address = new Address(address);
}
} } }
二、代碼驗證
在我上傳的文件中有聚合和組合的源代碼文件。