友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第125章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



getChars() 复制的起点和终点,要在其中复制的数组以及目标数组的一个索引 将 char 复制到一个外部数 

组。和 String 不同,这里没有getBytes()可供使用  

append() 已覆盖:Object,String,char'',特定偏移和长度的char'',boolean,char,int,long, 

float,double 将自变量转换成一个字串,并将其追加到当前缓冲区的末尾。若有必要,同时增大缓冲区的 

长度  

insert() 已覆盖,第一个自变量代表开始插入的位置:Object,String,char'',boolean,char,int, 

long,float,double 第二个自变量转换成一个字串,并插入当前缓冲区。插入位置在偏移区域的起点处。 

若有必要,同时会增大缓冲区的长度  

reverse() 无 反转缓冲内的字符顺序  



                                                                        375 


…………………………………………………………Page 377……………………………………………………………

  

最常用的一个方法是append() 。在计算包含了+和+=运算符的 String 表达式时,编译器便会用到这个方法。 

insert()方法采用类似的形式。这两个方法都能对缓冲区进行重要的操作,不需要另建新对象。  



12。4。5 字串的特殊性  



现在,大家已知道 String 类并非仅仅是Java 提供的另一个类。String 里含有大量特殊的类。通过编译器和 

特殊的覆盖或过载运算符+和+=,可将引号字符串转换成一个 String。在本章中,大家已见识了剩下的一种 

特殊情况:用同志 StringBuffer 精心构造的“不可变”能力,以及编译器中出现的一些有趣现象。  



12。5 总结  



由于Java 中的所有东西都是句柄,而且由于每个对象都是在内存堆中创建的——只有不再需要的时候,才会 

当作垃圾收集掉,所以对象的操作方式发生了变化,特别是在传递和返回对象的时候。举个例子来说,在C 

和C++中,如果想在一个方法里初始化一些存储空间,可能需要请求用户将那片存储区域的地址传递进入方 

法。否则就必须考虑由谁负责清除那片区域。因此,这些方法的接口和对它们的理解就显得要复杂一些。但 

在Java 中,根本不必关心由谁负责清除,也不必关心在需要一个对象的时候它是否仍然存在。因为系统会为 

我们照料一切。我们的程序可在需要的时候创建一个对象。而且更进一步地,根本不必担心那个对象的传输 

机制的细节:只需简单地传递句柄即可。有些时候,这种简化非常有价值,但另一些时候却显得有些多余。  

可从两个方面认识这一机制的缺点:  

(1) 肯定要为额外的内存管理付出效率上的损失(尽管损失不大),而且对于运行所需的时间,总是存在一 

丝不确定的因素(因为在内存不够时,垃圾收集器可能会被强制采取行动)。对大多数应用来说,优点显得 

比缺点重要,而且部分对时间要求非常苛刻的段落可以用native 方法写成(参见附录A )。  

(2) 别名处理:有时会不慎获得指向同一个对象的两个句柄。只有在这两个句柄都假定指向一个“明确”的 

对象时,才有可能产生问题。对这个问题,必须加以足够的重视。而且应该尽可能地“克隆”一个对象,以 

防止另一个句柄被不希望的改动影响。除此以外,可考虑创建“不可变”对象,使它的操作能返回同种类型 

或不同种类型的一个新对象,从而提高程序的执行效率。但千万不要改变原始对象,使对那个对象别名的其 

他任何方面都感觉不出变化。  

  

有些人认为 Java 的克隆是一个笨拙的家伙,所以他们实现了自己的克隆方案(注释⑤),永远杜绝调用 

Object。clone()方法,从而消除了实现 Cloneable 和捕获 CloneNotSupportException 违例的需要。这一做法 

是合理的,而且由于clone()在 Java 标准库中很少得以支持,所以这显然也是一种“安全”的方法。只要不 

调用Object。clone(),就不必实现Cloneable 或者捕获违例,所以那看起来也是能够接受的。  

  

⑤:Doug Lea 特别重视这个问题,并把这个方法推荐给了我,他说只需为每个类都创建一个名为duplicate() 

的函数即可。  

  

Java 中一个有趣的关键字是byvalue (按值),它属于那些“保留但未实现”的关键字之一。在理解了别名 

和克隆问题以后,大家可以想象byvalue 最终有一天会在Java 中用于实现一种自动化的本地副本。这样做可 

以解决更多复杂的克隆问题,并使这种情况下的编写的代码变得更加简单和健壮。  



12。6 练习  



(1) 创建一个myString 类,在其中包含了一个 String 对象,以便用在构建器中用构建器的自变量对其进行 

初始化。添加一个 toString()方法以及一个 concatenate()方法,令其将一个 String 对象追加到我们的内部 

字串。在myString 中实现 clone()。创建两个 static 方法,每个都取得一个 myString x 句柄作为自己的自 

变量,并调用x。concatenate(〃test〃)。但在第二个方法中,请首先调用clone()。测试这两个方法,观察它 

们不同的结果。  

(2) 创建一个名为Battery (电池)的类,在其中包含一个int,用它表示电池的编号(采用独一无二的标识 

符的形式)。接下来,创建一个名为Toy 的类,其中包含了一个Battery 数组以及一个toString,用于打印 

