本书收集了Java程序员经常遇到的成百个问题的解决方案,涵盖了Java应用的方方面面,堪称讲述Java应用的百科全书。书中的实例从正确设置CLASSPATH和读取环境信息这样的简单任务,到应用XML和添加Email功能的完整程序,几乎无所不包。
无论你是否直接使用书中的实例,作为灵感的源泉,作为学习Java的工具,或者用于其他用途,本书都将成为你图书收藏中的珍品。还没有一本书能够如此全面地讲述Java的诸多功能,并能够如此容易地运用到实践当中去。
前言\r\n\r\n第一章 起步走:编译、运行和调试Java程序\r\n\r\n1.0. 简介\r\n1.1. 编译和运行Java程序:JDK方式\r\n1.2. 采用带彩色突出显示的编辑器编辑和编译程序\r\n1.3. 采用IDE编译、执行和测试程序\r\n1.4. 使用本书的类\r\n1.5. 使用脚本文件jr\r\n1.6. 使用make工具编译和执行Java程序\r\n1.7. 使用Ant工具自动编译和执行Java程序\r\n1.8. Applet\r\n1.9. 处理过期警告\r\n1.10. 没有#ifdef的条件编译\r\n1.11. 调试信息的输出\r\n1.12. 使用调试器\r\n1.13. 单元测试\r\n1.14. 反编译Java类文件\r\n1.15. 防止反编译\r\n1.16. 获取可读的回溯\r\n1.17. 更多的Java源程序\r\n1.18. 例程:Debug\r\n\r\n第二章 Java的运行环境\r\n\r\n2.0. 简介\r\n2.1. 获取环境变量\r\n2.2. 系统属性\r\n2.3. 编写JDK版本相关的代码\r\n2.4. 编写操作系统相关的代码\r\n2.5. 有效使用CLASSPATH\r\n2.6. 使用扩展包或其他API包\r\n2.7. 解析命令行参数\r\n\r\n第三章 字符串\r\n\r\n3.0. 简介\r\n3.1. 利用substring()分解字符串\r\n3.2. 利用StringTokenizer分解字符串\r\n3.3. 连接字符串\r\n3.4. 处理单个字符\r\n3.5. 字符串的对齐\r\n3.6. Unicode字符与String的转换\r\n3.7. 颠倒字符串\r\n3.8. 扩展和压缩TAB符\r\n3.9. 控制字母大小写\r\n3.10. 缩排文档\r\n3.11. 输入非打印字符\r\n3.12. 删除字符串尾部的空格\r\n3.13. 解析逗号分隔的数据\r\n3.14. 例程:一个简单的文本格式化工具\r\n3.15. 例程:Soundex算法\r\n\r\n第四章 正则表达式的模式匹配\r\n\r\n4.0. 简介\r\n4.1. 正则表达式的语法\r\n4.2. 正则表达式的工作原理\r\n4.3. 在Java中使用正则表达式\r\n4.4. 测试正则表达式\r\n4.5. 查找匹配的文本\r\n4.6. 替换匹配的文本\r\n4.7. 打印匹配的所有字符串\r\n4.8. 打印含有模式的行\r\n4.9. 在match()和subst()方法中控制大小写\r\n4.10. 预编译正则表达式\r\n4.11. 匹配时的换行间题\r\n4.12. 例程:数据挖掘\r\n4.13. 例程:完整的Grep\r\n\r\n第五章 数字\r\n\r\n5.0. 简介\r\n5.1. 检查字符串是否包含有效数字\r\n5.2. 数据类型的由大变小\r\n5.3. 使用分数\r\n5.4. 确保浮点数的准确性\r\n5.5. 浮点数的比较\r\n5.6. 浮点数的舍入\r\n5.7. 数字的格式化\r\n5.8. 二进制、八进制、十进制以及十六进制之间的转换\r\n5.9. 整数序列\r\n5.10. 罗马数字\r\n5.11. 名词的复数形式\r\n5.12. 产生随机数\r\n5.13. 产生更好的随机数\r\n5.14. 三角函数的计算\r\n5.15. 取对数\r\n5.16. 矩阵乘法\r\n5.17. 复数\r\n5.18. 处理特大的数字\r\n5.19. 例程:TempConverter\r\n5.20. 例程:数字回文(Numbe Palindrome)\r\n\r\n第六章 日期和时间\r\n\r\n6.0. 简介\r\n6.1. 查看当前日期\r\n6.2. 按照指定格式打印日期/时间\r\n6.3. 用其他历法表示日期\r\n6.4. 将YMDHMS转换为Calendar对象\r\n6.5. 将字符串转换为日期\r\n6.6. 将秒数转换为DMYHMS格式\r\n6.7. 日期的加减运算\r\n6.8. 计算日期之间的间隔\r\n6.9. 比较日期\r\n6.10. 第几日\r\n6.11. 日历页\r\n6.12. 定时器\r\n6.13. 休眠\r\n6.14. 例程:提醒服务\r\n\r\n第七章 结构化数据\r\n\r\n7.0. 简介\r\n7.1. 数组\r\n7.2. 调整数组的长度\r\n7.3. Vector类和ArrayList类\r\n7.4. Iterator(迭代器)\r\n7.5. 链表\r\n7.6. 使用Hashtable和HashMap进行映射\r\n7.7. Properties类和Preferences类\r\n7.8. 排序\r\n7.9. Javal.1的排序\r\n7.10. 避免频繁地排序\r\n7.11. Set\r\n7.12. 搜索对象\r\n7.13. 将集合转换为数组\r\n7.14. 自定义Iterator\r\n7.15. 堆栈\r\n7.16. 多维结构\r\n7.17. 集合小结\r\n7.18. 例程:运行效率\r\n\r\n第八章 面向对象技术\r\n\r\n8.0. 简介\r\n8.1. 打印对象:用toString()方法格式化\r\n8.2. 覆盖equals方法\r\n8.3. 覆盖hashcode方法\r\n8.4. Clone方法\r\n8.5. finalize方法\r\n8.6. 使用内部类\r\n8.7. 通过接口进行回调\r\n8.8. 多态/抽象方法\r\n8.9. 传值\r\n8.10. 自定义异常\r\n8.11. 例程:P1otter\r\n\r\n第九章 输入和输出\r\n\r\n9.0. 介绍\r\n9.1. 从标准输入设备读取数据\r\n9.2. 向标准输出设备写数据\r\n9.3. 按文件名打开文件\r\n9.4. 复制文件\r\n9.5. 把文件读入字符串\r\n9.6. 重定向标准流\r\n9.7. 复制流\r\n9.8. 读/写不同字符集的文本\r\n9.9. 行结束符\r\n9.10. 平台相关的文件编码\r\n9.11. 断行再续\r\n9.12. 扫描文件\r\n9.13. 读写二进制数据\r\n9.14. 定位(Seeking)\r\n9.15. 处理C程序写的数据流\r\n9.16. 存储和还原串行化对象\r\n9.17. 防止ClassCastExceptions异常\r\n9.18. 读写JAR或Zip文档\r\n9.19. 读写压缩文件\r\n9.20. 例程:将文本输出为PostScript格式\r\n9.21. 例程:TarList\r\n\r\n第十章 目录和文件操作\r\n\r\n10.0. 简介\r\n10.1. 获取文件信息\r\n10.2. 创建文件\r\n10.3. 修改文件名\r\n10.4. 删除文件\r\n10.5. 创建临时文件\r\n10.6. 更改文件属性\r\n10.7. 列出目录内容\r\n10.8. 获取根目录\r\n10.9. 创建新目录\r\n10.10. 例程:Find\r\n\r\n第十一章 串行和并行接口编程\r\n\r\n11.0. 简介\r\n11.1. 选择一个端口\r\n11.2. 打开串行端口\r\n11.3. 打开并行端口\r\n11.4. 解决端口冲突\r\n11.5. 基于端口的读写数据:密步\r\n11.6. 基于端口的读写数据:事件驱动\r\n11.7. 基于端口的读写数据:线程\r\n11.8. 例程:Penman绘图仪\r\n\r\n第十二章 图形与声音\r\n\r\n12.0. 简介\r\n12.1. 绘制图形\r\n12.2. 测试图形组件\r\n12.3. 输出文本\r\n12.4. 使组件上的文本居中\r\n12.5. 阴影效果\r\n12.6. 图像\r\n12.7. 播放声音文件\r\n12.8. 播放视频文件\r\n12.9. 绘制二维艺术字\r\n12.10. JDKl.1的打印\r\n12.11. Java 2的打印\r\n12.12. 例程:PlotterAWT\r\n12.13. 例程:Grapher\r\n\r\n第十三章 图形用户界面(GUI)\r\n\r\n13.0. 简介\r\n13.1. GUI组件\r\n13.2. 窗体布局\r\n13.3. 带选项卡的布局\r\n13.4. 事件处理:让按钮工作起来\r\n13.5. 使用匿名的内部类进行事件处理\r\n13.6. 通过“关闭窗体”结束程序\r\n13.7. 对话框\r\n13.8. 在窗体上打印数据\r\n13.9. 使用JFileChooser选择文件\r\n13.10. 选择颜色\r\n13.11. 将主窗体居中\r\n13.12. 修改Swing程序的界面外观\r\nl3.13. 例程:定制字体\r\n13.14. 例程:定制布局管理器\r\n\r\n第十四章 国际化与本地化\r\n\r\n14.0. 简介\r\n14.1. 用I18N资源创建按钮\r\n14.2. 列出有效区域\r\n14.3. 使用118N资源创建菜单\r\n14.4. 编写国际化的实用于程序\r\n14.5. 使用118N资源包创建对话框\r\n14.6. 创建资源包\r\n14.7. 代码的JILT处理\r\n14.8. 使用指定的区域\r\n14.9. 设置默认的区域\r\n14.10. 格式化消息\r\n14.11. 例程:MenuIntl\r\n14.12. 例程:Bu sCard\r\n\r\n第十五章 网络客户端\r\n\r\n15.0. 简介\r\n15.1. 访问服务器\r\n15.2. 查找并报告网络地址\r\n15.3. 处理网络错误\r\n15.4. 读写文本数据\r\n15.5. 读写二进制数据\r\n15.6. 读写串行化数据\r\n15.7. UDP数据报\r\n15.8. 例程:TFTP的UDP客户端\r\n15.9. 例程:Telnet客户端\r\n15.10. 例程:聊天室的客户端\r\n\r\n第十六章 Java服务器端:Socket\r\n\r\n16.0. 简介\r\n16.1. 创建ServerSocket\r\n16.2. 返回响应(字符串或二进制)\r\n16.3. 返回对象信息\r\n16.4. 处理多客户端\r\n16.5. 网络日志\r\n16.6. 例程:一个Java聊天室服务器\r\n\r\n第十七章 网络客户端(II):Applet和Web客户端\r\n\r\n17.0. 简介\r\n17.1. 在网页中嵌入Applet\r\n17.2. 编写App1et\r\n17.3. 连接Applet主机的服务器\r\n17.4. 通过Applet显示文档\r\n17.5. 通过Applet运行CGI脚本\r\n17.6. 读取URL上的内容\r\n17.7. 从URL中解析HTML文本\r\n17.8. 从文件中解析URL名字\r\n17.9. 将文件名转换为URL名字\r\n17.10. 例程:MkIndex\r\n17.11. 例程:LinkChecker\r\n\r\n第十八章 Web服务器中的Java:Servlet与JSP\r\n\r\n18.0. 简介\r\n18.1. 第一个Servlet:生成HTML页面\r\n18.2. Servlet:处理表单参数\r\n18.3. Cookie\r\n18.4. 会话跟踪\r\n18.5. 从Servlet中生成PDF\r\n18.6. 当HTML遇上Java:JSP\r\n18.7. JSP的嵌入和控制转移\r\n18.8. 使用Servlet的JSP\r\n18.9. 用JavaBean组件减少JSP中的Java代码量\r\n18.10. JSP语法总结\r\n18.11. 程序:Cookiecutter\r\n18.12. 程序:JabaDot Web新闻门户\r\n\r\n第十九章 Java与Email\r\n\r\n19.0. 简介\r\n19.1. 发送Email:浏览器版\r\n19.2. 发送Email:真正的客户程序\r\n19.3. Mail-Enabling a Server Program\r\n19.4. 发送MIME邮件\r\n19.5. 提供邮件设置\r\n19.6. 不使用JavaMail发送邮件\r\n19.7. 读邮件\r\n19.8. 程序:MailReaderBean\r\n19.9. 程序:MailClient\r\n\r\n第二十章 数据库访问\r\n\r\n20.0. 简介\r\n20.1. 文本文件数据库\r\n20.2. DBM数据库\r\n20.3. JDBC的安装和连接\r\n20.4. 与JDBC数据库连接\r\n20.5. 发送一个JDBC查询并获得结果\r\n20.6. 没有JDBC参数化语句\r\n20.7. 在JDBC中使用存储过程\r\n20.8. 用ResultSet改变数据\r\n20.9. 用SQL改变数据\r\n20.10. 寻找JDBC元数据\r\n20.11. 程序:JDAdmin\r\n\r\n第二十一章 XML\r\n\r\n21.0. 简介\r\n21.1. 用XSLT转换XML\r\n21.2. 用SAX解析XML\r\n21.3. 用DOM解析XML\r\n21.4. 用DTD验证结构\r\n21.5. 用DOM生成我们自己的xML\r\n21.6. 程序:xml2mif\r\n\r\n第二十二章 分布式Java:RMI\r\n\r\n22.0. 简介\r\n22.1. 定义RMI合同\r\n22.2. RMI客户\r\n22.3. RMI服务器\r\n22.4. 跨网络部署RMl\r\n22.5. 程序:RMI回调\r\n22.6. 程序:RMIWatch\r\n\r\n第二十三章 包与包装机制\r\n\r\n23.0. 简介\r\n23.1. 创建包\r\n23.2. 用Javadoc为类写文档\r\n23.3. 用jar存档\r\n23.4. 从JAR运行Applet\r\n23.5. 用JDK运行Applet\r\n23.6. 从JAR运行程序\r\n23.7. 将类作为JavaBean\r\n23.8. 将JavaBean放入JAR中\r\n23.9. 将Servlet压缩为一个WAR文件\r\n23.10. “编写一次,随处安装”\r\n23.11. JWS\r\n23.12. 签署JAR文件\r\n\r\n第二十四章 Java线程\r\n\r\n24.0. 简介\r\n24.1. 在另一线程中运行代码\r\n24.2. 显示一个带动画的图像\r\n24.3. 停止线程\r\n24.4. 超时\r\n24.5. 线程通信:同步化代码\r\n24.6. 线程的通信:wait()和notifyAll()\r\n24.7. 在编辑器中后台保存\r\n24.8. 多线程的网络服务器\r\n\r\n第二十五章 内省或“命名类的类”\r\n\r\n25.0. 简介\r\n25.1. 获得类描述符\r\n25.2. 寻找和使用方法和字段\r\n25.3. 动态地装载和实例化一个类\r\n25.4. 从头开始构造一个类\r\n25.5. 性能计时\r\n25.6. 输出类信息\r\n25.7. 例程:CrossRef\r\n25.8. 程序:AppletViewer\r\n\r\n第二十六章 Java与其他语言的结合\r\n\r\n26.0. 简介\r\n26.1. 运行一个程序\r\n26.2. 运行程序并获取它的结果\r\n26.3. 用BSF混合使用Java和脚本语言\r\n26.4. 与本机代码(C/C++)混合\r\n26.5. 从本机代码调用Java\r\n26.6. 程序:DBM\r\n\r\n后记
如果已经具备了一些Java知识, 还想进一步深入学习, 那么本书正是你理想的良师益友.
我从1980年在多伦多大学(University of Toronto)开始使用C语言进行编程, 一直到1990年. 1995年, 当一种名为Oak的新编程语言改名为Java时, 我很幸运地得到了我的同事J. Greg Davidson有关这种语言的指导. 我按Greg提供的Email地址发了一个邮件, 得到的回复如下:
From scndprsn. Eng. Sun. COM!jag wed Mar 29 19:43:54 1995
Date: Wed, 29 Mar 1995 l6:47:51 +0800
From: jag@scndprsn. Eng. Sun.com (James Gosling)
To: ian@scooter. Canada. Sun. COM, ian@darwinsys. com
Subiect:Re:webRunner
Cc:goltz@sunne.East.Sun.COM
Content-Lengthhttp://www.liaohe.net.cn/: 36l
Status:RO
X—Lines:9
> Hi. A friend told me about NebRunner(?), your extensible network
> brower. It and Oak(?) its extention 1anguage, sounded neat. Can
> you please tell me if it's available for play yet, and/or if any
> papers on it are available for FTP?
Check out http://java. sun. com
(Oak got renalned ot java and webrunner got renamed to
hotjava to keep the lawyers happy)(译注1)
我下载了HotJava, 并尝试使用它. 开始我不太相信这个新奇的语言, 它有些像不伦不类的C/C++. 我编写了测试程序, 为防止与我的C程序目录冲突, 我把它们存到名为javasrc目录下. 随着深入地学习, 我发现Java的一些优点:如内存自动回收机制. 取消指针的计算等等. Javasrc目录下的文件开始增多了. 我写了一个完全的Java学习教程, 同时javasrc目录下的Java源程序也相应地多了起来. 为此, 我不得不创建子目录, 尽管这样, 查找东西还是越来越困难. 显然, 我们需要某种筛选后的学习资料. 在某种意义上, 这本书源自我的javasrc目录的不断膨胀与为新编程语言而建的文档架构之间产生的矛盾. 在O'Reilly出版的《Perl Cookbook》中, Tom Christiansen与Nathan Torkington通过他们出色的设计, 将材料分解为一个个精小的文章——“实例”. 这样的创意来自人们熟识的菜谱. 对计算机相关行业来说, 已经有相当长的时间采用“菜谱”来特指那些教人“如何做”的技术文集了. 在软件方面, Donald Knuth采用“菜谱”比喻他著名的《The Art of Computer Programming》(1968年初版), 硬件方面, Don Lancaster写下了《TTL Cookbook》. Tom与Nathan这方面做得很成功, 这里, 我向所有想深入学习Perl的人推荐他们的《Perl Cookbook》. 事实上, 本书正是为那些想深入学习Java的人量身定做的. 每个“实例”的代码均是独立的, 你可以根据需要选取其中的一部分加到你的软件中.
本书适合的读者
我假定你有一定的Java基础. 但我不会告诉你如何打印一个字符串, 或者如何编写一个扩展Applet并且打印出你姓名的类. 我假设你已经参加过Java课程的学习或者阅读了某种入门级的书, 如O'Reilly出版《Learning Java》或《Java in a Nutshell》(译注2). 然而, 第一章会述及一些你可能还不太清楚的技术, 这是阅读本书其他部分所必需的. 为自由邀游准备好了吗?本书索引丰富, 方便查询.
本书适合的读者
我假定你有一定的Java基础. 但我不会告诉你如何打印一个字符串, 或者如何编写一个扩展Applet并且打印出你姓名的类. 我假设你已经参加过Java课程的学习或者阅读了某种入门级的书, 如O'Reilly出版《Learning Java》或《Java in a Nutshell》(译注2). 然而, 第一章会述及一些你可能还不太清楚的技术, 这是阅读本书其他部分所必需的. 为自由邀游准备好了吗?本书索引丰富, 方便查询.
本书的内容
与我的Perl同事--Tom与Nathan不同, 我不会花太多时间去讨论语言的细节.
这主要是Java语言没有什么生癖之处, 比较简洁明了. 但这并不意味着Java就没什么可学的. 如果那样也没有必要写这本书了. 我的主要思路是集中在Java的API上:我会通过实例来告诉你这些API的定义与用法.
像Perl一样, Java正在同我们一起与时俱进. 而且我承认, 现在我更多地在使用Java. 除了设备驱动程序, 我正用Java来代替C以前所做的工作. 但Java应用的范围不同于Perl. Perl(与其他脚本语言如awk和Python一样)适合于"one-1iner(一行式)"的应用任务. 正如Tom与Nathan所演示的, Perl能从一个文件中很好地打印出第42行来. 由于Java是可编译的. 面向对象的语言, 主要开发大型的. 企业级的应用程序. 事实上, Java 2中为此增加了许多API. 然而, 为了阐明诸多技术, 我运用了一些短小精干的实例, 甚至是程序片段. 我会确保你所看到的代码都能编译和运行.
本书许多比较大的例子是我最初用来将日常工作自动化的工具. 例如, NkIndex(第十七章的例子)就是从我存放Java源程序的目录中读取信息, 从而创建基于浏览器的索引文件(. html文件). 另外一个例子, 就是本书的结构本身可以用XML来标记. XML是最近刚出来的标记语言, 是由SGML简化而来的(HTML也是由SGML导出的标记语言). 至于XML是要用于数据的表示格式, 还是致力于其操作格式, 或者两者兼而有之, 这些还不是很清楚. 然而, 我使用XML来标记本书某些章节的文本. 文本经XmlForm程序转化, 输出至FrameHaker程序. XmlForm将在第二十一章讨论.
让我们回顾一下本书的组织. 第一章"起步走"主要介绍如何在不同平台上编译和调试Java程序, 如何在不同运行环境下(浏览器. 命令行. 窗口界面)执行. 第二章讨论交互环境, 以及怎样适应在不同环境下编译和运行程序.
下面几章会讲述基本的API.
第三章"字符串", 主要阐述这种Java中基本但十分有效的数据类型, 以及如何合并. 分解. 比较与重新排列文本.
第四章讨论用正则表达式实现模式匹配的问题, 即如何使用Unix的正则表达式来进行字符串匹配和模式匹配. 这也第一次出现非标准API. 由于标准Java还没有正则表达式的API, 所以这里我介绍了一些正则表达式的包.
第五章"数字", 讲Java内置的类型(如整型. 双精度浮点型等)及其类型转换. 除此之外, 还要讨论大数据类型. 由于Java程序员经常需要处理不同地区的日期与时间, 所以第六章讲述日期与时间. 接下来的两章是数据处理. 第七章讲的是数组. 数组是许多编程语言共有的, 在Java中它是线性的对象. Java中结构化的数据是第八章要讨论的, 这里讲述了一些面向对象的技术.
下面几章处理传统的输入/输出问题. 第九章讲输入/输出, 也就是怎样读写文件. (如果你觉得文件操作比较模糊, 请不要跳过这一章. 因为这是下面两章的基础:即第十一章中串行/并行口的访问. 第十五章中网络中基于套接字的连接). 第十章是关于目录与文件系统的操作. 该章是要告诉你:如何得到文件的大小. 最后修改时间, 如何访问与修改目录, 创建临时文件, 在磁盘上修改文件, 等等. 第十一章, 串行/并行接口的编程. 该章将向你揭示如何采用javax. conm包中的API来完成访问串行/并行接口等用C所做的工作.
第十二章"图像与声音"将把我们带进GUI的开发中:如何画图像, 设置字型与颜色, 如何控制视频与音频信号的演播. 然后, 第十三章"图形用户界面(GUI)", 是前一章的延伸, 将讨论高级一些的话题:按钮. 标签. 菜单等部件的使用. 当你设计了一个GUI的程序之后. 你将会考虑第十四章的问题:国际化与本地化, 从而实现应用程序在阿富汗. 阿尔及尔. 阿姆斯特丹等不同国家与地区均能正常运行. Java一开始就被标榜为"Internet上的编程语言", 所以我们需要阐述一下其中缘由, 就在于Java的网络功能. 第十五章主要讨论网络客户端, 着眼于套接字(socket).
第十六章则是网络服务器端. 第十七章进一步阐述网络客户端:Applet与Web客户. 一些Web服务器的技术会在第十八章讨论, 主要是Servlet和JSP的内容. 最后, 怎样生成电子邮件会在第十九章给大家介绍.
第二十章是关于数据访问的. 主要讨论如何通过JDBC来访问远程数据库. 另外讲述数据存储与交换的内容是在第二十一章. 这章主要讨论XML的格式以及通过SAX与DOM等两个标准Java API来对其进行操作.
第二十二章则是如何实现分布式Java, 即通过远程方法调用机制(RMI), 创建客户端. 服务器端以及"回调(callback)"的细节.
第二十三章是讨论包的:如何为类创建包, 以及怎样部署应用程序.
第二十四章是有关线程的, 旨在说明如何创建能生成多线程的类, 从而充分利用多处理器, 提高性能.
第二十五章"内省或'命名类的类一, 向你揭示如何编写API的交叉参考文档, 以及Web浏览器如何装载老的Applet.
有时候我们需要将别的编程语言写的程序作为我们Java应用程序的一部分, 或者将Java写的程序作为其他应用程序的一部分. 第二十六章就是讨论如何在Java程序中运行外部程序(编译的或脚本), 以及直接调用C/C十十编写的 "本机代码(nativecode)".
我不可能在这800页的书中把Java所有的知识都告诉你. 后记中是一些结束语, 法和我关于Java API总结的超链接, 这也是Java开发人员所需要的. 关于讲述Java各个主题的顺序, 没有两个程序员或作者会达成一致. 为帮助你更好地学习, 书中提供有许多带"实例"号的交叉参照.