java学习:组合和聚合之间的区别

组合关系:比如A类中包含B类的一个引用b,当A类的一个对象消亡时,
b这个引用所指向的对象也同时消亡。
聚合关系:反之b所指向的对象还会有另外的引用指向它。

现实生活中,人和手,脚是组合关系,因为当人死后
手和脚就不复存在了。
人和电脑就是聚合的关系

class Hand{}
class Computer{}
组合:
class Person{
private Hand hand;
public Person(){ //组合:hand对象在Person构造器中创建对象,hand对象的引用会存放在Person对象堆内存中;
hand=new Hand();
}
}
聚合:
class Person{
private Computer computer;
public setComputer(){ //聚合:computer对象在set方法里创建,然后创建computer对象,
//此时computer对象的引用存放在栈区,然后将computer对象的地址值赋给Person对象堆 //中的的computer属性(成员变量);
computer = new Computer();
}
}

解析:

组合关系:
在组合中,Hand对象作为Person对象的属性,在Person的构造器中创建

如:此代码:Person P1 = new Person();中:

1.在栈区创建引用变量p1,此时p1值存放为null;
2.在堆区创建空间来存放Person对象,把其地址赋给p1;然后执行hand = new Hand();代码
3.创建hand引用变量,此时hand存放值为null;特别注意:由于此时是在Person的构造器里创建的hand引用变量
(此时这个hand引用变量就是p1对象的一部分,我们可以回想当创建int age = 1时,age变量
就是放在其对象堆空间里的,一样的道理)所以此时的hand引用变量不会存放在栈区,而是存
放在Person对象的堆区空间里;(因此当p1对象消亡时,head对象失去了指向它的head引用变量,
所以也会消亡)
4.在堆区创建空间存放Head对象,然后把其地址值赋给head引用变量;

聚合关系:
在聚合中,Computer对象作为Person对象的属性,在Person类的set方法中创建

如:此代码:Person P2 = new Person();中:
	 p.setComputer();	//需要手动为p2对象computer属性赋值

1.1.在栈区创建引用变量p2,此时p2值存放为null;
2.在堆区创建空间来存放Person对象,把其地址赋给p2;然后此时该堆区所存放值为null;
因为默认的无参构造器不会给p2的属性conputer创建对象,所以会默认为null;
3.然后需要手动为p2对象computer属性赋值,然后执行computer = new Computer();
4.注意此时是在栈区创建computer引用变量,指向在堆区创建的Computer对象,
5.然后把Computer对象的地址赋给p2对象;(因此当p2对象消亡时,Computer对象还有
在栈区的computer引用变量指向它,所以Computer对象不会消亡;

									组合和聚合的内存分配

java学习:组合和聚合之间的区别

上一篇:从java看 is-a, has-a, is-like-a


下一篇:用Python破解 斗地主残局 ,对王,然后3带2!