目录
1. 类的基本结构2. 类之间的关系1.继承(Inheritance)/泛化(Generalization)2.实现(Implementation)3.关联(Association)4.聚合(Aggregation)5.组合(Composition)6.依赖(Dependency) 3.关系的多重性(Multiplicity)4.分层次理解复杂的类图5. 抽象类与接口6. **静态成员**
1. 类的基本结构
每个类在图中通常表示为一个矩形,矩形通常分为三个部分: 类名:显示在矩形的顶部属性(成员变量):显示在中间部分,代表类的内部数据方法(成员函数):显示在底部,表示该类能执行的操作或行为 示例:+-----------------+| ClassName | ← 类名+-----------------+| - attribute1 | ← 属性 (带符号表示可见性)| - attribute2 |+-----------------+| + method1() | ← 方法 (带符号表示可见性)| + method2() |+-----------------+
符号含义: +
:表示公共(public
),该成员可以被任何类访问-
:表示私有(private
),该成员只能被类本身访问#
:表示保护(protected
),该成员只能被该类和其子类访问 2. 类之间的关系
1.继承(Inheritance)/泛化(Generalization)
符号:实心三角箭头含义:子类继承父类的属性和方法用途:表示is-a
关系,即“是某类对象”例子:子类继承父类的特性,如 Car
继承 Vehicle
+------------------+ +------------------+| Vehicle |◄-----------| Car |+------------------+ +------------------+
2.实现(Implementation)
符号:虚线三角箭头含义:表示一个类实现一个接口的关系用途:表示类承诺提供接口定义的方法例子:Dog
实现 AnimalBehavior
接口+------------------------+ +----------------+| AnimalBehavior |◄--------o| Dog |+------------------------+ +----------------+
3.关联(Association)
符号:普通的箭头线含义:表示一个类知道另一个类的存在,通常是通过属性实现的用途;表示has-a
关系,即“拥有”例子:Person
与 Address
之间的关联,Person
拥有一个 Address
实例+--------------+ -----> +--------------+| Person | | Address |+--------------+ +--------------+
4.聚合(Aggregation)
符号:空心菱形加箭头含义:弱的“拥有”关系,表示一个类可以包含多个对象,但这些对象的生命周期独立于容器类用途:表示组成关系,如“部分-整体”例子:Library
和 Book
之间的关系,图书馆有很多书籍,但书的生命周期独立于图书馆+-------------+ ◇------> +-------------+| Library | | Book |+-------------+ +-------------+
5.组合(Composition)
符号:实心菱形加箭头含义:强的“拥有”关系,表示一个类包含的对象的生命周期依赖于容器类表示“整体-部分”的强依赖关系例子:House
和 Room
,房间属于房子,房子不存在房间也不复存在+-------------+ ◆------> +-------------+| House | | Room |+-------------+ +-------------+
6.依赖(Dependency)
符号:虚线箭头含义:表示一个类依赖于另一个类的功能或存在,但这种依赖是临时的,往往在方法中传递对象时体现用途:表示某个类临时需要另一个类的帮助例子:Driver
依赖Car
,因为Driver
需要开车+--------------+ --------> +--------------+| Driver | | Car |+--------------+ +--------------+
3.关系的多重性(Multiplicity)
类与类之间的关联、聚合和组合通常会附带多重性信息,用来描述类之间的数量关系
1
:一个实例0..1
:零个或一个实例*
:多个实例1..*
:至少一个实例 例如:Person
和Car
之间的多重性可以表示为一个人拥有多辆车:
+--------------+ 1 ------ * +------------+| Person | | Car |+--------------+ +------------+
4.分层次理解复杂的类图
对于复杂的类图,建议逐步理解: 先看类和继承关系:继承关系往往是系统设计的主干结构再看类之间的关联:查看关联类、聚合和组合等关系,理解类的交互最后关注细节:检查类的具体属性和方法 示例:假如有以下类图Vehicle
是基类,Car
是其子类,Car
继承了Vehicle
的所有属性和方法,同时也有自己的方法drive()
Person
类与Address
类存在关联,表示每个Person
都有一个Address
对象这类图清晰地描述了类之间的继承和关联关系,并定义了各自的属性和方法+------------------+ +-----------------+| Vehicle |◄-----------| Car |+------------------+ +-----------------+| +maxSpeed() | | +drive() |+------------------+ +-----------------++------------------+ +-----------------+| Person |----------->| Address |+------------------+ +-----------------+| +getName() | | +getStreet() |+------------------+ +-----------------+
总结: 先看类名、属性和方法分析类与类之间的关系:继承、实现、依赖、聚合、组合等注意符号、可见性、关联的多重性逐层解析复杂图,先抓住主干,再深入细节 5. 抽象类与接口
抽象类:类名斜体表示一个类是抽象类 抽象类不能直接实例化,通常被继承抽象类中可能有抽象方法(没有实现的方法),子类需要提供具体实现例子:+-------------------+| *AbstractVehicle* | ← 斜体表示抽象类+-------------------+
接口:通常用一个矩形框表示,包含一组方法定义,但不包含方法的实现 接口用于定义行为的规范例子:+---------------------+| IVehicleBehavior | ← 接口类+---------------------+| +start(): void || +stop(): void |+---------------------+
6. 静态成员
在类图中,静态成员通常使用下划线表示 这表示该属性或方法是属于类的,而不是某个特定对象的示例:_totalCars
是类Car
的静态变量,所有Car
实例共享这个变量。+----------------------+| Car |+----------------------+| _totalCars: int | ← 静态变量+----------------------+| _getTotalCars(): int | ← 静态方法+----------------------+