依赖、关联、聚合的区别在于引用方式、生命周期归属和语义意图:依赖是临时使用(如形参),无长期引用;关联是长期持有、平等协作(如成员变量);聚合是“整体-部分”且部分可独立存在(如部门与员工)。

区分依赖、关联、聚合,关键看引用方式、生命周期归属和语义意图——不是靠代码写法本身,而是靠设计时想表达什么关系。
依赖:用完就丢,不持有引用
一个类在某个方法里临时用到另一个类,但不把它存为成员变量,也不长期持有。这种关系很弱,只在方法执行期间存在。
- 典型写法:形参、局部变量、静态方法调用
- 生命周期:B 类对象的创建和销毁完全独立于 A 类;A 方法结束,B 的局部实例通常就不可达了
- 例子:Person.write(Pen pen) —— “我”写字时借一支笔,写完就还,不随身带着
关联:长期持有,平等协作
A 类把 B 类作为自己的成员变量(属性)来持有,表示“我知道你、需要你、会持续用你”。双方没有明显的整体/部分意味,更多是逻辑上的协作关系。
- 典型写法:private B b; 或 protected B b;
- 生命周期:A 和 B 的生命周期基本解耦;A 被回收,B 不一定被回收(比如 B 还被其他对象引用)
- 例子:Teacher has a List<Student> —— 教师管理学生名单,但学生不属于教师的一部分,学生可以换老师
聚合:整体拥有部分,但部分可独立存在
是关联的语义加强版,强调“has-a”(有一个),且部分可以脱离整体存活,甚至被多个整体共享。整体不控制部分的生死。
立即学习“Java免费学习笔记(深入)”;
- 代码写法和关联完全一样(也是成员变量),区别全在设计意图
- 生命周期:部分可独立创建、销毁;整体删了,部分还在(比如删除飞机场,飞机还能飞走)
- 例子:Department has a List<Employee> —— 部门有员工,但员工可以调岗到别的部门,也能离职
不复杂但容易忽略:聚合和关联在 Java 代码层面无法自动区分,必须靠命名、注释或设计文档说明。真正决定它是聚合还是普通关联的,是你心里是否认定“这部分属于这个整体”,以及它能不能离开整体单独存在。


















