友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

Java编程思想第4版[中文版](PDF格式)-第21部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!


强的生命力。由于多方面的原因,以后对程序的改动是必不可少。但必须确定改动能够方便和清楚地进行。 

这里没有花巧可言。不仅需要理解自己构建的是什么,也要理解程序如何不断地进化。幸运的是,面向对象 

的程序设计语言特别适合进行这类连续作出的修改——由对象建立起来的边界可有效保证结构的整体性,并 

能防范对无关对象进行的无谓干扰、破坏。也可以对自己的程序作一些看似激烈的大变动,同时不会破坏程 

序的整体性,不会波及到其他代码。事实上,对“校订”的支持是OOP 非常重要的一个特点。  

通过校订,可创建出至少接近自己设想的东西。然后从整体上观察自己的作品,把它与自己的要求比较,看 

看还短缺什么。然后就可以从容地回过头去,对程序中不恰当的部分进行重新设计和重新实现(注释⑩)。 

在最终得到一套恰当的方案之前,可能需要解决一些不能回避的问题,或者至少解决问题的一个方面。而且 

一般要多“校订”几次才行(“设计范式”在这里可起到很大的帮助作用。有关它的讨论,请参考本书第 16 

章)。  

构建一套系统时,“校订”几乎是不可避免的。我们需要不断地对比自己的需求,了解系统是否自己实际所 

需要的。有时只有实际看到系统,才能意识到自己需要解决一个不同的问题。若认为这种形式的校订必然会 

发生,那么最好尽快拿出自己的第一个版本,检查它是否自己希望的,使自己的思想不断趋向成熟。  

反复的“校订”同“递增开发”有关密不可分的关系。递增开发意味着先从系统的核心入手,将其作为一个 

框架实现,以后要在这个框架的基础上逐渐建立起系统剩余的部分。随后,将准备提供的各种功能(特性) 

一个接一个地加入其中。这里最考验技巧的是架设起一个能方便扩充所有目标特性的一个框架(对这个问 

题,大家可参考第 16 章的论述)。这样做的好处在于一旦令核心框架运作起来,要加入的每一项特性就象它 

自身内的一个小项目,而非大项目的一部分。此外,开发或维护阶段合成的新特性可以更方便地加入。OOP 

之所以提供了对递增开发的支持,是由于假如程序设计得好,每一次递增都可以成为完善的对象或者对象 

组。  

  

⑩:这有点类似“快速造型”。此时应着眼于建立一个简单、明了的版本,使自己能对系统有个清楚的把 

握。再把这个原型扔掉,并正式地构建一个。快速造型最麻烦的一种情况就是人们不将原型扔掉,而是直接 

在它的基础上建造。如果再加上程序化设计中“结构”的缺乏,就会导致一个混乱的系统,致使维护成本增 

加。  



                                                            44 


…………………………………………………………Page 46……………………………………………………………

1。12。7 计划的回报  



如果没有仔细拟定的设计图,当然不可能建起一所房子。如建立的是一所狗舍,尽管设计图可以不必那么详 

尽,但仍然需要一些草图,以做到心中有数。软件开发则完全不同,它的“设计图”(计划)必须详尽而完 

备。在很长的一段时间里,人们在他们的开发过程中并没有太多的结构,但那些大型项目很容易就会遭致失 

败。通过不断的摸索,人们掌握了数量众多的结构和详细资料。但它们的使用却使人提心吊胆在意——似乎 

需要把自己的大多数时间花在编写文档上,而没有多少时间来编程(经常如此)。我希望这里为大家讲述的 

一切能提供一条折衷的道路。需要采取一种最适合自己需要(以及习惯)的方法。不管制订出的计划有多么 

小,但与完全没有计划相比,一些形式的计划会极大改善你的项目。请记住:根据估计,没有计划的50%以 

上的项目都会失败!  



1。13 Java 还是 C++ ?  



Java 特别象 C++;由此很自然地会得出一个结论:C++似乎会被Java 取代。但我对这个逻辑存有一些疑问。 

无论如何,C++仍有一些特性是Java 没有的。而且尽管已有大量保证,声称Java 有一天会达到或超过C++的 

速度。但这个突破迄今仍未实现(尽管Java 的速度确实在稳步提高,但仍未达到C++的速度)。此外,许多 

