我想举个通俗的例子。
你和你的心脏之间是composition关系
你和你买的书之间是aggregation关系
你和你的朋友之间是association关系

不知大家是否同意这个比方。

关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。

看来大家对组合的理解没有意义,因为他们直接有共同的lifetime ,
甚至,被component的对象是否能够被其他类所见需要component 对象的同意。
association 代表引用服务,但不会永久保存引用的入口,比如,仅仅是参数引用,用完就丢弃,是最弱连接。
aggregation 聚合代表永久引用或强引用,也许对象生成的时候就获得了该引用。
虽然他们直接没有生命期的约束。但是引用对象必须处理被引用对象义务消失的意外处理。

我理解的不知对不对,请大家多多指点

例子是以 A 为主控类,B 为受控类.

组合是最紧密的关系,A 要处理 B 的生死,一般是一个对外不可见的内部对象.
聚合和组合差不多,但A 不要处理 B 的生死,一般是一个使用外部的一个数据,或者是一个可以让外部可见的内部对象.
关联就最松散了,可以用"知道"来理解,就是 A 知道 B,就是关联了.比如:参数,或者返回值类型等等.

举一个简单的例子.

一个人和他的手的关系就是组合
一个人和他的衣服的关系就是聚合
一个人和他的邻居的关系就关联

不知道对不对?

有趣的比喻,很贴切。
欢迎新生.

在讨论聚合,关联,组合区别,讨论那么多内部类干什么?

确实,他们的关系按强弱分有

关联<聚合<组合

我看大家主要分岐在聚合和组合上。说白一点,聚合这种关系是被包含的对象的个数是 0..* 而组合是 1..*
聚合中的被包含对象可以没有。 而组合至少有一个。聚合是一种拥有的关系,而组合是整体与部分的关系

举一个简单的例子:
一个图书馆可以有十万本书,也可以一本也没有。但空的图书馆还是图书馆。这是聚合

一个车(我们平常能看到的普通的交通工具车)有轮子,有的车是四轮子的,有的车是三轮的,自行车是二轮的,还有独轮车,但车至少要有一个轮子,不然就不是车。这是组合关系。

再补充一点。聚合关系中,主对象的存在不依赖于次对象(被包含对象),也就是说书没有了,但图书馆仍然存在。不取决于书是否存在。

但轮子没有了,车就没有了。 也就是部分消失了,整体也就消失了

可以看看《java与模式》说得,我觉得以上各位把关联和依赖混淆了。

我的理解: 完全同样frenzieddragon的说法。
一、组合是聚合的一种特例,特点是:1被组合者生命期与组合者一致,2被组合者只能属于一个组合者。
二、组合、聚合、关联的区分主要是在语义层,实现的“结构”可以是一样的(不引起混淆的情况下)。 当然实现的“行为”需要区别。

tomfan写道“association 代表引用服务,但不会永久保存引用的入口,比如,仅仅是参数引用,用完就丢弃,是最弱连接。
aggregation 聚合代表永久引用或强引用,也许对象生成的时候就获得了该引用。虽然他们直接没有生命期的约束。但是引用对象必须处理被引用对象义务消失的意外处理。”
这也很有意思,这样实现的确很明确的体现了语义。当然不那样实现也没有问题,tomfan不也用了“也许”“直接”等词么!呵呵


public class A {
private B ref;
public A( B ref ) {
this.ref = ref;
}
...
}
public class B{
...
}
是很明显的组合关系,关联和聚合不同在对象间关系含义,实现相同,他们与组合的不同在是否在构造函数里生产对象

把所有的关系名词都列出来吧
组合
聚合
关联
继承
依赖