news 2025/12/30 8:27:40

【UML】面向对象中类与类之间的关系详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【UML】面向对象中类与类之间的关系详解

作为程序员,在学习或使用面向对象编程(OOP)时,类与类之间的关系是一个绕不开的话题。合理地建模类之间的关系,不仅能让代码更清晰,也能显著提升系统的可维护性和扩展性。


文章目录

    • 一、为什么要理解类之间的关系?
    • 二、类与类之间的六种常见关系
    • 三、依赖关系(Dependency)
      • 1、概念
      • 2、示例
      • 3、特点
    • 四、关联关系(Association)
      • 1、概念
      • 2、示例
        • 2.1双向关联
        • 2.2单向关联
        • 2.3自关联
      • 3、特点
    • 五、聚合关系(Aggregation)
      • 1、概念
      • 2、示例
      • 3、特点
    • 六、组合关系(Composition)
      • 1、概念
      • 2、示例
      • 3、特点
    • 七、继承关系(Inheritance)
      • 1、概念
      • 2、示例
      • 3、特点
    • 八、实现关系(Implementation)
      • 1、概念
      • 2、示例
      • 3、特点
    • 九、关系强度对比总结

一、为什么要理解类之间的关系?

在真实世界中,对象之间往往不是孤立存在的,例如:

  • 学生属于某个班级
  • 汽车由发动机、轮胎等组成
  • 程序员是一种“人”

面向对象设计正是通过类与类之间的关系来描述这些现实世界的联系。理解这些关系,有助于:

  • 建立合理的领域模型
  • 避免“上帝类”“面条代码”
  • 更好地遵循 SOLID等设计原则
  • 读懂 UML 类图和优秀框架源码

二、类与类之间的六种常见关系

从弱到强、从“使用”到“拥有”,常见的类关系主要包括以下几种:

  1. 依赖(Dependency)
  2. 关联(Association)
  3. 聚合(Aggregation)
  4. 组合(Composition)
  5. 继承(Inheritance)
  6. 实现(Implementation)

下面将逐一介绍。


三、依赖关系(Dependency)

1、概念

依赖关系是一种使用关系,它是对象之间耦合度最弱的一种关联方式,是临时性的关联。在代码中,某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一些职责。

依赖关系表示:

一个类在“使用”另一个类,但这种关系是临时的、不稳定的。

通常体现在:

  • 方法参数
  • 局部变量
  • 返回值

2、示例

👉UML 表示:在 UML 类图中,依赖关系使用带箭头的虚线来表示,箭头从使用类指向被依赖的类。

classDriver{publicvoiddrive(Carcar1){car1.move();}}

这里Driver依赖Car,但并不持有它。

3、特点

  • 生命周期无关
  • 关系最弱
  • 修改被依赖类,可能影响使用方

四、关联关系(Association)

1、概念

关联关系的核心是连接。它意味着一个类的对象(实例)可以“导航”到另一个类的对象,通常是通过属性(成员变量)来持有对另一个对象的引用。这种关系是双向的,但具体的实现(导航性)可以是单向的。

关联关系表示:

一个类“知道”另一个类,并将其作为成员变量。

这是一种长期存在的关系。

2、示例

2.1双向关联

在UML类图中,双向关联用一个不带箭头的直线表示。下图中在Student类中维护一个List<Course>,表示一个学生可以选择多门课程;在Course类中维护一个Student类型的成员变量表示这门被哪个学生所选。

2.2单向关联

classStudent{privateAddressaddress;}

每个学生都有一个家庭地址,学生和地址之间存在单向关联关系。

2.3自关联

自关联在UML类图中用一个带有箭头且指向自身的线表示。上图的意思就是Node类包含类型为Node的成员变量,也就是“自己包含自己”,自己指向自己。

3、特点

  • 双方生命周期可以独立
  • 可以是单向或双向
  • 是一种结构性关系

五、聚合关系(Aggregation)

1、概念

聚合关系是关联关系的一种,是强关联关系,是整体和部分之间的关系。

聚合关系也是通过成员对象来实现的,其中成员对象是整体对象的一部分,但是成员对象可以脱离整体对象而独立存在。如下示例所示,部门解散后,员工仍然存在。

聚合是关联关系的一种特例,表示:

“整体 - 部分”关系,但部分可以独立于整体存在。

2、示例

👉 UML 表示:空心菱形 + 实线

classDepartment{privateList<Employee>employees;}

