1.6 继承
继承使用基类型和导出类型的概念表示了这种类型之间的相似性。
导出类型可以对基类型添加或者修改,对基类型的修改也会反应到导出类型中。
一个基类型包含其所有导出类型所共享的特性和行为。可以创建一个基类型来表示系统中某些对象的核心概念,然后从基类型中导出其他类型来表示此核心可以被实现的各种不同方式。这种类型层次结构,可以直接从真实世界中对系统的描述过渡到用代码对系统的描述,大大简化了代码实现。
导出类不仅包括现有类型的所有成员(private成员除外),更重要的是它复制了基类的接口。也就是说,所有发送给基类对象的消息同时也可以发送给导出类对象。由于通过发送的消息的类型可知类的类型,所以导出类和基类具有相同的类型。通过继承产生了类型等价性。
有两种方法可以使基类与导出类产生差异:
一、直接在导出类中添加新方法;
二、改变现有基类的方法的行为,即覆盖(overriding)。
继承中的关系细分:
1. “是一个”关系(is-a): 只覆盖基类的方法(也称纯粹代替,或者代替原则);
2. “像是一个”关系(is-like-a): 添加了新方法,即扩展了接口。
1.7 伴随多态的可互换对象
在处理类型的层次结构上,经常把一个对象不当作它所属的特定类型来对待,而是将其当作其基类的对象来对待。这使得人们可以写出不依赖于特定类型的代码。这样通过导出新的子类型而轻松扩展原有设计,这也极大地改善了设计,同时降低了软件维护的代价。
OPP与非面向对象编程最重要的区别:
OOP编译器不可能产生传统意义上的函数调用,而非面向对象编程的编译器产生的函数调用会引起所谓的前期绑定。在OOP中,程序直到运行时才能够确定代码的地址,这也称为后期绑定。当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码。
在Java中,动态绑定是默认的,在C++中,需要使用virtual关键字声明。
将导出类看作是它的基类的过程叫做向上转型(upcasting)。一个面向对象程序肯定会在某处包含向上转型,因为这正是将自己从必须知道确切类型中解放出来的关键。
Java通过一段特殊的代码,让编译器和运行系统处理了多态的细节,程序员不必知道详细调用过程。
1.8 单根继承结构
在Java中,所有的类最终都继承与object。
单一继承的好处:
1. 便于其他OOP语言内置;
2. 获取任何新类库时,方便兼容,提高了生产率;
3. 所有对象都可以很容易地在堆上创建,而参数传递也得到了极大的简化;
4. 使得垃圾回收器的实现变得容易的多(垃圾回收器是Java对C++的重要改进之一);
5. 给编程带来了更大的灵活性,尤其是系统级操作(如异常处理)。
注:以前对很多概念都是一知半解。希望同学们要多读经典书籍。