Java 类之间关系

在 Java 以及其他的面向对象设计模式中，类与类之间主要有 6 种关系，分别是：依赖、关联、聚合、组合、继承、实现，他们的耦合度依次增强。

纵向关系

继承

实现

横向关系

依赖

关联

整体和局部
组成型整体和局部，聚堆儿型的整体和局部

继承关系 / 泛化关系

继承指的是一个类（称为子类、子接口）继承另外的一个类（称为父类、父接口）的功能，并可以增加它自己的新功能的能力。在 Java 中继承关系通过关键字extends明确标识，在设计时一般没有争议性。在 UML 类图设计中，继承用一条带空心三角箭头的实线表示，从子类指向父类，或者子接口指向父接口。

实现关系

实现指的是一个class类实现interface接口（可以是多个）的功能，实现是类与接口之间最常见的关系。在 Java 中此类关系通过关键字implements明确标识，在设计时一般没有争议性。在 UML 类图设计中，实现用一条带空心三角箭头的虚线表示，从类指向实现的接口。

依赖关系

简单的理解，依赖就是一个类A使用到了另一个类B，而这种使用关系是具有偶然性的、临时性的、非常弱的，方法执行完，这个关系就不存在了，就是临时使用了一下功能，但是类B的变化会影响到类A。比如某人要过河，需要借用一条船，此时人与船之间的关系就是依赖。表现在代码层面，为类 B 作为参数被类 A 在某个method方法中使用。在 UML 类图设计中，依赖关系用由类 A指向类B的带箭头虚线表示。
在程序的整个流程中 (程序的生命周期), 某个步骤，某几个有限的步骤，需要另外一个类的功能才能完成

一个方法中调用了另外一个类

说白话：就是一个类的局部变量是另一个类的对象的引用

关联关系

关联体现的是两个类之间语义级别的一种强依赖关系，比如我和我的朋友，这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的，一般是长期性的，而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面，为被关联类 B 以类的属性形式出现在关联类 A 中，

Copy
ClassC cc = new ClassC()
ClassC.staticVar

全局变量，就是指他的成员变量，静态变量
也可能是关联类A引用了一个类型为被关联类B的全局变量。在 UML 类图设计中，关联关系用由关联类 A 指向被关联类 B 的带箭头实线表示，在关联的两端可以标注关联双方的角色和多重性标记。

就是一个类成员变量或者静态变量是另外一个类的引用或者是类对象的引用

聚合关系

聚合是关联关系的一种特例，它体现的是整体与部分的关系，即 has-a 的关系。此时整体与部分之间是可分离的，它们可以具有各自的生命周期，部分可以属于 多个整体对象，也可以为多个整体对象共享。比如计算机与 CPU、公司与员工的关系等，比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。表现在代码层面，和关联关系是一致的，只能从语义级别来区分。在 UML 类图设计中，聚合关系以空心菱形加实线箭头表示。

一类中的集合元素是另外一个类的对象的引用

组合关系 / 合成关系

组合也是关联关系的一种特例，它体现的是一种 contains-a 的关系，这种关系比聚合更强，也称为强聚合。它同样体现整体与部分间的关系，但此时整体与部分是不可分的，整体的生命周期结束也就意味着部分的生命周期结束，比如人和人的大脑。表现在代码层面，和关联关系是一致的，只能从语义级别来区分。在 UML 类图设计中，组合关系以实心菱形加实线箭头表示。

一个类中的集合中的元素是另外一个类对象的引用

总结

对于继承、实现这两种关系没多少疑问，它们体现的是一种类和类、或者类与接口间的纵向关系。其他的四种关系体现的是类和类、或者类与接口间的引用、 横向关系，是比较难区分的，有很多事物间的关系要想准确定位是很难的。前面也提到，这四种关系都是语义级别的，所以从代码层面并不能完全区分各种关系，但 总的来说，后几种关系所表现的强弱程度依次为：组合 > 聚合 > 关联 > 依赖。

软件开发的流程