1.类之间的关系
这篇博文很清晰的讲述了Java中类与类之间的关系以及对应的UML图
类与类之间的几种关系 - 残剑_ - 博客园 http://www.cnblogs.com/liuling/archive/2013/05/03/classrelation.html
2.类之间的关系简化版
经过分析Java对象之间的关系只有三种:
- 1.继承关系【继承】【实现】
- 2.整体与部分的关系【聚合】【组合】
- 3.利用关系【依赖】【关联】
利用关系总体来说是一种平级的关系。依赖是一种短期的利用关系,比如你要过河,需要船,你与船的关系(局部变量、方法的参数,对静态方法的调用);关联是一种长期的利用关系,比如你每天都开车上班,你与车子的关系(一般以属性的形式出现)。利用关系有单项的也有双向的,比如朋友之间的利用关系就是双向的(你帮他写作业,他帮你带早点等等)。平时的设计中要学会尽量减少依赖,有图为证。
注:对静态方法的调用,虽然也能表示依赖关系,但是我觉得更多的是以工具类的形式出现的,而不是对象的形式出现的。
通过以上,容易的发现的是【聚合】【组合】【关联】Java中体现形式很相似(都以属性的形式出现),所以只能通过语义区分。
之所以,先在这里谈到关系,主要是为了下一个主题——访问控制做准备的,因为既然能够访问肯定存在关系。而访问控制其实很合理,就像你去朋友家做客,一般都是到客厅(public),而不会冒昧的的去主卧(private)。至于如下的讲到的复用与多态决不是我的原有的思路,也不是主线,可以先跳过。
3.复用(继承、组合/聚合)
无论是【继承】还是【组合】【聚合】都是复用的具体实现。这里为什么没有说到【实现】呢,因为实现的是接口,接口是抽象的,是一种规则,所以实现也是如其字面含义所体现的那样,仅仅是实现了。
“由于继承在面向对象程序设计中如此重要,所以他经常被高度强调,于是程序员新手就会有这样的印象:处处都应该使用继承。这会导致难以使用并过分复杂的设计。实际上,在建立新类时,应该首先考虑组合,因为它更加简单灵活。”【1.5节】
那么既然继承存在,肯定有它的价值。因为继承与组合/聚合 表达的理念是不一样的。
【继承】比如我们会说,哈士奇是狗,这样我们在设计的时候,就可以在狗的基础上进行设计,然后加上哈士奇的特征(傻乎乎,囧等)就可以了。书中有如下表述:“有两种方法可以使基类与导出类产生差异。第一种方法非常直接:直接在导出类中添加新方法。”【1.6节】当然这种一般是从具体到具体,还有一种是从抽象到具体,比如从Shape到Circle、Square等,当我们求面积的时候,Shape是抽象的,是没有面积公式的,而圆形、方形则有自己的面积公式。书中有如下表述:“第二种也是更重要的一种使导出类和基类之间产生差异的方式是改变现有基类的方法的行为,这被称之为覆盖。”【1.6节】
【组合】【聚合】体现的是从整体与部分的思想与解读的,比如电脑由主机、显示器、键盘、鼠标等组成。那么电脑自然是整体,主机、键盘自然是部分(电脑类中成员变量)。
4.多态
正因为继承所能够表达出的那种理念,所以设计者才发现一个问题:
比如说有一个类专门负责计算各种图形的面积。每次计算圆形面积的时候,要调用一次圆形类中的方法,计算方形面积的时候,就要调用方形类中的方法。考虑到后续拓展是未知的,因此每加一个图形,都要写一次调用。那么,能不能传入Shape做参数,直接跟Shape沟通呢?因为无论加什么图形都继承自Shape,理论上应该行得通的。
“通过继承而产生的类型等价性是理解面向对象程序程序设计方法内涵的重要门槛”【1.6节】
这句话,就是告诉我们一个道理“白马也是马”。这应该也是Java语言仿照自然逻辑的体现吧,就像我不能说狗就是狗,狗不是动物。
多态还没有看完,考虑这是分线,那我就先放一放。