【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博客

posted @ 2023-04-11 20:33  Zebt  阅读(51)  评论(0)    收藏  举报