本书不同于其他介绍Java的书。其他的书多半介绍Java语言的基础知识,但本书揭示的是如何将Java应用于计算领域中最为有趣和实用(有时还是神秘)的编程任务中。书中充分展示了Java语言的强大性、多样性和优美性,从而展现了Java编程设计的艺术性。
也许有些读者希望某些应用程序与Internet直接相关,例如第4章中介绍的下载管理器、或者第5章中介绍的E-mail客户端。然而,许多章节介绍的代码与Internet并无联系。例如,第3章中的语言解释器、或者第10章的基于AI的搜索方法,它们都是所谓“纯代码”的例子。这些程序都不依赖于Internet,也不使用GUI界面。在过去的C++程序中能够找到这种类型的代码。用Java编写这种代码更为简单,因此也显示了Java语言的多样性和便捷性。
第1章 Java精髓 1
1.1 简单数据类型和对象:完美的平衡 2
1.2 通过垃圾回收实现内存管理 3
1.3 完美的简单多线程模型 3
1.4 完全集成的异常机制 4
1.5 对多态性支持的改进 5
1.6 通过字节码保证可移植性和安全性 5
1.7 丰富的Java API 6
1.8 Applet 7
1.9 继续变革 7
第2章 递归下降的表达式解析器 9
2.1 表达式 10
2.2 解析表达式 11
2.3 表达式的解析 11
2.4 表达式的分解 13
2.5 一个简单的表达式解析器 16
2.6 向解析器中添加变量 24
2.7 递归下降解析器中的语法检查 34
2.8 计算器Applet 34
2.9 一些尝试 37
第3章 使用Java实现语言解释器 38
3.1 解释何种计算机语言 39
3.2 解释器概述 40
3.3 Small BASIC解释器 41
3.4 Small BASIC表达式解析器 61
3.4.1 Small BASIC的表达式 61
3.4.2 Small BASIC的标识符 62
3.5 解释器 66
3.5.1 InterpreterException类 67
3.5.2 SBasic构造函数 67
3.5.3 关键字 68
3.5.4 run()方法 70
3.5.5 sbInterp()方法 71
3.5.6 赋值 72
3.5.7 PRINT语句 73
3.5.8 INPUT语句 75
3.5.9 GOTO语句 76
3.5.10 IF语句 78
3.5.11 FOR循环 79
3.5.12 GOSUB 82
3.5.13 END语句 83
3.6 Small BASIC的使用 83
3.7 对解释器进行增强和扩展 86
3.8 创建自己的计算机语言 86
第4章 使用Java创建下载管理器 88
4.1 深入理解Internet下载流程 89
4.2 下载管理器概述 89
4.3 Download类 90
4.3.1 Download类的变量 94
4.3.2 Download类的构造函数 94
4.3.3 download()方法 95
4.3.4 run()方法 95
4.3.5 stateChanged()方法 99
4.3.6 Action和Accessor方法 99
4.4 ProgressRenderer类 99
4.5 DownloadsTableModel类 100
4.5.1 addDownload()方法 103
4.5.2 clearDownload()方法 103
4.5.3 getColumnClass()方法 103
4.5.4 getValueAt()方法 104
4.5.5 update()方法 104
4.6 DownloadManager类 105
4.6.1 DownloadManager类的变量 111
4.6.2 DownloadManager类的构造函数 111
4.6.3 verifyUrl()方法 111
4.6.4 tableSelectionChanged()方法 112
4.6.5 updateButtons()方法 113
4.6.6 动作事件的处理 114
4.7 编译并运行下载管理器 114
4.8 改进下载管理器 115
第5章 用Java实现E-mail客户端 116
5.1 E-mail内幕 117
5.1.1 POP3 117
5.1.2 IMAP 117
5.1.3 SMTP 118
5.1.4 发送和接收E-mail的一般过程 118
5.2 JavaMail API 118
5.3 一个简单的E-mail客户端 120
5.3.1 ConnectDialog类 121
5.3.2 DownloadingDialog类 126
5.3.3 MessageDialog类 128
5.3.4 MessagesTableModel类 135
5.3.5 EmailClient类 139
5.4 编译并运行E-mail客户端 156
5.5 对基本E-mail客户端的扩展 157
第6章 使用Java搜索Internet 158
6.1 Web搜索程序基础 159
6.2 遵守Robot协议 160
6.3 Search Crawler概述 161
6.4 SearchCrawler类 162
6.4.1 SearchCrawler类的变量 179
6.4.2 SearchCrawler类的构造函数 179
6.4.3 actionSearch()方法 180
6.4.4 search()方法 182
6.4.5 showError()方法 185
6.4.6 updateStats()方法 185
6.4.7 addMatch()方法 186
6.4.8 verifyUrl()方法 187
6.4.9 isRobotAllowed()方法 188
6.4.10 downloadPage()方法 190
6.4.11 removeWwwFromUrl()方法 191
6.4.12 retrieveLinks()方法 192
6.4.13 searchStringMatches()方法 198
6.4.14 crawl()方法 199
6.5 Web搜索程序的编译与运行 202
6.6 对Web搜索程序的思考 203
第7章 使用Java提交HTML 205
7.1 使用JEditorPane提交HTML 206
7.2 处理超链接事件 206
7.3 编写Mini Web浏览器 207
7.3.1 MiniBrowser类 208
7.3.2 MiniBrowser类的变量 213
7.3.3 MiniBrowser类的构造函数 214
7.3.4 actionBack()方法 214
7.3.5 actionForward()方法 215
7.3.6 actionGo()方法 215
7.3.7 showError()方法 216
7.3.8 verifyUrl()方法 216
7.3.9 showPage()方法 217
7.3.10 updateButtons()方法 218
7.3.11 hyperlinkUpdate()方法 219
7.4 Mini Web浏览器的编译与运行 220
7.5 HTML提交程序的应用前景 221
第8章 统计、图表与Java 222
8.1 样本、总体、分布与变量 223
8.2 基本统计值 223
8.2.1 平均数 224
8.2.2 中位数 224
8.2.3 众数 225
8.3 方差和标准差 227
8.4 回归方程式 228
8.5 Stats类的完整代码 232
8.6 绘图数据 235
8.6.1 数据的缩放 236
8.6.2 Graphs类 236
8.6.3 Graphs类的final变量和实例变量 241
8.6.4 Graphs类的构造函数 242
8.6.5 paint()方法 244
8.6.6 bargraph()方法 247
8.6.7 scatter()方法 247
8.6.8 regplot()方法 248
8.7 一个统计表的应用 248
8.7.1 StatsWin类的构造函数 253
8.7.2 itemStateChanged()事件处理器 254
8.7.3 actionPerformed()方法 255
8.7.4 shutdown()方法 255
8.7.5 createMenu()方法 255
8.7.6 DataWin类 255
8.7.7 联合使用 256
8.8 创建一个简单的统计Applet 258
8.9 一点尝试 260
第9章 金融应用中的Applet和Servlet 261
9.1 计算贷款的定期还款额 262
9.1.1 RegPay的成员 266
9.1.2 init()方法 266
9.1.3 actionPerformed()方法 269
9.1.4 paint()方法 269
9.1.5 compute()方法 270
9.2 计算投资的长期收益 270
9.3 计算达到某项长期收益目标所需的投资本金 274
9.4 计算达到某项期望年金所需的初始投资 278
9.5 根据给定投资计算年金的最大值 282
9.6 计算某项贷款的账户余额 286
9.7 创建用于金融类计算的Servlet 290
9.7.1 使用Tomcat 291
9.7.2 测试Servlet 291
9.7.3 把RegPay转换成Servlet 292
9.7.4 RegPayS程序 292
9.8 一些尝试 296
第10章 基于AI的问题求解 297
10.1 表示法和相关术语 298
10.2 组合爆炸问题 299
10.3 搜索技术 300
10.4 问题的描述 301
10.5 FlightInfo类 303
10.6 深度优先搜索 304
10.7 广度优先搜索 313
10.8 添加启发信息 316
10.8.1 爬山搜索 317
10.8.2 爬山搜索的分析 322
10.8.3 最小代价搜索 323
10.8.4 最小代价搜索的分析 324
10.9 查找多个解 324
10.9.1 路径删除 325
10.9.2 节点删除 326
10.10 查找最优解 331
10.11 回到丢失钥匙的例子 336
相信了解Java历史的人或多或少都听说过,Java语言最初是为了嵌入式系统而设计的,它本身是对计算机程序设计精髓部分的发展和提炼。后来由于Internet迅速崛起并在短短几年得到了迅猛发展,Java的诸多特性(例如可移植性、小体积的字节码)适合在网络中应用,因此成了网络上的闪亮巨星。
很多编程人员以为Java仅仅是一种强大的Internet语言,只适合于编写HTML网页中内嵌的Applet和Web服务器上的Servlet,以及衍生的JSP页面。相信持有这种想法的人不在少数,也有相当多的程序员沉迷于那些小玩意儿的奇巧淫技。其实Java无论对于“纯代码”的应用,还是GUI应用,都可以游刃有余。另外,在那些手持终端、机顶盒、智能卡、无线应用等各种领域,Java及其分支具有更为广泛的用武之地和发展空间。应用软件得以超越企业计算,在烤面包机、空调、游戏机、电视、蜂窝电话和其他无数数字设备上运行。
本书的两位作者,都是计算领域的权威人物。Herbert Schildt的编程书籍,在世界范围内的销量已经超过3 000 000册,并被翻译成所有主要的语言。本书分为10章,除了首章概述了Java编程的精髓之外,其余9章分别给出一个实际应用。内容涵盖范围很广,既有纯代码的示例,也有复杂的网络编程以及GUI应用;专业领域跨越幅度很大,从语言、表达式、E-mail到金融、统计、报表,甚至还牵涉到人工智能。所有的示例均可单独运行,也可嵌入到读者自己的应用程序中。书中再三建议:只有亲自动手,才能深刻领会Java的博大精深。
作为一种新的移动服务增值业务,Java无线服务正在走进人们的生活,用户可以通过手机方便地享受移动运营商提供的下载游戏、收发邮件、阅读电子书籍、查询电子地图等各项服务。在社会正走向以信息技术为核心的知识经济时代的今天,企业的核心竞争力取决于是否能够利用现有的资源,运用最佳方式进行科学整合,以及从根本上汇聚信息能量,并使之最大限度地产生效益。而Java正在给我们提供这么一个机会。
本书的翻译工作充分体现了技术和市场的协作,得到了多位计算机和电信专家的鼎立帮助。初稿翻译主要由邓劲生、李宝峰、付伟等博士生完成,江峰、余陈钢、曾生根、邓云佳等也参加了部分工作。翻译和出版过程得到了湖南移动副总经理权明富的指导和大力支持,集团公司数据部叶兵部长欣然为本书审校并题写序。由于本书难度较大,涉及范围很广,在反复推敲之后难免还有很多值得商榷的地方,希望读者能够积极来信向jsdeng@263.net指出,译者将不胜感激。
邓劲生,计算机博士。先后在国防科技大学网络中心、信息工程研究所、并行与分布式处理国家重点实验室进行相关研究和开发工作。主要熟悉领域是面向对象程序设计、软件工程、网络存储等。译著有《程序调试思想与实践》、《编程逻辑基础教程》、《问题求解与编程概念》等。
Herb Schildt,全球顶尖编程图书作者之一。他是C、C++、Java和C#编程语言的权威,也是Windows编程方面的专家。他的编程书籍在世界范围内的销量已经超过3 000 000册,并被翻译成所有主要的语言。
James Holms,系统开发专家,一直为复杂事务环境(比如1996亚特兰大夏季奥运会和IBM)开发服务器端应用程序。由于他在Struts框架和JDeveloper上的出色工作,曾被Oracle杂志授予2002年度Java 开发员称号。
1991年,Sun Microsystems公司的James Gosling、Patrick Naughton、Chris Warth、Ed Frank以及Mike Sheridan一起开始研究一种新的计算机语言,这种语言最后撼动了传统编程的基础。起初,这种语言被命名为Oak,到1995年正式命名为Java。
Java在两个方面改变了编程的过程。第一,Java集成了有利于编制Internet程序的特性。因此,Java是世界上第一个真正为Internet准备的语言。第二,Java发展了计算机语言的精髓。例如,它重新定义了对象、改进了异常处理、完全集成了多线程,并且创造了一种可以运行于多种不同平台之上的可移植对象代码—— 字节码。
因此,Java的重要性体现在两点:对Internet的内嵌支持和对计算机语言发展的推动。这两点中的任何一点都足以使Java成为一种出色的语言;但是只有将这两点成功地结合起来,Java才能成为一种伟大的语言,才能确定它在计算机历史中的地位。
本书揭示了Java之所以成为一种伟大语言的原因。
内容介绍
本书不同于其他介绍Java的书。其他的书多半介绍Java语言的基础知识,但本书揭示的是如何将Java应用于计算领域中最为有趣和实用(有时还是神秘)的编程任务中。书中充分展示了Java语言的强大性、多样性和优美性,从而展现了Java编程设计的艺术性。
也许有些读者希望某些应用程序与Internet直接相关,例如第4章中介绍的下载管理器、或者第5章中介绍的E-mail客户端。然而,许多章节介绍的代码与Internet并无联系。例如,第3章中的语言解释器、或者第10章的基于AI的搜索方法,它们都是所谓“纯代码”的例子。这些程序都不依赖于Internet,也不使用GUI界面。在过去的C++程序中能够找到这种类型的代码。用Java编写这种代码更为简单,因此也显示了Java语言的多样性和便捷性。
各章给出的代码可以直接运行,无需修改。例如,第2章的表达式解析器可以放在许多应用程序中。但是,只有当你把这些程序作为自行开发的起点时,才会真正受益。例如,第7章介绍的Web搜索程序可用于Web站点存档,或者检查站点中的断链。一般而言,可以将这些不同的程序和子系统视为自己的项目的基础。
需要用到的Java知识
本书假定读者已经拥有坚实的Java语言基础。读者应当能够创建、编译和运行Java程序。读者应该能够使用最常用的Java API,能够处理异常,并能够创建多线程程序。因此,本书假定读者应当具有基础的Java技能。
如果希望重温或者增强Java基础知识,笔者在此推荐下面两本书:
● 《Java 2: A Beginner’s Guide》
● 《Java 2: The Complete Reference》
它们都由McGraw-Hill/Osborne出版社出版。
团队合作
笔者已经从事编程方面的写作多年,因此现在极少与人合著。但是,这本书多少是个例外。由于一个非常令人意外、但是却令人高兴的变故,笔者有幸能够与计算领域最优秀的天才之一James Holmes合作写书。James是一位杰出的程序员,他已获得众多重要荣誉,包括成为Oracle的年度Java开发者和成为Jarkarta Struts项目的合作者。由于James在Web编程领域拥有独特的知识和丰富的经验,如果他能为本书编写几章,那将是非常好的一件事—— 幸运的是,笔者最终说服他这样做了。因此,James编写了囊括大多数Internet应用的章节:第4章、第5章、第6章和第7章。他的付出为这本书的成功做出了极大的贡献。现在James正在编写一本深入介绍struts的书,书名叫《Struts: The Complete Reference》,已经于2003年底完成初稿。
提供源代码下载
请记住,www.osborne.com站点免费提供本书中所有例子和项目的源代码。
其他著作
除了本书以外,笔者还编写了3本与Java有关的图书,分别是《Java 2: The Complete Reference》、《Java 2: A Beginner’s Guide》和《Java 2: Programmer’s Reference》,欢迎大家阅读。
Herbert Schildt