这本书是由Bruce Eckel,这个人也许不熟悉,但是他的作品可是如雷贯耳啊,Bruce Eckel是MindView公司的总裁,这个公司提供一些软件资讯和培训。他是C++标准委员会拥有表决权的成员之一,拥有应用物理学学士和计算机工程硕士学位。Bruce Eckel从1984年至今,已经发表了超过150篇计算机技术文章,出版了6本书.他的《Thinking in C++》一本书在1995年被评为“最佳软件开发图书”,《Thinking in Java》被评为1999年Java World“最受读者欢迎图书”,并且赢得了编辑首选图书奖。
第一章-对象导论
1.1抽象过程
主要介绍oop的由来,计算机来源于机器,作者认为编程语言都提供抽象的机制来解决问题,置于抽象出来的东西就是类型了。
抽象有两种方式,一种是针对计算机内部的结构,比如早期的basic、c语言等,另一种就是针对问题本身,这种方式又衍生出了面向对象的方式。而且oop又和计算机有联系,作者把这种解决问题的对象看成是一个微型计算机,因为它有状态又有操作,用户可以让对象执行这些操作。
java的前生语言smalltalk,有五个基本特征:
1)万物皆对象
为什么这么说呢?作者认为:你可以把一个需要解决的问题,任何具有概念化的东东,都可以定义为对象。
2)程序就是一组对象的集合,对象之间通过发送消息和接收消息来相互通讯的
这个消息是啥呢?就是我对一个对象的方法进行调用,就相当于我对他发送了一个消息。在现实中,就像我对你说了一句话(发送消息),我得先喊你的名字,明确是对你说的呀!
3)每个对象都是由其他对象构成的
原文中,对于这个解释非常绕口,我就从我的角度说一下就行了,你也可以有其他的想法。作者的意思就是对象里面套对象,因此可以创建无线复杂的对象,当然这只是理论上...
4)每个对象都有类型
这个相信大家都懂得,每个对象都是类型class的一个实例。有一点需要注意的是,类与类之间的区别就是“能够发送什么样的消息给它”(谨记)。
5)某一类型的所有对象可以接受同样的消息
这里有两层意思,第一所有对象都是这个类生出来的,所以可以发送相同的消息;另一种情况就是父类-子类概念,比如圆形的对象同时也是一个几何形,作者称之为可替代性(substitutablity)。
最后booch更加简洁的描述了对象:就是状态、行为和标识,就是常说的属性、方法和内存地址(或者名字)。
1.2每个对象都有一个接口
首先作者把我们伟大的哲学家亚里士多德搬出来了,这大哲学家太聪明了,早就看出类型(type)的概念了。敬佩!
作者认为,我们编程的过程就是创建新类型的过程,还有一点,程序都有内置的类型,比如浮点型,我们要面向实际问题中的类型,而不是计算机存储的数据类型。
oop的设计思想就是在问题空间和解空间之间寻找对象的映射关系(这句话比较抽象)。通俗一点解释:要解决问题,就是发生一系列的动作,而这些动作属于某一个对象,比如灯泡这个类型,有开灯这个动作,而这些动作集合就是接口。
这个过程就是向某个对象发消息,比如灯泡这个对象,我可以对他请求开灯、关灯操作。
最后说一下uml统一建模语言:
它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持。UML规范用来描述建模的概念有,类(对象的)、对象、关联、职责、行为、接口、用例、包、顺序、协作,以及状态。
1.3 每个对象都提供服务
如果要开发一个程序,就得把问题从表象抽取出来,什么样的对象能够解决我的问题,因此将对象看作是服务提供者,有助于提高对象的内聚性。
1.4被隐藏的具体实现
类创建者需要向程序员暴露必须的部分而隐藏其他的部分,需要隐藏的东西通常来说是一个对象脆弱的部分,容易被修改,并且这部分东西可以被类创建者随意修改,而不会对其他造成影响。
还有重要的一点就是访问控制,允许类内部可以随意更改,而不会对累的使用造成影响,接口与实现相分离,访问控制词如下:
1.5复用具体实现
最简单的复用就是一个类中的成员包含另一个类的对象,使用现有的类合成新的类就叫组合(composition),如果这种组合是动态的就叫聚合(aggregation),是has-a的关系,比如汽车拥有引擎,URL图如下,
1.6继承
继承的UML图用一个空心的三角形表示 。
使用继承主要是使基类和导出类产生差异,有两种方法,
第一,直接在导出类中添加新方法;
第二,覆盖(overriding)
1.6.1“是一个”。与“像是一个”关系
要明白一个概念“替代原则”:导出类覆盖基类的方法,拥有完全相同的接口,导出类对象可以完全替代基类对象,称之为“纯粹替代”。
1.7伴随多态的可互换对象
这个小节说的很晦涩,大致意思就是,我们可以用导出类对象直接替换基类对象,但是实际执行的方法到最后运行的时候才能确定,编译期是不确定具体执行哪个对象的代码的。
将导出类看成是基类成为“向上转型”(upcasting),这是“多态”的一种。
1.8单根继承结构
java所有的类型都继承自Object这个类,因此所有对象可以拥有共同的接口,这样操作起来就非常方便,比说垃圾回收器,在堆上创建对象。