领域都存在为数众多的 C++爱好者,所以我并不认为那种语言很快就会被另一种语言替代(爱好者的力量是 

容忽视的。比如在我主持的一次“中/高级Java 研讨会”上,Allen Holub 声称两种最常用的语言是Rexx 

和COBOL)。  

我感觉 Java 强大之处反映在与 C++稍有不同的领域。C++是一种绝对不会试图迎合某个模子的语言。特别是 

它的形式可以变化多端,以解决不同类型的问题。这主要反映在象Microsoft Visual C++和Borland C++  

Builder (我最喜欢这个)那样的工具身上。它们将库、组件模型以及代码生成工具等合成到一起,以开发视 

窗化的末端用户应用(用于Microsoft Windows 操作系统)。但在另一方面,Windows 开发人员最常用的是 

什么呢?是微软的 Visual Basic (VB )。当然,我们在这儿暂且不提VB 的语法极易使人迷惑的事实——即 

使一个只有几页长度的程序,产生的代码也十分难于管理。从语言设计的角度看,尽管VB 是那样成功和流 

行,但仍然存在不少的缺点。最好能够同时拥有 VB 那样的强大功能和易用性,同时不要产生难于管理的代 

码。而这正是Java 最吸引人的地方:作为“下一代的 VB”。无论你听到这种主张后有什么感觉,请无论如 

何都仔细想一想:人们对Java 做了大量的工作,使它能方便程序员解决应用级问题(如连网和跨平台 UI 

等),所以它在本质上允许人们创建非常大型和灵活的代码主体。同时,考虑到 Java 还拥有我迄今为止尚未 

在其他任何一种语言里见到的最“健壮”的类型检查及错误控制系统,所以Java 确实能大大提高我们的编程 

效率。这一点是勿庸置疑的!  

但对于自己某个特定的项目,真的可以不假思索地将 C++换成Java 吗?除了Web 程序片,还有两个问题需要 

考虑。首先,假如要使用大量现有的库(这样肯定可以提高不少的效率),或者已经有了一个坚实的C 或 

C++代码库,那么换成 Java 后,反映会阻碍开发进度,而不是加快它的速度。但若想从头开始构建自己的所 

有代码,那么Java 的简单易用就能有效地缩短开发时间。  

最大的问题是速度。在原始的 Java 解释器中,解释过的 Java 会比C 慢上 20 到 50 倍。尽管经过长时间的发 

展,这个速度有一定程度的提高,但和C 比起来仍然很悬殊。计算机最注重的就是速度;假如在一台计算机 

上不能明显较快地干活,那么还不如用手做(有人建议在开发期间使用Java,以缩短开发时间。然后用一个 

工具和支撑库将代码转换成C++,这样可获得更快的执行速度)。  

为使Java 适用于大多数Web 开发项目,关键在于速度上的改善。此时要用到人们称为“刚好及时”(Just

In Time,或JIT)的编译器,甚至考虑更低级的代码编译器(写作本书时,也有两款问世)。当然,低级代 

码编译器会使编译好的程序不能跨平台执行,但同时也带来了速度上的提升。这个速度甚至接近 C 和 C++。 

而且Java 中的程序交叉编译应当比C 和 C++中简单得多(理论上只需重编译即可,但实际仍较难实现;其他 

语言也曾作出类似的保证)。  

在本书附录,大家可找到与Java /C++比较.对Java 现状的观察以及编码规则有关的内容。  



                                                              45 


…………………………………………………………Page 47……………………………………………………………

                      第 2 章  一切都是对象  



 “尽管以C++为基础,但 Java 是一种更纯粹的面向对象程序设计语言”。  

无论C++还是Java 都属于杂合语言。但在 Java 中,设计者觉得这种杂合并不象在 C++里那么重要。杂合语言 

允许采用多种编程风格;之所以说 C++是一种杂合语言,是因为它支持与 C 语言的向后兼容能力。由于C++是 

C 的一个超集,所以包含的许多特性都是后者不具备的,这些特性使 C++在某些地方显得过于复杂。  

Java 语言首先便假定了我们只希望进行面向对象的程序设计。也就是说,正式用它设计之前,必须先将自己 

的思想转入一个面向对象的世界(除非早已习惯了这个世界的思维方式)。只有做好这个准备工作,与其他 

