组合是整体创建并销毁部分,部分不能复用;聚合是外部创建部分,整体仅持引用且不干预其生命周期。判断关键在于部分对象离开整体后能否继续被其他地方使用。

看代码里“谁创建、谁销毁、能不能复用”这三件事,就能直接区分组合和聚合。
组合:整体管生管死,部分不能单飞
组合的核心信号是——部分对象由整体类内部创建,且生命周期完全绑定整体。
- 构造方法或初始化块里直接 new 出部分对象(比如
this.engine = new Engine();) - 没有对外暴露设置部分对象的 setter 或构造参数
- 整体类通常承担资源释放责任(如实现
close()并调用部分对象的清理方法) - 部分对象一般不能被其他类复用(例如一个
OrderItem只属于唯一Order)
聚合:整体只用不养,部分自己活
聚合的关键特征是——部分对象由外部创建,整体仅持引用,不干预其生命周期。
- 通过构造函数参数或 setter 接收已存在的对象(比如
public Department(List<employee> members)</employee>) - 类内部绝不会对部分类型调用 new
- 删除整体时,只是断开引用;部分对象仍可被其他模块使用(如一个
Employee离开Department后还能加入Project) - 常配合集合类使用,但重点不是有没有
List,而是列表里的元素谁造的、谁负责回收
常见误判点:别被表象骗了
有些写法看着像聚合,实际已是组合语义:
立即学习“Java免费学习笔记(深入)”;
- 接收外部传入的集合,但内部做了深拷贝再保存 → 实际已接管生命周期
- 虽然用 setter 注入,却在
destroy()中主动调用部分对象的shutdown()→ 越权管理 - 成员变量是
private List<t></t>,但 T 的实例全由本类new出来 → 还是组合
一句话快速判断口诀
问自己:“这个部分对象,离开当前整体,还能不能正常存在、继续被别的地方用?”
- 能 → 聚合(如:用户和角色、教室和投影仪)
- 不能 → 组合(如:窗口和按钮、树节点和子节点)


















