【Java面向对象】5-4 类的关系
§5-4 类的关系
在继承中,介绍了类的继承关系。在本节,会介绍类的其他关系:关联、依赖、组合、聚合。
5-4.1 类的关系总览
类与类之间的关系,总而言之,分为 "is a" "has a" "use a" 三种关系。[^ 注1]
- "is a":包括继承、实现关系;
- "has a":包括组合、聚合、关联关系;
- "use a":包括依赖关系;
5-4.2 "is a" 关系
5-4.2.1 继承(inheritance)
类的继承关系已经在 继承 一节中讲过。继承一般是指类(接口)继承另外一个类(接口)的功能和属性,并且可以增加自己的功能和属性的能力,通过关键字 extends
标识。
代码示例:
public class Transportation {}
public class Vehicle extends Transportation{}
5-4.2.2 实现(realization)
实现是指一个类实现了一个(可以是多个)接口的功能,这是类与接口最为常见的关系,通过关键字 implements
标识。在[继承](5 - 4 继承.md)一节中所提到的clone()
方法,就涉及到了Cloneable
接口。
代码示例:来自 JDK 源码
public class Throwable implements Serializable {...}
public interface Serializable {;}
5-4.3 "use a" 关系:依赖(dependency)
"use a" 关系中只有依赖。简而言之,依赖就是一个类使用到了另外一个类,这种使用是偶然、临时、非常弱的,被使用的类所发生的变化会影响到前者类。例如人要从 A 去往 B,使用了某种交通工具 T,那么在这个过程中人对交通工具 T 的关系就是依赖。体现在代码,就是类 A 中的方法以类 B 为其中一个参数来使用。
代码示例:某人乘坐公交车从 A 前往 B。
public class Person {
public void move(Bus bus, String locA, String locB) {
bus.move(locA,locB);
}
}
public class Bus {
public void move(String locA, String locB) {}
}
5-4.4 "has a" 关系
5-4.4.1 关联(association)
关联体现的是两个类在语义上的一种强依赖关系,这种关系更强,更长久,而不像依赖关系中短暂、临时、偶然,双方的地位是平等的。关联关系可以是单向的,也可以是双向的。表现在代码上,被关联类 B 以类的成员属性的形式出现在关联类 A 中(聚合 / 包含),也可能是关联类 A 引用了一个类型为被关联类 B 的一个全部变量。
关联关系一般可以分为两类:
- 单向关系:单向一对一、单向一对多、单向多对一、单向多对多;
- 双向关系:双向一对一、双向一对多、双向多对一、双向多对多;
5-4.4.2 聚合(aggregation)
聚合关系是关联关系的一种特例,体现的是整体与部分的关系,即 "has a" 的关系,此时整体与部分之间是可分离的。它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象所共享。例如计算机与 CPU、公司与员工的关系等。表现在代码层面上,同关联关系,只能从语义上区分。
代码示例:
public class Button {}
public class Shirt {
private Button button_1;
public Shirt(Button button_1) {
this.button_1 = button_1;
}
}
若需要代码重用,则使用聚合。
5-4.4.3 组合(composition)
组合关系也是关联关系的一种特例,它体现的是一种 "contains a" 的关系,这种关系比聚合更强,也称为强聚合。二者具有相同的生命周期,也是一种整体和部分的关系,但此时二者密不可分。
代码示例:
public class Heart {}
public class Brains {}
public class Person {
private final Heart heart;
private final Brains brains;
public Person() {
this.heart = new Heart();
this.brains = new Brains();
}
}
5-4.A 附录:脚注
本节内容源自下方博文,有删改。
[^ 注1]: JAVA类与类之间的全部关系简述+代码详解_类的关系 代码体现_快乐李同学(李俊德-大连理工大学)的博客-CSDN博客