OOP 语言相比,才能体会到 Java 的易学易用。在本章,我们将探讨 Java 程序的基本组件,并体会为什么说 

Java 乃至Java 程序内的一切都是对象。  



2。1 用句柄操纵对象  



每种编程语言都有自己的数据处理方式。有些时候,程序员必须时刻留意准备处理的是什么类型。您曾利用 

一些特殊语法直接操作过对象,或处理过一些间接表示的对象吗(C 或C++里的指针)?  

所有这些在 Java 里都得到了简化,任何东西都可看作对象。因此,我们可采用一种统一的语法,任何地方均 

可照搬不误。但要注意,尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄” 

 (Handle)。在其他Java 参考书里,还可看到有的人将其称作一个“引用”,甚至一个“指针”。可将这一 

情形想象成用遥控板(句柄)操纵电视机(对象)。只要握住这个遥控板,就相当于掌握了与电视机连接的 

通道。但一旦需要“换频道”或者“关小声音”,我们实际操纵的是遥控板(句柄),再由遥控板自己操纵 

电视机(对象)。如果要在房间里四处走走,并想保持对电视机的控制,那么手上拿着的是遥控板,而非电 

视机。  

此外,即使没有电视机,遥控板亦可独立存在。也就是说,只是由于拥有一个句柄,并不表示必须有一个对 

象同它连接。所以如果想容纳一个词或句子,可创建一个 String 句柄:  

String s;  

但这里创建的只是句柄,并不是对象。若此时向 s 发送一条消息,就会获得一个错误(运行期)。这是由于 

s 实际并未与任何东西连接(即“没有电视机”)。因此,一种更安全的做法是:创建一个句柄时,记住无 

论如何都进行初始化:  

String s = 〃asdf〃;  

然而,这里采用的是一种特殊类型:字串可用加引号的文字初始化。通常,必须为对象使用一种更通用的初 

始化类型。  



2。2 所有对象都必须创建  



创建句柄时,我们希望它同一个新对象连接。通常用new 关键字达到这一目的。new 的意思是:“把我变成 

这些对象的一种新类型”。所以在上面的例子中,可以说:  

String s = new String(〃asdf〃);  

它不仅指出“将我变成一个新字串”,也通过提供一个初始字串,指出了“如何生成这个新字串”。  

当然,字串(String)并非唯一的类型。Java 配套提供了数量众多的现成类型。对我们来讲,最重要的就是 

记住能自行创建类型。事实上,这应是Java 程序设计的一项基本操作,是继续本书后余部分学习的基础。  



2。2。1  保存到什么地方  



程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可 

以保存数据:  

(1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存 

器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的 

程序里找到寄存器存在的任何踪迹。  

(2) 堆栈。驻留于常规 RAM (随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆 

栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存 

方式,仅次于寄存器。创建程序时,Java 编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存 

在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活 

性,所以尽管有些 Java 数据要保存在堆栈里——特别是对象句柄,但Java 对象并不放到其中。  



                                                               46 


…………………………………………………………Page 48……………………………………………………………

(3) 堆。一种常规用途的内存池(也在 RAM 区域),其中保存了Java 对象。和堆栈不同,“内存堆”或 

 “堆”(Heap )最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要 

在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new 命 

令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然 

会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!  

(4) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM 里)。程序运行期间,静 

态存储的数据将随时等候调用。可用 static 关键字指出一个对象的特定元素是静态的。但 Java 对象本身永 

远都不会置入静态存储空间。  

(5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数 

需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。  

(6) 非RAM 存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。 

其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给 

另一台机器。而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对 

于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将它们恢复 

成普通的、基于RAM 的对象。Java 1。1 提供了对Lightweight persistence 的支持。未来的版本甚至可能提 

供更完整的方案。  



2。2。2  特殊情况:主要类型  



有一系列类需特别对待;可将它们想象成“基本”、“主要”或者“主”(Primitive)类型,进行程序设计 

时要频繁用到它们。之所以要特别对待,是由于用 new 创建对象(特别是小的、简单的变量)并不是非常有 

效,因为new 将对象置于“堆”里。对于这些类型,Java 采纳了与 C 和 C++相同的方法。也就是说,
返回目录 上一页 下一页 回到顶部 1 1
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!