一、类的属性和方法
类包含类名、属性(field)、方法(methods),用矩形表示,如下图是 Employee 类,有 name、age、email 三种属性,和 modifyInfo() 方法。
属性的完整格式是:可见性 名称:类型 [=缺省值]
方法的完整格式是:可见性 名称(参数列表)[: 返回类型]
可见性有三种符号:+ 表示 public,# 是 protected,- 是 private。
二、类间的关系
2.1 关联关系
关联关系是一种强依赖的关系,假设有两个类,类A和类B,类B作为类A的成员变量存在,类A也可为类B的成员变量存在,如果互为成员变量则为双向依赖,否则为单向依赖。
关联关系与依赖关系的区别在于,依赖关系是一种临时的关系,依赖关系主要体现在方法参数,当调用方法时才有关系,关联关系是一种长期的关系,主体现在成员变量,无论是否调用方法这种关系都存在。
2.1.1 单向关联
用带箭头的直线表示,表示拥有。
如下图:每个 Customer(顾客)都 has(拥有)一个 Address(地址)。这通过让 Customer 类持有一个 Address 类型的成员变量 来实现。
2.1.2 双向关联
双向关联,用不带箭头的直线表示,表示双方各自持有对方类型的成员变量。
如下图:每个 Customer(顾客)都有一堆 Products[](商品),每个 Product(商品)都记录了被售卖给了哪个 Customer(顾客)。
2.1.3 自关联
用一个带箭头的直线指向自身,即自关联,即自己包含自己。
如下图:Node 类包含 类型为 Node 的成员变量
2.2 聚合关系
聚合关系,是一种特殊的关联关系,其表示整体和部分间的关系。
其强调“整体”包含“部分”,但“部分”可以脱离“整体”而独立存在。
用带空心菱形和箭头的直线表示,菱形在整体类一侧。
如下图:Car(汽车)contains(包含了)Engine(发动机),而 Engine 脱离了 Car 也能独立存在。
2.3 组合关系
聚合关系,是一种特殊的关联关系,其表示整体和部分间的关系。
组合关系和聚合关系的区别是:“部分”脱离了“整体”就不复存在。
如下图,Mouth(嘴)是 Head(头)的一部分,且不能脱离了头儿单独存在。
用带实心菱形的直线表示,菱形在整体类一侧。
2.4 依赖关系
- 依赖关系是uses-a关系,关联关系是has-a关系。
- 依赖关系除了被依赖方作为依赖方的方法参数,还可能作为依赖方的方法返回值存在
- 用带箭头的虚线表示。
- 如下图,Driver 的 drive 方法,只有传入了一个 Car 对象才能发挥作用,因此 Driver 类依赖于 Car 类。
![](https://img-blog.csdnimg.cn/direct/a132e5c39dc847c9b25e5717c5e16be3.png)
2.5 继承(泛化)关系
基类和派生类之间,用带空心三角形的直线表示。
2.6 接口实现关系
多个类可以共同实现同一个接口。
三、类与类之间的关系
类与类之间的关系可以根据关系的强度依次分为以下五种:
依赖关系(Dependency) < 关联关系(Association) < 聚合(Aggregation) < 组合(Composition) < 泛化(Generalization)
四、依赖、关联、聚合和组合代码具体实例
- 依赖关系比较好区分,它是耦合度最弱的一种,在java中表现为局域变量、方法的形参,或者对静态方法的调用,如下面的例子:Driver类依赖于Car类,Driver的三个方法分别演示了依赖关系的三种不同形式。
class Car {
public static void run(){
System.out.println("汽车在奔跑");
}
}
class Driver {
//使用形参方式发生依赖关系
public void drive1(Car car){
car.run();
}
//使用局部变量发生依赖关系
public void drive2(){
Car car = new Car();
car.run();
}
//使用静态变量发生依赖关系
public void drive3(){
Car.run();
}
}
- 关联关系在java中一般使用成员变量来实现,有时也用方法形参的形式实现。依然使用Driver和Car的例子,使用方法参数形式可以表示依赖关系,也可以表示关联关系,毕竟我们无法在程序中太准确的表达语义。在本例中,使用成员变量表达这个意思:车是我自己的车,我“拥有”这个车。使用方法参数表达:车不是我的,我只是个司机,别人给我什么车我就开什么车,我使用这个车。
class Driver {
//使用成员变量形式实现关联
Car mycar;
public void drive(){
mycar.run();
}
...
//使用方法参数形式实现关联
public void drive(Car car){
car.run();
}
}
- 聚合关系是是一种比较强的关联关系,java中一般使用成员变量形式实现。对象之间存在着整体与部分的关系
class Driver {
//使用成员变量形式实现聚合关系
Car mycar;
public void drive(){
mycar.run();
}
}
- 假如赋予如下语义:车是司机的必须有的财产,要想成为一个司机必须要先有辆车,车要是没了,司机也不想活了。而且司机要是不干司机了,这个车就砸了,别人谁也别想用。那就表示组合关系了。一般来说,为了表示组合关系,常常会使用构造方法来达到初始化的目的,例如上例中,加上一个以Car为参数的构造方法。
public Driver(Car car){
mycar = car;
}