出所有电池。为Toy 写一个 clone()方法,令其自动关闭所有 Battery 对象。克隆 Toy 并打印出结果,完成 

对它的测试。  

(3) 修改CheckCloneable。java,使所有clone()方法都能捕获CloneNotSupportException 违例,而不是把 

它直接传递给调用者。  



                                                                   376 


…………………………………………………………Page 378……………………………………………………………

(4) 修改pete。java,为Thing2 和 Thing4 类添加更多的成员对象,看看自己是否能判断计时随复杂性变 

化的规律——是一种简单的线性关系,还是看起来更加复杂。  

(5) 从Snake。java 开始,创建 Snake 的一个深层复制版本。  



                                                                              377 


…………………………………………………………Page 379……………………………………………………………

                    第十三章  创建窗口和程序片  



  

在Java 1。0 中,图形用户接口(GUI)库最初的设计目标是让程序员构建一个通用的GUI,使其在所有平台 

上都能正常显示。  

但遗憾的是,这个目标并未达到。事实上,Java 1。0 版的“抽象 Windows 工具包”(AWT )产生的是在各系 

统看来都同样欠佳的图形用户接口。除此之外,它还限制我们只能使用四种字体,并且不能访问操作系统中 

现有的高级 GUI 元素。同时,Jave1。0 版的AWT 编程模型也不是面向对象的,极不成熟。这类情况在 Java1。1 

版的AWT 事件模型中得到了很好的改进,例如:更加清晰、面向对象的编程、遵循 Java Beans 的范例,以及 

一个可轻松创建可视编程环境的编程组件模型。Java1。2 为老的Java 1。0 AWT 添加了 Java 基础类(AWT), 

这是一个被称为“Swing”的GUI 的一部分。丰富的、易于使用和理解的Java Beans 能经过拖放操作(像手 

工编程一样的好),创建出能使程序员满意的 GUI。软件业的“3 次修订版”规则看来对于程序设计语言也是 

成立的(一个产品除非经过第 3 次修订,否则不会尽如人意)。  

Java 的主要设计目的之一是建立程序片,也就是建立运行在WEB 浏览器上的小应用程序。由于它们必须是安 

全的,所以程序片在运行时必须加以限制。无论怎样,它们都是支持客户端编程的强有力的工具,一个重要 

的应用便是在Web 上。  

在一个程序片中编程会受到很多的限制,我们一般说它“在沙箱内”,这是由于 Java 运行时一直会有某个东 

西——即Java 运行期安全系统——在监视着我们。Jave 1。1 为程序片提供了数字签名,所以可选出能信赖 

的程序片去访问主机。不过,我们也能跳出沙箱的限制写出可靠的程序。在这种情况下,我们可访问操作系 

统中的其他功能。在这本书中我们自始至终编写的都是可靠的程序,但它们成为了没有图形组件的控制台程 

序。AWT 也能用来为可靠的程序建立GUI 接口。  

在这一章中我们将先学习使用老的 AWT 工具,我们会与许多支持和使用AWT 的代码程序样本相遇。尽管这有 

一些困难,但却是必须的,因为我们必须用老的AWT 来维护和阅读传统的 Java 代码。有时甚至需要我们编写 

AWT 代码去支持不能从Java1。0 升级的环境。在本章第二部分,我们将学习Java 1。1 版中新的 AWT 结构并会 

看到它的事件模型是如此的优秀(如果能掌握的话,那么在编制新的程序时就可使用这最新的工具。最后, 

我们将学习新的能像类库一样加入到Java 1。1 版中的 JFC/Swing 组件,这意味着不需要升级到 Java 1。2 便 

能使用这一类库。  

大多数的例程都将展示程序片的建立,这并不仅仅是因为这非常的容易,更因为这是 AWT 的主要作用。另 

外,当用AWT 创建一个可靠的程序时,我们将看到处理程序的不同之处,以及怎样创建能在命令行和浏览器 

中运行的程序。  

请注意的是这不是为了描述类的所有程序的综合解释。这一章将带领我们从摘要开始。当我们查找更复杂的 

内容时,请确定我们的信息浏览器通过查找类和方法来解决编程中的问题(如果我们正在使用一个开发环 

境,信息浏览器也许是内建的;如果我们使用的是 SUN 公司的 JDK 则这时我们要使用 WEB 浏览器并在 Java 根 

目录下面开始)。附录F 列出了用于深入学习库知识的其他一些参考资料。  



13。1  为何要用 AW T ?  



对于本章要学习的“老式”AWT,它最严重的缺点就是它无论在面向对象设计方面,还是在GUI 开发包设计方 

面,都有不尽如人意的表现。它使我们回到了程序设计的黑暗年代(换成其他话就是“拙劣的”、“可怕 

的”、“恶劣的”等等)。必须为执行每一个事件编写代码,包括在其他环境中利用“资源”即可轻松完成 

的一些任务。  

许多象这样的问题在Java 1。1 里都得到了缓解或排除,因为:  

(1)Java 1。1的新型AWT 是一个更好的编程模型,并向更好的库设计迈出了可喜的一步。而Java Beans 则是 

那个库的框架。  

(2) “GUI 构建器”(可视编程环境)将适用于所有开发系统。在我们用图形化
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!