- 关键字class可以将数据和功能封装到一起。因此可以对问题空间的观念给出恰当的表示,而不用受限于必须使用底层机器语言。
- **继承:**能够以现有的类为基础,复制它,然后通过添加和修改这个副本来创建新类。
- 当源类(基类,超类或父类) 发生变动时,被修改的”副本“(导出类,继承类或子类)也会反映出这些变动。 在UML图中,箭头从导出类指向基类。 基类 <| ------ 导出类
- 类型不仅仅只是描述了作用于一个对象集合上的约束条件,同时还有与其他类型之间的关系。两个类型可以有相同的特性和行为,但是其中一个类型可能比另一个含有更多的特性,并且可以处理更多的消息(或以不同的方式来处理消息)。
- 继承使用基类型和导出类型的概念表示了这种类型之间的相似性。一个基类型包含其所有导出类型所共享的特性和行为。可以创建一个基类型来表示系统中某些对象的核心概念,从基类型中导出其他类型,来表示此核心可以被实现的各种不同方式。
- 通过使用对象,类型层次结构成为了主要模型,因此,可以直接从真实世界中对系统的描述过渡到用代码对系统进行描述。
- **当继承现有类型时,也就创造了新的类型。**这个新的类型不仅包括现有类型的所有成员 (尽管private成员被隐藏了起来,并且不可访问), 而且更重要的是它复制了基类的接口。也就是说,所有可以发送给基类对象的消息同时也可以发送给导出类对象。由于通过发送给类的消息的类型可知类的类型,所有这也就意味着导出类与基类具有相同的类型。
- 通过继承而产生的类型等价性是理解面向对象程序设计方法内涵的重要门槛。
- 有两种方法可以使基类与导出类产生差异:
1)直接在导出类中添加新方法。
2)改变现有基类的方法的行为,这被称为覆盖(overriding)。使导出类和基类之间产生差异。要想覆盖某个方法,可以直接在导出类中创建该方法的新定义即可。你可以说”现在,我正在使用相同的接口方法,但是我想在新类型中做些不同的事情。“ - 导出类和基类是完全相同的类型,因为它们具有完全相同的接口。纯粹替代 或 替代原则可以用一个导出类对象来完全替代一个基类对象。
- 在某种意义上,这是一种处理继承的理想方式。经常将这种情况下的基类与导出类之间的关系称为**is-a (是一个)**关系,因为可以说”一个圆形就是一个几何形状“。
- 判断是否继承,就是要确定是否可以用is-a来描述类之间的关系,并使之具有实际意义。
- 有时必须在导出类型中添加新的接口元素,这样也就扩展了接口。这个新的类型仍然可以替代基类,但是这种替代并不完美,因为基类无法访问新添加的方法。这种情况我们可以描述为is-like-a (像是一个) 关系。新类型具有旧类型的接口,但是它还包含其他方法,所以不能说它们完全相同。
- 我理解的is-a就是在导出类没有声明新的接口函数。
is-like-a 就是在导出类声明新的接口函数。
Overriding: 创造跟基类相同的接口方法,但是函数的参数跟基类不一样。
Java 学习笔记 -- 第一章 对象导论 (1.6)
最新推荐文章于 2020-08-10 06:24:10 发布