組合和聚合是有很大區別的,這個區別不是在形式上,而是在本質上:
比如A類中包含B類的一個引用b,當A類的一個對象消亡時,b這個引用所指向的對象也同時消亡(沒有任何一個引用指向它,成了垃圾對象),這種情況叫做組合,反之b所指向的對象還會有另外的引用指向它,這種情況叫聚合。
在實際寫代碼時組合方式一般會這樣寫:
A類的構造方法里創建B類的對象,也就是說,當A類的一個對象產生時,B類的對象隨之產生,當A類的這個對象消亡時,它所包含的B類的對象也隨之消亡。
聚合方式則是這樣:
A類的對象在創建時不會立即創建B類的對象,而是等待一個外界的對象傳給它
傳給它的這個對象不是A類創建的。
現實生活中:
人和手,腳是組合關系,因為當人死亡后人的手也就不復存在了。人和他的電腦是聚合關系。
class Hand{
}
class Computer{
}
//組合:
class Person{
private Hand hand;
public Person(){
hand = new Hand();
}
}
//聚合:
class Person{
private Computer computer;
public setComputer(){
computer = new Computer();
}
}