UML 类图有如下关系:继承(泛化)、实现、依赖、关联、聚合、组合。  
关联 Association
定义
表示一个类中拥有另外一个类的实例,可以用直线,单箭头,双向箭头表示。
多重度
多重度有:1, 1..*, 0..*, 0..1,对应表示一个类的实例能够与另一个类的多少个实例相关联。  
0..1
表示拥有 0 或者 1 个实例。0..*或者*
表示没有实例个数限制:0 个或多个。1
表示仅仅拥有 1 个实例。1..*
表示至少拥有 1 个实例。n..m
表示拥有n到m个实例。
类图

Customer 拥有多个 Car 的实例,类图关系通常使用单箭头表示。  
Java 示例
1  | public class Car {  | 
聚合 Aggregation
其中菱形表示整体对象,箭头表示部分对象。
定义
比关联的关系更进一步,通常聚合有包含(has-a)的意思,表示整体对象包含部分对象,而关联中的两个类是平级关系。整体对象不存在时,部分对象可以独立存在。使用空心菱形和箭头表示。  
类图结构

Car 包含一个 Engine,但是 Engine 可以独立存在。  
Java 示例
1  | public class Engine{  | 
组合 Composition
其中菱形表示整体对象,箭头表示部分对象。
定义
组合可以理解为特殊的聚合,整体对象和部分对象关系非常密切不能缺失,通常是强烈包含(contains-a)的意思。整体对象与部分对象具有同一生命周期,整体对象控制着部分对象的创建和销毁。当整体对象不存在时,部分对象也不存在。使用实心菱形和箭头表示。  
类图结构

Head 是 Bird 身体的一部分,不能独立存在。Head 实例是在 Bird 中创建的,由 Bird 控制它的生命周期。  
Java 示例
1  | public class Head {  | 
继承(泛化) Generalization
定义
表示类的继承,子类和父类是 is-a 关系。使用空心三角实直线表示。  
类图结构

Tiger 是 Animal 的子类,都有吃的动作。  
Java 示例
1  | public class Animal{  | 
实现 Realization
定义
表示接口的实现,使用空心三角虚直线表示。
类图结构

ArrayList 实现了 List,完善所有的方法。  
Java 示例
1  | public interface List{  | 
依赖 Dependency
定义
主要体现某个类的方法使用了另外一个类的对象,两个类之间不存在拥有,包含等关联关系。使用虚线箭头表示。
类图结构

Person 在计算时使用了 Computer 去计算。  
Java 示例
1  | public class Computer{  | 
小结
各种关系的强弱顺序:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖。
- 关联的两个对象之间一般是平等的
 - 聚合和组合都是关联关系,但是强弱有区别。聚合关系是 
has-a关系,组合关系是contains-a关系 
网上有一个比较全的例子,体现类图的所有关系:

工具
本文画类图的工具为:StarUML 。工具箱中的功能基本满足常见类图需求,常用使用技巧:
- 接口实现
使用Composite Structure --> Realization来表示,默认的Interface Realization是一条直线。
 - 注释换行
使用shift + Enter实现换行。 - 内部类
在右边的Model Explorer中,直接将类Builder拖入类Product,就可以表示内部类。将Builder拖入类图中后,会多一个from Product的标识。