文章目录
阅读文本大概需要 6.66 分钟。
前言
大家好,这是首发于公众号「蜗牛永动机」的趣谈 Java 系列教程。学习一门语言最好的办法,就是教会别人。在这个公众号,我会从最基础的教程开始写起,一方面是为了更好地复习巩固 Java 基础,另一方面也是慢慢进阶的过程。喜欢的朋友请点关注,每天一小步,一年后就是一大步。废话不多说,开始今天的文章。
1 简单了解 UML 中的类图结构
在学习类(对象)之间的关系之前,首先来了解一下 UML 中一个类是如何表示的。在 UML 中,一个类主要由三个部分组成,具体如下:
类名
属性(成员变量)的名称和类型
方法的名称、返回类型和参数
比如,我们可以看到一个 Person 类和一个 Employee 类的类图表示如下:
有些童鞋可能看得很仔细,应该注意到了上图中的属性或方法的前面标有 - 或 + 号。这里也顺便提一下,这几种符号表示的是属性和方法的可见性。通常,在 UML 中表示类图的时候,表示属性或方法可见性的符号主要有以下三种:
+ 表示 public
- 表示 private
# 表示 protected
比如,我们可以从上图中 Person 和 Employee 的类图中看出,Person 类有 3 个私有属性和 5 个公有方法,而 Employee 类则有 3 个私有方法和 6 个公有方法。
2 UML 中类之间的关系概述
类(对象)之间通常有两种主要的结构关系,一种是一般—>特殊关系,另一种是整体—>部分关系。从这两种类的结构关系中又可以细分出来很多种具体的类(对象)关系。
通常,一般—>特殊关系主要指的是一种 is a关系,其中最典型的代表就是泛化关系(继承关系)和实现关系。
继承关系(generalization)
实现关系(generalization)
整体—>部分关系则指的是一种 has a关系,这又怎么理解呢?因为这种结构就是典型的组装结构,也即典型的组合关系。通常,我们会在 Java 中的一个类中嵌入另一个类的对象来实现这种组合关系。整体—>部分关系通常包括以下几种类(对象)关系:
关联关系(association)
依赖关系(dependency)
聚合关系(Aggregation)
组合关系(Composition)
3 类(对象)之间的关系详解
3.1 一般—>特殊关系
3.1.1 继承关系(generalization)
在 Java 中通过关键字 extends 来表示继承关系。这里的 is a 关系要怎么理解呢?因为 Java 中子类继承自父类,子类是一种特殊的父类,所以简单粗暴地理解就是子类 is a 父类。具体到生活中的例子,比如人—>动物,这就是典型的一般—>特殊关系,人是一种动物这完全说得通,但是反过来说动物是一种人,这很显然就说不通了。
所以,不妨换个角度来理解,父类范围更大,而子类范围更小,也即父类指代的是更泛、更一般的概念,而子类则代表的是一种更特殊、更具体的特指。也就是说,这是完全符合一般—>特殊关系的。再比如猫头鹰是一种鸟,但不能反过来说鸟是一种猫头鹰,这很显然说不通,完全一样的道理。所以,我们可以得出这样的结论:
继承关系封装了这样一种逻辑:「XX是一种XX」,只要这种关系能说得通,就可以考虑用继承关系来封装它。
继承关系在 UML 类图中用 实线 + 实心箭头 表示。