部门解散后,员工仍然存在。

3、特点

  • 弱拥有关系
  • 部分对象生命周期独立

六、组合关系(Composition)

1、概念

组合表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系。在组合关系中,整体对象可以控制部分对象的生命周期,一旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象而存在。如下示例所示,房子没了,房间也就不存在了。

组合也是整体-部分关系,但更强:

部分对象不能脱离整体单独存在。

2、示例

👉 UML 表示:实心菱形 + 实线

classHouse{privateRoomroom;}

房子没了,房间也就不存在了。

3、特点

  • 强拥有关系
  • 生命周期绑定
  • 更符合封装原则

七、继承关系(Inheritance)

1、概念

继承关系是对象之间耦合度最大的一种关系,是父类与子类之间的关系,是一种继承关系。如下示例的类图,继承了了动物的的方法。

继承表示:

一种“is-a”(是一个)的关系。

子类可以复用父类的属性和行为。

2、示例

👉 UML 表示:空心三角形 + 实线

classAnimal{voideat(){}}classDogextendsAnimal{}classCatextendsAnimal{}

3、特点

  • 强耦合
  • 破坏封装风险
  • 应慎用,优先考虑组合

八、实现关系(Implementation)

1、概念

实现关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。如下示例的类图,汽车和飞机实现了交通工具。

实现关系表示:

类对接口的实现,是一种“can-do”的关系。

2、示例

👉 UML 表示:空心三角形 + 虚线

interfaceVehicle{voidmove();}classCarimplementsVehicle{publicvoidmove(){}}classPlaneimplementsVehicle{publicvoidmove(){}}

3、特点

  • 面向接口编程的核心
  • 解耦具体实现
  • 有利于扩展和测试

九、关系强度对比总结

关系类型强度生命周期绑定常见关键词
依赖use
关联⭐⭐know
聚合⭐⭐⭐has-a
组合⭐⭐⭐⭐owns-a
继承⭐⭐⭐⭐⭐is-a
实现⭐⭐⭐⭐can-do

参考资料

黑马程序员 - bilibili.com

类和类之间的关系_类与类之间的关系-CSDN博客

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/28 2:52:49

多线程编程核心要点速览

多线程 一、进程【理解】 1. 进程&#xff1a;操作系统(OS)中&#xff0c;每一个被执行的应用程序。 2. 注意&#xff1a;目前操作系统支持多进程&#xff0c;并发执行的任务。 3. 多进程并发执行的原理&#xff1a;微观上串行(一个一个的进程进行执行&#xff0c;获取cpu时间片…

作者头像 李华
网站建设 2025/12/28 2:51:59

STLink与STM32接线后无法识别?排查思路与修复方案

STLink连不上STM32&#xff1f;别急&#xff0c;一步步带你从“砖头”救回芯片你有没有遇到过这种情况&#xff1a;STLink插上电脑&#xff0c;灯亮了&#xff1b;接到STM32板子上&#xff0c;线也接对了——但打开STM32CubeProgrammer一点“Connect”&#xff0c;弹窗就是一句…

作者头像 李华
网站建设 2025/12/28 2:50:18

awk文本处理相关练习

练习1要求&#xff1a;1、检测两台服务器指定目录下的文件一致性#!/bin/bash ##################################### #检测两台服务器指定目录下的文件一致性 ##################################### #通过对比两台服务器上文件的md5值&#xff0c;达到检测一致性的目的 dir/d…

作者头像 李华
网站建设 2025/12/28 2:50:08

嵌入式系统中I2C多主设备部署实践

嵌入式系统中 I2C 多主设备部署&#xff1a;从原理到实战的完整指南在一块小小的嵌入式电路板上&#xff0c;多个微控制器&#xff08;MCU&#xff09;共享同一组 I2C 总线通信&#xff0c;听起来像是高效协同的设计。但如果你经历过总线“死锁”、数据错乱、任务莫名卡顿——那…

作者头像 李华
网站建设 2025/12/28 2:49:31

u8g2驱动适配常见问题解析:快速理解底层机制

u8g2驱动适配实战指南&#xff1a;从“点不亮屏”到精通底层通信你有没有遇到过这样的场景&#xff1f;硬件接线确认无误&#xff0c;代码编译通过&#xff0c;下载运行后OLED却一片漆黑——既不是显示内容错了&#xff0c;也不是花屏&#xff0c;而是完全没反应。反复检查IC地…

作者头像 李华