本章将向大家解释
Java
的多项设计思想,并从概念上解释面向对象的程序设
计。但要注意在阅读完本章后,并不能立即编写出全功能的
Java
程序。所有详
细的说明和示例会在本书的其他章节慢慢道来。
1.1
抽象的进步
所有编程语言的最终目的都是提供一种“抽象”方法。一种较有争议的说法
是:解决问题的复杂程度直接取决于抽象的种类及质量。这儿的“种类”是指准
备对什么进行“抽象”?汇编语言是对基础机器的少量抽象。后来的许多“命令
式”语言(如
FORTRAN
,
BASIC
和
C
)是对汇编语言的一种抽象。与汇编语言
相比,这些语言已有了长足的进步,但它们的抽象原理依然要求我们着重考虑计
算机的结构,而非考虑问题本身的结构。在机器模型(位于“方案空间”)与实
际解决的问题模型(位于“问题空间”)之间,程序员必须建立起一种联系。这
个过程要求人们付出较大的精力,而且由于它脱离了编程语言本身的范围,造成
程序代码很难编写,而且要花较大的代价进行维护。由此造成的副作用便是一门
完善的“编程方法”学科。
为机器建模的另一个方法是为要解决的问题制作模型。对一些早期语言来
说,如
LISP
和
APL
,它们的做法是“从不同的角度观察世界”——“所有问题
都归纳为列表”或“所有问题都归纳为算法”。
PROLOG
则将所有问题都归纳为
决策链。对于这些语言,我们认为它们一部分是面向基于“强制”的编程,另一
部分则是专为处理图形符号设计的。每种方法都有自己特殊的用途,适合解决某
一类的问题。但只要超出了它们力所能及的范围,就会显得非常笨拙。
面向对象的程序设计在此基础上则跨出了一大步,程序员可利用一些工具表
达问题空间内的元素。由于这种表达非常普遍,所以不必受限于特定类型的问题。
我们将问题空间中的元素以及它们在方案空间的表示物称作“对象”(
Object
)。
当然,还有一些在问题空间没有对应体的其他对象。通过添加新的对象类型,程
序可进行灵活的调整,以便与特定的问题配合。所以在阅读方案的描述代码时,
会读到对问题进行表达的话语。与我们以前见过的相比,这无疑是一种更加灵活、
更加强大的语言抽象方法。总之,
OOP
允许我们根据问题来描述问题,而不是
根据方案。然而,仍有一个联系途径回到计算机。每个对象都类似一台小计算机;
它们有自己的状态,而且可要求它们进行特定的操作。与现实世界的“对象”或
者“物体”相比,编程“对象”与它们也存在共通的地方:它们都有自己的特征
和行为。
Alan Kay
总结了
Smalltalk
的五大基本特征。这是第一种成功的面向对象程
序设计语言,也是
Java
的基础语言。通过这些特征,我们可理解“纯粹”的面
向对象程序设计方法是什么样的:
(1)
所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但
可要求它对自身进行操作。理论上讲,可从要解决的问题身上提出所有概念性的
组件,然后在程序中将其表达为一个对象。
(2)
程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。
为了向对象发出请求,需向那个对象“发送一条消息”。更具体地讲,可将消息
想象为一个调用请求,它调用的是从属于目标对象的一个子例程或函数。
(3)
每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现
评论