
本书侧重于面向对象设计,通过浅显易懂的语言和代码,很好地平衡了完整实例和解释性讨论,并围绕着Java 语言的特性全面透彻地介绍诸多编程技术。书中全面介绍了Java 语言已经实现的封装、继承和多态性技术,并在介绍Swing GUI 的时候提及了事件驱动的编程,在介绍UML 和模式的同时进一步介绍了OOP。本书每节后都设计了相应的练习题,每章后都有针对本章内容的编程项目。本书不仅适合初学者使用,还可以作为使用Java 的后续计算机科学课程的参考书。
译者序 20 世纪90 年代,硬件领域出现了单片式计算机系统,这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意,因为使用它可以大幅度提升消费类电子产品(如电视机顶盒、面包烤箱、移动电话等)的智能化程度。Sun 公司为了抢占市场先机,在1991 年成立了一个被称为Green 的项目小组,由James Gosling 等工程师开发出Java语言的雏形,其最初被命名为Oak,于1995 年5 月以Java 这个名称正式发布。 作为一种计算机编程语言,Java 拥有跨平台、面向对象、泛型编程的特性,其广泛应用于企业级Web 应用开发和移动应用开发中。伴随着互联网的迅猛发展,Java 逐渐成为重要的网络编程语言。 本书作者通过浅显易懂的语言和大量的示例代码,力求让读者理解Java 语言。本书的每一章都有作者特意编写的“自测题”,让读者可以自己检验是否真的理解了这些内容。并且在每一章的最后都提供了本章小结、自测题答案和编程项目练习,供读者巩固本章所学的相关内容。 本书共分为20 章,作者在前3 章介绍了Java 语言的基本语法;并从第4 章开始进入“面向对象编程”部分。作者在第4 章和第5 章介绍了类的相关知识;在第7 章和第8 章介绍了Java 面向对象的三大特征,即继承、封装和多态;在第13 章概述了接口和内部类的相关内容。此外,作者还在书中介绍了数组、链表等数据结构和递归算法,分别位于第6 章、第11 章、第14 章、第15 章和第16 章;然后,作者在第17 章和第18 章介绍了如何使用JavaFX 创建GUI。而且,作者还在本书中介绍了I/O、异常处理的相关内容,分别位于第9 章和第10 章。作者还在第12 章介绍了UML 和模式的相关内容。最后,为了适应互联网的迅猛发展和多核化的趋势,作者在第19 章和第20 章概述了相关内容。 虽然我已经尽了最大努力,但翻译过程中难免有些未准确理解的句子,希望广大读者批评指正。 除师蓉外,李青翠、樊永刚、樊旺斌、王桂英、樊瑞春、武昭江、李静、翟晓锦、师超、成金娥、师守伟、石璐璐、赵鹏飞、武建萍、武育芝、郝俊丽、张烈香、韩丽飞、樊卫斌、武继萍、周俊燕、沈元婷、王莹莹、韩师乾也共同参与了本书的翻译工作,感谢他们对本书做出的贡献。 最后,感谢电子工业出版社对我的信任和帮助,感谢家人对我的支持。 师蓉 2017 年11 月 前言 本书旨在成为Java 编程方面的一本教科书和参考书。尽管本书包含了很多编程技术,但它是围绕着Java 语言的特征而非围绕着某门特定的编程技术课程来组织内容的。我在编写本书时,脑海中考虑的主要读者对象是没有太多Java 编程经验的本科生。因此,本书可以作为你学习第一门编程课程或者使用Java 后续计算机科学课程时的Java 教材或参考书。本书的目标是适用于大多数用户。前几章适合初学者,同时这些章节方框中的内容可以让较有经验的程序员快速了解基本的Java 语法。后续章节仍然以通俗易懂为宗旨,但它们适合于那些已经进展到更高级主题的学生。 本版相较于前面版本的变化 第6 版所表现的编程原理与第5 版是相同的。若你是教师,那么你在教授同一门课程时可以用与以前相同的顺序介绍相同的主题,且无须对这些主题所涉及的内容或章节加以改变。相较于前一版本,本版的变化几乎全部体现为追加性材料,如下所示: 增加了对如何用 Java 8的 lambda表达式进行函数式编程的介绍。 增加了一些循环、网络和异常处理方面的内容和例子。 增加了对如何使用 JavaFX创建 GUI 的介绍。 增加了 15 个新的编程项目。 没有非标准软件 本书中只使用标准Java 类库中的类,而未使用任何非标准软件。 Java 范围 本书中的所有程序都用Java 8 测试过。目前,Oracle 未对Java 的未来版本提出任何会影响本书中方法的变更。 面向对象编程 本书详尽地介绍了以Java 语言实现的封装、继承和多态。在关于Swing GUI 的章节中,介绍了事件驱动的编程并提供了大量的练习。 主题排序的灵活性 本书允许教师重新安排书中所论述的主题。对于旨在作为参考书的书籍来说,这一点是很重要的。这一点也符合我写书的基本原则:使书籍能适应教师的风格而不是让教师受制于作者在主题编排上的个人偏好。为此,本书每一章开始时都有一个名为“前导知识”的部分,此部分说明了在学习相应的章节时需要事先掌握的有关内容。接下来“带星号的部分”进一步增加了本书在使用上的灵活性。 带星号的部分 每一章中都有若干带星号(★)的部分,这些部分是可选的。对于初学者来说它们所包含的内容难度较大,可以跳过不学或者推迟到以后再学,而这样做并不会破坏本书学习的连续性。我们希望读者最后还是会返回来把这些内容学完。对于高年级的学生来说,不应将带星号的部分视为可选的内容。 通俗易懂 对于一本书来说,不仅需要以恰当的次序论述恰当的主题并让教师或其他专家在阅读时觉得其内容清晰无误,而且需要通俗易懂,让事先不懂其内容的人也可以读懂学会。和我编著的其他那些已被证实很受欢迎的教科书一样,本书对学生来说也是容易使用和通俗易懂的。 总结框 在本书中,对每个重要知识点都做了概括,这些概括均用方框框了起来。它们分布和贯穿于每一章。作为对相关内容的总结,它们可用作快速参考源,并为想大体上了解Java 特征的读者提供了快速学习Java 语法的途径。 自测题 每一章都包含了很多自测题以帮助学生掌握该章的关键知识点。在每一章的末尾给出了该章所有自测题的参考答案。 其他特征 每一章都将给出陷阱、编程小贴士以及带有示例运行结果的完整程序示例。每一章均以“本章小结”和一个适合作为编程项目的项目集结束。 如何访问为教师和学生提供的资源 可利用“我的编程实验室”(MyProgrammingLabTM)进行在线练习和测评。“我的编程实验室”可帮助学生充分掌握编程的逻辑、语义和语法。对于尚未很好掌握常见高级编程语言基本概念和范式的初学者来说,可以通过“我的编程实验室”所提供的实战练习和即时的、个性化的反馈,提高自己的编程能力。 作为自学及课后作业工具,“我的编程实验室”包含围绕着本书结构组织起来的数百个小型练习题。对于学生来说,系统会自动检测他们所提交的代码在逻辑和语法上的错误,并给出有针对性的提示,使他们能够找出什么地方有错误以及错误原因。对于教师来说,系统则提供了一个全面的成绩簿,利用它可以跟踪正确的和不正确的答案以及存储学生输入的代码以便评审。 若想全面了解“我的编程实验室”,以便查看到来自老师和学生的反馈或者在你的课程中开始使用“我的编程实验室”,请访问http://www.pearsonmylabandmastering.com/northamerica/myprogramminglab/(需要注册)。 支持材料 本书中的源代码 获取网址是www.pearsonhighered.com/cs-resources/。 其他资源 这仅供www. pearsonhighered.com/irc 网站上具备资格的教师获得。如果有国内教师采用本书作为教材,他们需要自行联系培生中国获得教辅资源(本书末尾附有联系表格)。 致谢 本书的问世得益于很多人给予的宝贵帮助和支持:我以前的编辑Addison-Wesley出版公司的Susan Hartman,是最初提议我写作本书的人,并与我一起完成了本书的最初几版;我现在的编辑Matt Goldstein 为本书后续版本的审校、修订及宣传提供了支持并提出了若干好主意;Kelsey Loanes、Rose Kernan、Demetrius Hall 和Pearson 公司其他一些优秀的人士也提供了宝贵的帮助和鼓励。 许多人员审校了本书,为本书指出了需要修改的错误并提供了建议。他们的贡献是非常有帮助的,我很感谢他们。 特别感谢阿拉斯加安克雷奇大学的肯瑞克? 莫克(Kenrick Mock),该版本的修订工作是由他来做的。他又一次将这么艰巨的工作完成得让我、编辑以及他本人感到满意。 我非常感谢他如此出色的工作。 沃尔特? 萨维奇(Walter Savitch) 读者服务 轻松注册成为博文视点社区用户(www.broadview.com.cn),扫码直达本书页面。 ? 下载资源:本书如提供示例代码及资源文件,均可在 下载资源 处下载。 ? 提交勘误:您对书中内容的修改意见可在 提交勘误 处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。 ? 交流互动:在页面下方 读者评论 处留下您的疑问或观点,与我们和其他读者一 同学习交流。 页面入口:http://www.broadview.com.cn/32866
目录 第1章 入门知识 1 1.1 Java简介 2 Java语言的起源 ★ 2 对象和方法 3 小程序(applet)★ 4 一个Java应用程序示例 4 字节码和Java虚拟机 7 类装载器★ 9 编译一个Java程序或类 9 运行一个Java程序 9 小贴士:错误消息 10 1.2 表达式和赋值语句 11 标识符 11 变量 12 赋值语句 14 小贴士:初始化变量 15 更多赋值语句知识★ 16 赋值兼容性 17 常量 18 算数运算符和表达式 19 括号和优先级规则★ 20 整数和浮点数除法 22 陷阱:浮点数的舍入错误 22 陷阱:整数相除 23 类型转换 24 自增运算符和自减运算符 25 1.3 String类 27 字符串常量和变量 27 字符串连接 28 类 29 String类的方法 30 转义字符 34 字符串处理 35 Unicode字符集★ 36 1.4 程序风格 37 命名常量 37 Java拼写约定 39 注释 40 缩进 41 本章小结 41 自测题答案 42 编程项目 44 第2章 流程控制 47 2.1 屏幕输出 48 System.out.println 48 小贴士:编辑输出格式的不同方法 50 使用printf编辑输出格式 51 小贴士:用printf编辑金额格式 54 小贴士:遗留代码 55 使用NumberFormat编辑金额输出格式 ★ 56 导入包和类 58 DecimalFormat类 ★ 59 2.2 使用Scanner类进行控制台输入 62 Scanner类 63 陷阱:行终止符'n'的处理 67 空字符串 68 小贴士:输入提示 68 小贴士:输入反馈 68 示例:自助结账程序 70 其他输入分隔符 70 2.3 文件输入简介 72 用Scanner类进行文本文件输入 72 本章小结 75 自测题答案 75 编程项目 77 第3章 控制流 81 3.1 分支机制 82 if-else语句 82 省略else 83 复合语句 83 小贴士:放置花括号 84 嵌套语句 85 多分支if-else语句 86 示例:州所得税 86 switch语句 88 陷阱:忘记switch语句中的break 91 条件运算符 ★ 92 3.2 布尔表达式 92 简单布尔表达式 93 陷阱:用=代替== 93 陷阱:使用==比较字符串 94 字典顺序和字母顺序 95 建立布尔表达式 97 陷阱:不等式串 98 计算布尔表达式 98 小贴士:命名布尔boolean变量 101 短路求值与完整求值 101 优先级和结合规则 102 3.3 循环 107 while语句和do-while语句 108 算法和伪代码 110 示例:分数列表的平均分 112 for语句 113 for语句中的逗号 115 小贴士:重复N次循环 116 陷阱:for语句中多余的分号 116 陷阱:无限循环 117 嵌套循环 118 break语句和continue语句★ 120 exit语句 121 3.4 调试 122 循环bug 122 跟踪变量 122 常规调试技术 123 示例:调试一个输入验证循环 124 预防性编码 127 断言检查★ 127 3.5 生成随机数★ 129 Random对象 130 Math.random( )方法 131 本章小结 132 自测题答案 132 编程项目 136 第4章 类的定义 I 141 4.1 类的定义概述 142 实例变量和方法 145 方法续论 147 小贴士:任何方法都能用作void方法 150 局部变量 152 块 152 小贴士:在一个for语句中声明变量 153 原始类型参数 154 陷阱:术语“形参”和“实参”的使用 159 类参数的简单示例 160 this参数 160 返回布尔值的方法 162 方法equals和toString 164 递归方法 166 小贴士:对方法进行测试 167 4.2 信息的隐藏和封装 168 修饰符public和private 169 示例:另一个日期类 170 get和set方法 171 小贴士:一个类可以访问该类所有对象的私有成员 174 小贴士:set方法可以返回一个布尔值 175 前置条件和后置条件 176 4.3 重载 177 重载的规则 177 陷阱:重载与自动类型转换 180 陷阱:不能根据返回类型进行重载 182 4.4 构造函数 183 构造函数的定义 183 小贴士:你可以在构造函数中调用另一个方法 190 小贴士:构造函数带有一个this参数 190 小贴士:添加一个无参数构造函数 190 示例:日期类的最终版本 191 默认变量初始化 192 另一种初始化实例变量的方法 192 示例:一个宠物记录类 193 StringTokenizer类★ 196 本章小结 200 自测题答案 201 编程项目 204 第5章 类的定义 II 211 5.1 静态方法和静态变量 212 静态方法 212 陷阱:在静态方法中调用非静态方法 215 小贴士:你可以在任何类中放置main函数 215 静态变量 218 Math类 222 封装类 225 自动装箱和拆箱 226 封装类中的静态方法 227 陷阱:封装类没有无参数构造函数 229 5.2 引用和类参数 231 变量和内存 231 引用 232 类参数 237 陷阱:对类类型的变量使用=和== 240 常量null 241 陷阱:空指针异常 242 new运算符和匿名对象 242 示例:键盘输入的另一种方法★ 243 小贴士:使用静态导入★ 245 5.3 引用的使用和滥用 246 示例:Person类 246 陷阱:null可以作为方法的参数 251 拷贝构造函数 253 陷阱:隐私泄露 255 可变类和不可变类 258 小贴士:深拷贝vs.浅拷贝 259 小贴士:假设你的同事是恶意的 260 5.4 包和javadoc 260 包和import语句 261 java.lang包 262 包名和目录 262 陷阱:子类不是自动导入的 264 默认包 264 陷阱:不要在类路径中包含当前目录 264 编译时指定类路径★ 265 命名冲突★ 266 javadoc简介 ★ 266 为javadoc注释类★ 267 运行javadoc★ 268 本章小结 269 自测题答案 270 编程项目 273 第6章 数组 279 6.1 数组简介 280 数组的创建和访问 280 length实例变量 283 小贴士:在数组中使用for循环 284 陷阱:数组下标总是从0开始 285 陷阱:数组越界 285 数组的初始化 285 陷阱:字符数组不是字符串 287 6.2 数组和引用 287 数组是对象 288 陷阱:具有类基本类型的数组 289 数组参数 289 陷阱:在数组中使用=和== 291 main方法的参数★ 294 返回数组的方法 295 6.3 用数组进行编程 297 部分填充数组 297 示例:部分填充数组的类 300 小贴士:get方法不需要返回实例变量 303 “for-each”循环★ 303 参数个数可变的方法★ 306 示例:一个字符串处理示例★ 308 数组实例变量的隐私泄露 309 示例:对数组排序 312 枚举类型★ 315 小贴士:在switch语句中使用枚举类型★ 319 6.4 多维数组 321 多维数组的基础知识 321 使用length实例变量 323 参差数组★ 323 多维数组参数和返回值 324 示例:一个成绩册类 325 本章小结 330 自测题答案 330 编程项目 336 第7章 继承 343 7.1 继承的基础知识 344 派生类 344 重写方法的定义 352 修改重写方法的返回类型 353 修改重写方法的访问权限 354 陷阱:重写 vs. 重载 354 super构造函数 355 this构造函数 356 小贴士:派生类的对象有多个类型 357 陷阱:术语子类和超类 359 示例:增强的StringTokenizer类★ 359 7.2 封装和继承 362 陷阱:基类中私有变量的使用 362 陷阱:私有方法不能被有效地继承 364 受保护访问和包访问 364 陷阱:忘记默认包 366 陷阱:受保护访问的限制★ 366 7.3 使用继承编程 368 小贴士:静态变量是继承的 368 小贴士:“is a”vs. “has a” 369 访问重新定义的基类方法 369 陷阱:你不能使用多个super 370 Object类 371 定义equals的正确方式 371 小贴士:getClass vs. instanceof★ 373 本章小结 377 自测题答案 377 编程项目 380 第8章 多态与抽象类 385 8.1 多态 386 后期绑定 386 final修饰符 388 示例:销售记录 389 在toString中使用后期绑定 394 陷阱:静态方法不使用后期绑定 395 向下转型和向上转型 396 陷阱:向下转型 398 小贴士:检查向下转型是否是合法的 399 clone方法浅析 400 陷阱:有时clone方法的返回类型是对象 401 陷阱:拷贝构造函数的限制★ 402 8.2 抽象类 405 抽象类综述 405 陷阱:你无法创建抽象类的实例 408 小贴士:抽象类是一种类型 409 本章小结 410 自测题答案 410 编程项目 412 第9章 异常处理 415 9.1 异常处理基础知识 416 try-catch机制 417 用Scanner类进行异常处理 418 小贴士:异常控制的循环 419 抛出异常 421 示例:异常处理的“玩具”示例 422 异常类 426 标准包中的异常类 427 定义异常类 428 小贴士:保留getMessage 432 小贴士:异常类可以携带任何类型的消息 434 多个catch块 438 陷阱:先捕获更具体的异常 439 9.2 在方法中抛出异常 441 在方法中抛出异常概述 441 在throws从句中声明异常 443 捕获或声明规则的例外情况 445 派生类中的throws从句 447 何时使用异常 447 示例:检索高分 448 事件驱动编程★ 451 9.3 更多异常处理编程技术 452 陷阱:嵌套的try-catch块 452 finally块★ 452 重新抛出异常★ 454 AssertionError类★ 454 ArrayIndexOutOfBoundsException 454 本章小结 455 自测题答案 455 编程项目 459 第10章 文件I/O 463 10.1 文件I/O简介 464 流 464 文本文件和二进制文件 465 10.2 文本文件 466 写入文本文件 466 陷阱:try块是一个块 470 陷阱:覆盖输出文件 471 追加到文本文件末尾 471 小贴士:toString可以帮助文本文件的输出 472 从文本文件中读取 473 使用Scanner读取文本文件 473 用Scanner测试文本文件的结束 475 使用BufferedReader读取文本文件 480 小贴士:用BufferedReader读取数字 483 用BufferedReader测试文本文件的结束 484 路径名 485 嵌套的构造函数调用 486 System.in、System.out和System.err 487 10.3 File类 489 用File类编程 489 10.4 二进制文件★ 492 将简单数据写入二进制文件中 493 UTF和writeUTF 496 从二进制文件中读取简单数据 497 检查二进制文件的结束 501 陷阱:用错误的方式检查文件结束 502 对象的二进制I/O 503 Serializable接口 505 陷阱:将类类型混合在同一个文件中 506 二进制文件中的数组对象 506 10.5 随机存取二进制文件★ 508 读写同一个文件 508 陷阱:RandomAccessFile不需要从空文件开始 512 本章小结 512 自测题答案 513 编程项目 516 第11章 递归 521 11.1 递归void方法 522 示例:垂直显示的数字 523 跟踪递归调用 525 递归详解 527 陷阱:无限递归 528 递归的栈★ 530 陷阱:栈溢出★ 531 递归与迭代 531 11.2 返回值的递归方法 532 返回值的递归方法的一般形式 532 示例:另一个幂方法 532 11.3 递归思维 536 递归设计技巧 536 二分查找★ 537 二分查找的效率★ 542 示例:查找一个文件 543 本章小结 546 自测题答案 546 编程项目 550 第12章 UML和模式 555 12.1 UML 556 UML的历史 557 UML类图 557 类交互 557 继承图 558 UML的更多知识 559 12.2 模式 ★ 560 适配器模式★ 560 模型-视图-控制器模式★ 560 示例:排序模式 561 排序模式的限制 566 排序模式的效率★ 567 小贴士:语用学和模式 567 模式形式 567 本章小结 568 自测题答案 568 编程项目 570 第13章 接口和内部类 573 13.1 接口 574 接口概述 574 抽象类实现接口 576 派生接口 577 陷阱:接口语义不会被强制执行 578 Comparable接口 579 示例:使用Comparable接口 580 接口中的预定义常量 584 陷阱:不一致的接口 584 Serializable接口★ 587 Cloneable接口 587 13.2 内部类的简单使用 590 帮助类 590 小贴士:内部类和外部类可以访问彼此的私有成员 591 示例:一个银行账户类 591 内部类的.class文件 595 陷阱:内部类的其他用途 595 13.3 内部类的更多内容 595 静态内部类 595 公有内部类 596 小贴士:调用外部类的方法 598 嵌套内部类 599 内部类和继承 599 匿名类 600 小贴士:为什么要使用内部类 602 本章小结 602 自测题答案 603 编程项目 607 第14章 泛型和ArrayList类 611 14.1 ArrayList类 612 使用ArrayList类 613 小贴士:在ArrayList中添加元素的总结 617 ArrayList类中的方法 618 “for-each”循环 620 示例:高尔夫球成绩 623 小贴士:使用trimToSize节约内存 625 陷阱:clone方法会进行浅拷贝★ 625 Vector类 626 参数化的类和泛型 627 陷阱:非参数化的ArrayList和Vector类 627 14.2 泛型 627 泛型基础知识 627 陷阱:用-Xlint选项编译 629 示例:有序对的泛型类 629 陷阱:泛型构造函数名没有类型参数 632 陷阱:你不能用原始类型替换类型参数 633 陷阱:并不是在使用类型名称的任何地方都可以使用类型参数 633 陷阱:泛型类的实例化不可以是数组基本类型 633 小贴士:类定义中可以有多个类型参数 634 陷阱:泛型类不能是异常类 635 类型参数的限制 636 小贴士:泛型接口 638 泛型方法★ 638 泛型类的继承★ 639 本章小结 641 自测题答案 641 编程项目 643 第15章 链式数据结构 647 15.1 Java链表 649 示例:简单的链表类 649 使用链表 652 陷阱:隐私泄露 657 节点内部类 657 示例:泛型链表 660 陷阱:使用Node,而不是Node<T> 664 链表的equals方法 664 15.2 拷贝构造函数和clone方法★ 665 简单的拷贝构造函数和clone方法★ 666 异常★ 666 陷阱:clone方法在Object中是受保护的★ 668 小贴士:使用类型参数限制可以得到更好的clone方法★ 669 示例:带有深拷贝clone方法的链表★ 672 小贴士:克隆是一种“全有或者全无”事件 674 15.3 迭代器 675 定义一个迭代器类 675 添加和删除节点 680 15.4 链表的变形 683 双向链表 683 栈数据结构 691 队列数据结构 693 运行时间和大O符号 695 链表的效率 699 15.5 链式哈希表 700 字符串的哈希函数 701 哈希表的效率 704 15.6 set 704 set的基本操作 705 使用链表的set的效率 709 15.7 树 710 树的性质 710 示例:一个二叉查找树类 ★ 712 二叉查找树的效率★ 716 本章小结 716 自测题答案 717 编程项目 722 第16章 集合、映射和迭代器 725 16.1 集合 726 通配符 727 集合框架 728 陷阱:可选操作 733 小贴士:处理所有这些异常 733 具体的集合类 734 ArrayList<T>和Vector<T>之间的区别 741 集合框架的非参数化版本★ 742 陷阱:省略<T> 742 16.2 Map映射 742 具体的Map类 744 16.3 迭代器 748 迭代器的概念 748 Iterator<T>接口 748 小贴士:for-each循环作为迭代器 750 列表迭代器 751 陷阱:next可以返回一个引用 753 小贴士:定义自己的迭代器类 754 本章小结 755 自测题答案 755 编程项目 756 第17章 Swing I 761 17.1 事件驱动编程 762 事件和监听器 763 17.2 按钮、事件和其他Swing基础知识 764 示例:一个简单的窗口 764 陷阱:忘记编写关闭窗口按钮的代码 768 按钮 769 动作监听器和动作事件 770 陷阱:修改actionPerformed的方法头 771 小贴士:结束一个Swing程序 772 示例:第一个Swing GUI的更好版本 772 标签 775 颜色 776 示例:一个带有标签和颜色的GUI 777 17.3 容器和布局管理器 779 边界布局管理器 779 流布局管理器 782 网格布局管理器 783 面板 786 示例:用面板创建3种颜色 787 Container类 790 小贴士:分别编写GUI的外观和动作 792 模型-视图-控制器模式★ 793 17.4 菜单和按钮 793 示例:一个带有菜单的GUI 794 菜单、菜单项和菜单栏 794 嵌套菜单★ 798 AbstractButton类 798 setActionCommand方法 801 监听器作为内部类★ 802 17.5 文本框和文本域 804 文本框和文本域概述 804 小贴士:给文本域添加标签 809 小贴士:输入和输出数字 810 一个Swing计算器 810 本章小结 815 自测题答案 815 编程项目 821 第18章 Swing II 823 18.1 窗口监听器 824 示例:一个窗口监听器内部类 825 dispose方法 828 陷阱:忘记调用setDefaultCloseOperation 829 WindowAdapter类 829 18.2 图标和滚动条 831 图标 831 滚动条 836 示例:可以改变可见性的组件 840 18.3 Graphics类 842 图形对象的坐标系统 842 paint方法和Graphics类 843 绘制椭圆 848 绘制弧线 848 圆角矩形★ 851 面板的paintComponent 851 动作绘制和repaint 852 更新GUI的更多细节★ 856 18.4 颜色 857 指定绘图颜色 857 定义颜色 858 陷阱:使用double定义颜色 859 JColorChooser对话框窗口 860 18.5 字体drawString方法 862 drawString方法 863 字体 864 本章小结 867 自测题答案 867 编程项目 871 第19章 Java永不落幕 875 19.1 多线程 876 示例:一个无响应的GUI 877 Thread.sleep 877 getGraphics方法 880 使用线程修复一个无响应的程序 881 示例:一个多线程程序 881 Thread类 881 Runnable接口★ 884 竞争条件和线程同步★ 886 19.2 流套接字网络 890 套接字 890 套接字和线程 893 URL类 894 19.3 JavaBeans 895 组件模式 895 JavaBeans模型 895 19.4 Java和数据库连接 896 关系数据库 896 Java DB和JDBC 897 SQL 898 19.5 用JSP进行Web编程 906 applet、servlet和JSP 906 Oracle GlassFish企业级服务器 908 HTML表单——通用网关接口 909 JSP声明、表达式、scriptlet和指令 911 19.6 浅谈Java 8中的函数式编程 918 19.7 浅谈JavaFX 924 本章小结 936 自测题答案 937 编程项目 938 第20章 applet和HTML1 附录A 关键字 941 附录B 优先级和结合性规则 943 附录C ASCII字符集 945 附录D printf的格式规范 947 附录E 类和接口总结 949 1 英文原版书的第20章是放在相关配套网站上的,本中文版与其保持一致,也放在www.broadview.com.cn/32866,读者可下载阅读。
译有《Absolute Java中文版(第6版)》、《信息架构:超越Web设计(第4版)》《像富人一样思考》《故事场景摩天楼》《互联网领导思维》《断点:互联网进化启示录》《游戏编程权威指南》《Unity 3.x游戏开发实例》《iPhone应用用户体验设计实战与案例》《社交网站界面设计》等书。