Java程序设计教程(原书第3版)

更多详情

内容简介: 本书采用了“从基础开始”的讲法,先介绍面向过程的程序设计方法,打下牢固的编程基础后,再讲述面向对象的程序设计方法。主要内容包括:程序设计基础、数组、类、继承和接口、ArrayList、排序和查找、递归和回溯、栈和队列、链表、二叉树、散列表和堆等。所有内容层层推进,由浅入深。每个主题以实际问题引入,结合案例分析突出该主题的应用方法,并介绍相关的常见编程错误以及编程技巧。每个章节都配有自测题、练习题和编程练习题,对理解和消化书中的概念很有帮助,非常适合学生和初学者自学参考。
本书是以Java语言为载体讲授计算机程序设计方法(包括面向过程与面向对象)的入门与中级教程,适用于计算机与非计算机专业开设的程序设计入门与进阶课程,也可以作为学习Java语言的入门读物,对于软件工程师、系统集成工程师以及应用和维护等相关人员来说,也不失为一本好的参考读物。

目录: Building Java Programs: A Back to Basics Approach, Third Edition
出版者的话
译者序
前言
第1章 Java编程简介 1
1.1 计算的基本概念 1
1.1.1 为什么要编程 1
1.1.2 硬件和软件 2
1.1.3 数字王国 2
1.1.4 程序设计的过程 4
1.1.5 为什么选择Java 5
1.1.6 Java编程环境 5
1.2 现在开始介绍Java 6
1.2.1 字符串常量 9
1.2.2System.out.println 9
1.2.3 转义序列 10
1.2.4 print和println 10
1.2.5 标识符和关键字 12
1.2.6 一个复杂的例子:DrawFigures1 13
1.2.7 注释与程序可读性 14
1.3 程序中的错误 16
1.3.1 语法错误 16
1.3.2 逻辑错误 18
1.4 过程分解 18
1.4.1静态方法 20
1.4.2 控制流程 22
1.4.3 调用其他方法的方法 24
1.4.4 运行时错误举例 26
1.5 案例分析:输出图形 27
1.5.1 结构化的版本 27
1.5.2 无冗余的最终版本 28
1.5.3 执行流程的分析 30
本章小结 31
第2章 基本数据类型和确定循环 32
2.1 数据的基本概念 32
2.1.1 基本类型 32
2.1.2 表达式 33
2.1.3 常值 34
2.1.4 算术运算符 35
2.1.5 优先级 36
2.1.6 类型混用和类型转换 38
2.2 变量 39
2.2.1 赋值和声明变量 42
2.2.2 字符串连接 44
2.2.3 增量和减量运算符 46
2.2.4 变量和混合类型 47
2.3 for循环 49
2.3.1 跟踪for循环 50
2.3.2 for循环模式 52
2.3.3 循环嵌套 53
2.4 复杂性管理 55
2.4.1 作用域 55
2.4.2 伪代码 59
2.4.3 类常量 61
2.5 案例分析:输出复杂的图形 63
2.5.1 问题分解和伪代码 63
2.5.2 第一个结构化版本 64
2.5.3 增加一个类常量 66
2.5.4 进一步修改 68
本章小结 69
第3章 参数和对象 70
3.1 参数 70
3.1.1 参数的机制 72
3.1.2 参数的限制 75
3.1.3 多重参数 77
3.1.4 参数和常量 79
3.1.5 方法重载 79
3.2 具有返回值的方法 80
3.2.1 Math类 81
3.2.2 编写具有返回值的方法 83
3.3 使用对象 85
3.3.1 String对象 86
3.3.2 交互式程序和Scanner对象 90
3.3.3 交互式程序示例 92
3.4 案例分析:抛物线轨迹 93
3.4.1 非结构化解决方案 96
3.4.2 结构化解决方案 98
本章小结 100
第3G章 图形(选学) 101
3G.1 图形简介 101
3G.1.1 DrawingPanel 101
3G.1.2 绘制线段和图形 102
3G.1.3 颜色 105
3G.1.4 循环绘图 106
3G.1.5 文本和字体 108
3G.2 图形处理中的过程分解 110
3G.3 案例分析:金字塔 113
3G.3.1 非结构的部分解决方案 113
3G.3.2 绘制金字塔的通用方法 114
3G.3.3 完全的结构化解决方案 116
本章小结 117
第4章 条件执行 118
4.1 if/else语句 118
4.1.1 关系运算符 119
4.1.2 嵌套if/else语句 120
4.1.3 对象的相等性 125
4.1.4 构造if/else语句 126
4.1.5 多重条件测试 127
4.2 积累式算法 128
4.2.1 累加和 128
4.2.2 最小/最大循环 130
4.2.3 使用if计算累加和 133
4.2.4 截断错误 134
4.3 文本处理 136
4.3.1 char类型 137
4.3.2 char与int 137
4.3.3 积累式文本处理算法 138
4.3.4 System.out.printf 139
4.4 条件执行的方法 142
4.4.1 前提条件和后置条件 142
4.4.2 抛出异常 143
4.4.3 重温返回值 145
4.4.4 推敲执行路径 148
4.5 案例分析:计算健康指数 150
4.5.1 单人版无结构化解决方案 151
4.5.2 两人版无结构化解决方案 153
4.5.3 两人版结构化解决方案 155
4.5.4 面向过程的程序设计原则 158
本章小结 161
第5章 程序逻辑和不确定循环 162
5.1 while循环 162
5.1.1 寻找最小约数的循环 163
5.1.2 随机数字 165
5.1.3 计算机模拟技术 168
5.1.4 do/while循环 169
5.2 篱笆桩算法 170
5.2.1 哨兵循环 171
5.2.2 使用if语句处理篱笆桩 172
5.3 布尔类型 174
5.3.1 逻辑运算符 175
5.3.2 短路特性 176
5.3.3 boolean变量和标志 180
5.3.4 boolean的禅意 181
5.3.5 布尔表达式的非运算 183
5.4 用户错误 184
5.4.1 初识Scanner对象 184
5.4.2 处理用户错误 186
5.5 断言和程序逻辑 187
5.5.1 分析断言 188
5.5.2 断言举例 190
5.6 案例分析:猜数字 192
5.6.1 无提示的初始版本 192
5.6.2 带有提示的随机版本 194
5.6.3 健壮的最终版本 197
本章小结 199
第6章 文件处理 201
6.1 读取文件的基本方法 201
6.1.1 随处可见的数据 201
6.1.2 文件与文件对象 202
6.1.3 使用Scanner对象读取文件内容 203
6.2 基于标记的文件处理 206
6.2.1 文件的结构和处理输入 208
6.2.2 Scanner对象的参数 211
6.2.3 路径和目录 212
6.2.4 一个更复杂的输入文件 214
6.3 基于行的处理 215
6.4 高级文件处理 220
6.4.1 使用PrintStream输出文件内容 220
6.4.2 保证文件可读 224
6.5 案例分析:邮政编码查询 225
本章小结 231
第7章 数组 232
7.1 数组的基本概念 232
7.1.1 创建并遍历数组 232
7.1.2 访问数组 235
7.1.3 一个使用数组的完整程序 237
7.1.4 随机访问 240
7.1.5 数组与方法 241
7.1.6 for-each循环 244
7.1.7 数组初始化 245
7.1.8 Arrays类 246
7.2 数组遍历算法 247
7.2.1 打印数组 247
7.2.2 查询与替换 249
7.2.3 判断相等性 251
7.2.4 逆序数组 252
7.2.5 字符串遍历算法 255
7.3 引用语义 256
7.4 高级数组技术 259
7.4.1 移动数组中的元素 259
7.4.2 对象数组 262
7.4.3 命令行参数 263
7.4.4 嵌套循环算法 263
7.5 多维数组 265
7.5.1 规则的二维数组 265
7.5.2 锯齿状二维数组 266
7.6 案例分析:本福德定律 270
7.6.1 计数器 270
7.6.2 完整的程序 273
本章小结 277
第8章 类 279
8.1 面向对象程序设计的基本概念 279
8.1.1 类和对象 280
8.1.2 Point对象 281
8.2 对象的状态与行为 282
8.2.1 对象的状态:字段 282
8.2.2 对象的行为:方法 284
8.2.3 隐含的参数 286
8.2.4 修改器和访问器 287
8.2.5 toString方法 289
8.3 对象的初始化:构造函数 290
8.3.1 关键字this 293
8.3.2 多个构造函数 295
8.4 封装 296
8.4.1 私有成员 296
8.4.2 类的不变式 301
8.4.3 改变类的内部实现 303
8.5 案例分析: 设计一个表示股票信息的类 305
8.5.1 面向对象程序设计讨论 305
8.5.2 Stock类的字段和方法声明 307
8.5.3 Stock类的构造函数和实例方法的实现 308
本章小结 311
第9章 继承和接口 313
9.1 继承的基本概念 313
9.1.1 程序设计之外的层次结构 314
9.1.2 扩展类 315
9.1.3 重写方法 318
9.2 与父类交互 320
9.2.1 调用重写的方法 320
9.2.2 访问继承的字段 320
9.2.3 调用父类的构造函数 322
9.2.4 DividendStock类的行为 323
9.2.5 Object类 325
9.2.6 equals方法 326
9.2.7 instanceof关键字 328
9.3 多态性 329
9.3.1 多态机制 331
9.3.2 解析继承代码 333
9.3.3 解析复杂的调用关系 334
9.4 继承和设计 336
9.4.1 继承的误用 336
9.4.2 “是一个”和“有一个”关系 338
9.4.3 Graphics2D类 339
9.5 接口 340
9.5.1 形状类的接口 341
9.5.2 实现接口 342
9.5.3 接口的优点 344
9.6 案例分析: 设计一组具有层次关系的金融类 346
9.6.1 设计类 346
9.6.2 初步实现 349
9.6.3 抽象类 352
本章小结 356
第10章 ArrayList 357
10.1 ArrayList 357
10.1.1 ArrayList的基本操作 358
10.1.2 ArrayList的查找方法 361
10.1.3 一个完整的ArrayList程序 363
10.1.4 向ArrayList添加或删除元素 364
10.1.5 使用for-each循环访问ArrayList 367
10.1.6 包装类 368
10.2 Comparable接口 370
10.2.1 自然排序和compareTo方法 372
10.2.2 实现Comparable接口 374
10.3 案例分析:词汇表比较 378
10.3.1 关于程序执行效率的考虑 379
10.3.2 版本1:计算词汇量 380
10.3.3 版本2:计算重叠部分 383
10.3.4 版本3:完整的程序 386
本章小结 390
第11章 Java的集合框架 391
11.1 列表 391
11.1.1 集合 391
11.1.2 LinkedList与ArrayList 392
11.1.3 迭代器 394
11.1.4 抽象数据类型 397
11.1.5 LinkedList类案例分析:筛法 398
11.2 数学集合 401
11.2.1 数学集合的概念 402
11.2.2 TreeSet与HashSet 403
11.2.3 数学集合上的运算 404
11.2.4 Set类案例分析:彩票机 406
11.3 映射 407
11.3.1 基本映射操作 408
11.3.2 映射视图(keySet和values) 409
11.3.3 TreeMap与HashMap 411
11.3.4 Map类案例分析:字数统计 411
11.3.5 集合综述 413
本章小结 414
第12章 递归 415
12.1 递归的思想 415
12.1.1 一个与编程无关的例子 415
12.1.2 将迭代方法改写为递归方法 417
12.1.3 递归方法的结构 419
12.2 一个更好的递归实例 420
12.3 递归函数和数据 428
12.3.1 整数的幂运算 428
12.3.2 求最大公约数 430
12.3.3 目录爬虫 434
12.3.4 助手方法 437
12.4 递归图形 439
12.5 递归回溯 442
12.5.1 一个简单的例子:移动路线问题 442
12.5.2 8皇后问题 445
12.5.3 数独问题 450
12.6 案例分析:求解前序表达式 453
12.6.1 中序、前序、后序表达式 453
12.6.2 计算前序表达式 454
12.6.3 完整的程序 456
本章小结 458
第13章 查找与排序 459
13.1 Java类库中的查找与排序 459
13.1.1 二分法查找 460
13.1.2 排序 462
13.1.3 洗牌 463
13.1.4 用比较器来自定义顺序 464
13.2 程序的复杂度 467
13.2.1 实验分析 469
13.2.2 算法的复杂度类型 471
13.3 查找和排序算法的实现 473
13.3.1 顺序查找 473
13.3.2 二分法查找 474
13.3.3 递归二分法查找 476
13.3.4 查找对象 479
13.3.5 选择排序 479
13.4 案例分析:归并排序算法的实现 482
13.4.1 分解与合并数组 482
13.4.2 递归的归并排序 484
13.4.3 完整的程序 487
本章小结 489
第14章 栈与队列 490
14.1 栈/队列基础 490
14.1.1 栈的概念 490
14.1.2 队列的概念 492
14.2 栈/队列常用操作 493
14.2.1 栈与队列互换 494
14.2.2 队列元素求和 495
14.2.3 栈元素求和 496
14.3 栈/队列高级操作 498
14.3.1 删除队列中的元素 498
14.3.2 比较两个栈 499
14.4 案例分析:表达式求值 501
14.4.1 标记分解 502
14.4.2 求值计算 505
本章小结 509
第15章 实现集合类 511
15.1 简单ArrayIntList类 511
15.1.1 添加数值和打印功能 511
15.1.2 关于封装的思考 515
15.1.3 处理列表的中间内容 516
15.1.4 引入另一个构造函数和常量 519
15.1.5 前提条件和后置条件 520
15.2 更完整的ArrayIntList类 523
15.2.1 抛出异常 523
15.2.2 方便的方法 525
15.3 高级功能 527
15.3.1 自动调整列表大小 527
15.3.2 添加迭代器 528
15.4 ArrayList 类 533
本章小结 536
第16章 链表 538
16.1 链表节点 538
16.1.1 创建链表 539
16.1.2 链表基础操作 541
16.1.3 操作节点 542
16.1.4 链表遍历 545
16.2 链表类 547
16.2.1 简单LinkedIntList类 547
16.2.2 追加新节点 549
16.2.3 操作中间节点 551
16.3 复杂的链表操作 557
16.4 IntList接口 561
16.5 LinkedList类 564
16.5.1 链表的变体技术 564
16.5.2 链表的迭代器 566
16.5.3 其他代码细节 568
本章小结 570
第17章 二叉树 571
17.1 二叉树基础 571
17.2 遍历二叉树 574
17.3 树的常见操作 584
17.3.1 节点求和 584
17.3.2 计算树的层数 585
17.3.3 计算叶子节点数量 586
17.4 二叉搜索树 587
17.4.1 二叉搜索树性质 587
17.4.2 构建二叉搜索树 588
17.4.3 x = change(x)模式 591
17.4.4 在树中进行搜索 594
17.4.5 二叉搜索树的复杂性 597
17.5 SearchTree类 597
本章小结 600
第18章 高级数据结构 602
18.1 散列技术 602
18.1.1 利用数组实现数学集合 602
18.1.2 散列函数和散列表 603
18.1.3 冲突 604
18.1.4 再散列 608
18.1.5 非整型数据的散列处理 610
18.1.6 HashMap的实现 612
18.2 优先级队列和堆 613
18.2.1 优先级队列 613
18.2.2 堆的概述 614
18.2.3 从堆中删除元素 615
18.2.4 向堆添加元素 616
18.2.5 利用数组实现堆 617
18.2.6 堆排序 620
本章小结 621
附录A Java总结 622
附录B Java API规范和Javadoc注释 631
附录C Java 语法补充说明 635
索引 642

译者序:
译者序
Building Java Programs: A Back to Basics Approach, Third Edition
程序设计是学习计算机技术的入门必修课。自从20世纪40年代计算机诞生以来,程序设计方法先后历经几代发展,从结构化程序设计到如今的面向对象程序设计。Java语言凭借着完全面向对象的特性及其特有的跨平台特性和强大的类库支持,迅速在企业级软件开发、互联网系统与平台开发和智能手机软件等领域获得广泛应用,并逐渐成为世界范围内大中专院校程序设计课程的首选语言。但不可忽视的是,Java语言中引入了很多新的概念,如对象、类等,再加上初学者的基础往往比较薄弱,所以掌握这部分内容有一定困难。因此,如何让学生顺利掌握面向对象的程序设计方法,并能够设计程序解决实际问题,就成为了教学的难点。
本书第3版最显著的特点是:
从基础开始。将程序设计的基本知识与面向对象程序设计方法划分为两个阶段进行介绍,当读者具备了扎实的编程基础之后,再学习相对复杂的面向对象程序设计。这种方式对于初学者来说有效地分散了重点和难点,避免了因内容的难度过大而影响学习效果。而且本书在讲授基本编程知识的过程中充分利用了Java语言本身提供的类库支持,使得学生在学习过程中可以这些利用预置功能编写出具有实际意义的程序,这也增加了学生学习的乐趣与成就感。
关注如何解决问题。本书并没有将重点放在Java语言的各个语法细节上,而是更关注如何编写Java程序解决问题。
强调算法思维。强调使用算法来指导程序设计,将一个大问题分解为若干个小问题,用伪代码逐步细化解决问题的算法,并努力以算法的方式去描述问题。
案例分析。每章最后都安排了一个综合案例分析,用相对完整的程序代码来具体展示这一章所介绍的概念。
本书已经被世界上百余所学院和大学所采用。本书的作者在美国华盛顿大学面向本科生(大多数为非计算机专业)开设了两门课程(CSE142和CSE 143),有数千名学生使用了本书。这里给出使用本书进行教学的一些建议。面向计算机专业开设的程序设计课程,可以重点讲授第1~11章内容,对排序(第13章)、递归(第12章)和高级数据结构(第14~18章)的内容,可以根据课时选讲,并注意与其他专业课程(数据结构、算法分析等)内容的衔接与协调。对于非计算机专业,可划分为程序设计的入门课程(第1门课程)与进阶课程(第2门课程)。入门课程主要讲授程序控制流程、面向过程与面向对象程序设计的基本方法,包括第1~9章;进阶课程重点讨论数据结构与程序设计的关系,主要讲授抽象数据类型、接口、集合类、链表、栈和队列、二叉树、散列表和堆、排序、递归等,包括第10~18章内容。
本书在第1版翻译的基础上对新增与修订的内容进行了翻译,对已有内容进行了全面校订,并补充了术语索引,便于读者对书中出现的主要概念和术语进行查阅。由于译者的专业水平和时间的双重限制,错误和不妥之处诚恳地希望读者批评指正,译者的联系方式是:mufchen@gmail.com。

前言: Building Java Programs: A Back to Basics Approach, Third Edition
本书是为计算机入门课程(分两个学期开设)而编写的一本教材。我们在收到针对本书第1版和第2版的大量反馈意见的基础上,对内容进行了调整与扩展,使之适用于两学期的计算机入门课程。书中所使用的内容经过了多年实际教学检验,数千名华盛顿大学的本科生(大多数为非计算机专业的学生)使用了这本教材。
一直以来,很多学校的计算机入门课程都是新生的梦魇。但是Douglas Adams在《Hitchhiker’s Guide to the Galaxy》中告诉大家“不要惊慌”。学生可以逐步掌握课程讲授的内容。采用本教材后,华盛顿大学学习计算机入门课程的学生数量大幅增加,其他使用本教材的高校也纷纷取得很好的教学效果。
从本书前两版出版以来,出现了很多支持我们提出的“延后介绍对象”方法(而不是“尽早介绍对象”)的声音。实际教学经验告诉我们,通过学习面向过程的方法,大多数学生可以更好地掌握程序设计的技能。一旦打下了牢固的编程基础,就可以转而学习面向对象的程序设计方法。所以,到课程结束时,学生可以掌握这两种程序设计方法。
下面列出了本书第3版相对于第1版的一些主要变动:
增加了5章全新的内容。第14章介绍了使用栈和队列进行程序设计的方法。第15章详细分析了实现健壮的、功能强大的集合类会遇到的一些问题。第16章讨论了链表的使用方法,第17章介绍了二叉树的设计和使用方法,第18章讨论了散列表和堆的实现方法。
升级实例分析。第6章和第7章更新了原有的实例。其他章的实例分析也增加了对学习难点的解释说明。
重新调整了需要“使用对象”的内容。将第3、4和6章的部分内容统一到第7章作为独立的一节内容:“引用语义”。我们发现这样安排可以更有效地解释这部分涉及的重要概念。
新增了面向过程程序设计的启发式策略。在第4章增加了面向过程程序设计原则的讨论。
增加了对德·摩根定律的介绍。第5章增加了关于德·摩根定律及其在布尔表达式方面应用的介绍。
新增了Array类的介绍。第7章增加了对Array类常用方法的介绍。
调整关于对象的内容。调整了第8、9章中关于对象和继承的介绍部分,使这部分内容逻辑更连贯。
新增回溯法。回溯法是解决一类问题的强有力工具。第12章中增加了对回溯方法的讨论,并给出了几个详细的例子,包括经典的8皇后问题和数独游戏。
大幅扩充了自测题和编程练习题的内容。每章的自测题和编程练习题的数量和质量都有了大幅提升。每章基本上有50道练习题,这些练习题都经过实际教学的检测,并且本教材的配套网站为教师提供了习题的参考答案。
本版保留了第1版中的以下特点:
关注如何解决问题。很多教材将重点放在程序设计语言的各个语法细节上,而本书更关注如何用程序解决问题。例如,语言的一种新的功能可以帮助我们解决哪些新的问题?初学者容易犯的错误有哪些?这种新功能的典型用法是什么?
强调算法思维。在使用面向过程的方法来解决问题时,我们强调如何通过使用算法来解决问题:将一个大问题分解为若干个小问题,用伪代码逐步细化解决问题的算法,并努力以算法的方式去描述问题。
层层推进。采用Java语言编写程序需要同时涉及很多概念,不可能在一夜之间就掌握所有这些概念。教授初学者学习Java语言就好像搭积木一样,每一块都要小心翼翼地放置。如果一次放置得太多,反而会带来倒塌的危险。我们一步一步地引入新概念,确保学生能够掌握每一步所介绍的内容。
案例分析。我们在每章的最后都安排了一个案例分析。通过这部分内容,学生可以了解如何分阶段开发并测试一个复杂的程序。而且我们可以用相对完整的程序代码来具体展示这一章所介绍的概念,这是书中那些代码片段所不能做到的。
本书的组织结构和各章之间的依赖关系
很多计算机入门教材都是面向语言特性来进行介绍,但是本书的前半部分采用了逐层推进的方式。例如,Java语言中有很多控制结构(例如,for循环、while循环、if/else语句),很多教材都把这些内容放到一章进行介绍。当然,这对于了解程序设计的人来说很正常,但对于初学者来说就会感觉很吃力。我们发现将这些控制结构分散到不同章节去介绍效果更好,这样学生一次只需要专心学习一个内容,而不必一次将所有内容都塞进脑袋中。
下表给出了前6章内容之间的顺序关系:
章号 控制流程 数据 编程技术 输入/输出
1 方法 String常量 过程分解 println、print
2 确定循环(for) 变量
表达式
int、double 局部变量
类常量
伪代码
3 返回值 使用对象 参数 控制台输入
图形(选学)
4 条件执行(if/else) char 前提/后置条件
抛出异常 printf
5 不确定循环(while) boolean 断言
健壮程序
6 Scanner 基于标记的处理
基于行的处理 文件输入/输出
应该按照顺序学习本书的第1~6章,从第7章开始可以选择自己感兴趣的内容。第6章内容可以跳过,不过第7章的实例分析会使用第6章有关文件读取的部分内容。
下图是本书各章之间的依赖关系:
补充材料
所有自测题的答案都可以在本教材的配套网站(http://www.buildingjavaprograms.com)上找到,任何人都可以访问。对于使用本教材的学生,网站上还包括以下内容:
在线补充章节,例如创建图形用户界面。
所有案例分析的源代码和数据文件,以及实例程序的完整代码。
在第3G章“图形(选学)”中使用的DrawingPanel类的代码。
使用本教材的教师可以通过配套网站获得以下资源:
课件(PPT文件)。
练习题和编程练习题的答案,以及很多作业的说明文档。
样例试卷及答案要点。
补充的实验练习和编程练习,以及答案要点。
实验作业制作工具。教师可以根据需要将教材中提供的项目制作为实验作业。
要访问这些教师资源,请发送邮件到authors@buildingjavaprograms.com,或访问http://www.pearsonhighered.com/regesstepp/。要获得网站的密码或有其他问题请与培生教育出版集团的销售代理联系。
在线编程练习环境
本教材具有配套的在线编程练习和评估工具My ProgrammingLab,可以有效地帮助学生掌握程序设计的逻辑、语义、语法等内容。该编程环境会提供及时的、个性化的反馈信息,帮助基础薄弱的初学者提高程序设计能力。该环境按照教材内容的组织方式提供了上百道编程练习题,可以用于自我检测或布置作业。对学生来说,该环境可以自动检测代码中的语法和逻辑错误,并根据情况解释错误原因或给出相关提示。对教师来说,该环境会保存学生的练习情况,并据此进行综合评定。
请访问www.myprogramminglab.com使用该练习环境,并查阅更多反馈信息。
致谢
首先,我们要感谢很多参与此课程建设的同事、学生和助教,他们为本书的初稿提出了很多修改意见。没有他们的积极反馈就没有今天这本书。我们要特别感谢Hélène Martin,他仔细阅读了本书的初稿并指出了书中存在的一些错误。感谢Benson Limketkai花费大量时间对本书第2版的内容进行审校。
其次,我们要感谢参与本书修订工作的同行,正是在他们的帮助下,才有了现在这本教材,他们是:
Greg Anderson, 韦伯州立大学
Delroy A. Brinkerhoff,韦伯州立大学
Ed Brunjes,Miramar社团学院
Tom Capaul,东华盛顿大学
Tom Cortina,卡内基梅隆大学
Charles Dierbach, 陶森大学
H.E. Dunsmore,普度大学
Michael Eckmann, Skidmore 学院
Mary Anne Egan,Siena学院
Leonard J. Garrett, 天普大学
Ahmad Ghafarian,北佐治亚学院和州立大学
Raj Gill,Anne Arundel社团学院
Michael Hostetler,Park大学
David Hovemeyer,宾夕法尼亚约克学院
Chenglie Hu,卡罗学院
Philip Isenhour,弗吉尼亚工学院
Andree Jacobson,新墨西哥大学
David C. Kamper Sr. ,东北伊利诺伊大学
Simon G.M. Koo,圣地亚哥大学
Evan Korth,纽约大学
Joan Krone,Denison大学
John H.E.F Lasseter, Fairfield 大学
Eric Matson,莱特州立大学
Kathryn S. McKinley,得克萨斯大学奥斯汀分校
Jerry Mead,巴科内尔大学
George Medelinskas,北Essex社团学院
John Neitzke,Truman州立大学
Dale E. Parson, Kutztown 大学
Richard E. Pattis,卡内基梅隆大学
Frederick Pratter,东俄勒冈大学
Roger Priebe,得克萨斯大学奥斯汀分校
Dehu Qi,拉摩尔大学
John Rager, 阿姆斯特学院
Amala V. S. Rajan,Middlesex大学
Craig Reinhart, 加利福尼亚州路德大学
Mike Scott,得克萨斯大学奥斯汀分校
Tom Stokke,北达科塔大学
Leigh Ann Sudol,Fox Lane高等学院
Ronald F. Taylor,莱特州立大学
Andy Ray Terrel, 芝加哥大学
Scott Thede,DePauw大学
Megan Thomas,加州州立大学Stanislaus分校
Dwight Tuinstra, 纽约州立大学波茨坦分校
Jeannie Turner,Sayre学校
Tammy VanDeGrift,波特兰大学
Thomas John VanDrunen,Wheaton学院
Neal R. Wagner,得克萨斯大学圣安东尼奥分校
Jiangping Wang,韦伯斯特大学
Yang Wang,密苏里州立大学
Stephen Weiss,北卡罗莱娜大学坎斐尔分校
Laurie Werner,迈阿密大学
Dianna Xu,Bryn Mawr学院
Carol Zander,华盛顿大学Bothell分校
我们还要特别感谢华盛顿大学的助教Robert Baxter、Will Beebe、Whitaker Brand、Leslie Ferguson、Lisa Fiedler、Jason Ganzhorn、Brad Goring、Stefanie Hatcher、Jared Jones、Roy McElmurry、Aryan Naraghi、Allison Obourn、Coral Peterson、Jeff Prouty、Stephanie Smallman、Eric Spishak、Kimberly Todd和 Brian Walker。
最后,我们要感谢Addison-Wesley的工作人员,他们确保本书能够最终完成。Michelle Brown、Jeff Holcomb、Maurene Goo、Patty Mahtani、Nancy Kotary和Kathleen Kenny对本书的第1版做出了许多贡献。感谢Aptara公司的编辑与工作人员发现了书中的很多错误,提高了本书的质量,他们是Heather Sisan、Brian Baker、Brendan Short和Rachel Head。感谢Marilyn Lloyd 和 Chelsea Bell出色地完成了本书的项目经理和编辑助理工作。感谢本书第3版的产品项目经理Kayla Smith-Tarbox和编辑助理Jenah Blitz-Stoehr,感谢Aptara公司的Mohinder Singh和其他员工为第3版的出版所做出的贡献。最后要特别感谢本书的编辑Matt Goldstein从一开始就给予我们支持和信任。没有这些人的帮助就不会有这本书。
Stuart Reges
Marty Stepp

序言: 出版者的话
Building Java Programs: A Back to Basics Approach, Third Edition
文艺复兴以来,源远流长的科学精神和逐步形成的学术规范,使西方国家在自然科学的各个领域取得了垄断性的优势;也正是这样的优势,使美国在信息技术发展的六十多年间名家辈出、独领风骚。在商业化的进程中,美国的产业界与教育界越来越紧密地结合,计算机学科中的许多泰山北斗同时身处科研和教学的最前线,由此而产生的经典科学著作,不仅擘划了研究的范畴,还揭示了学术的源变,既遵循学术规范,又自有学者个性,其价值并不会因年月的流逝而减退。
近年,在全球信息化大潮的推动下,我国的计算机产业发展迅猛,对专业人才的需求日益迫切。这对计算机教育界和出版界都既是机遇,也是挑战;而专业教材的建设在教育战略上显得举足轻重。在我国信息技术发展时间较短的现状下,美国等发达国家在其计算机科学发展的几十年间积淀和发展的经典教材仍有许多值得借鉴之处。因此,引进一批国外优秀计算机教材将对我国计算机教育事业的发展起到积极的推动作用,也是与世界接轨、建设真正的世界一流大学的必由之路。
机械工业出版社华章公司较早意识到“出版要为教育服务”。自1998 年开始,我们就将工作重点放在了遴选、移译国外优秀教材上。经过多年的不懈努力,我们与Pearson,McGraw-Hill,Elsevier,MIT,John Wiley & Sons,Cengage 等世界著名出版公司建立了良好的合作关系, 从他们现有的数百种教材中甄选出Andrew S. Tanenbaum,Bjarne Stroustrup,Brain W. Kernighan,Dennis Ritchie,Jim Gray,Afred V. Aho,John E. Hopcroft,Jeffrey D. Ullman,Abraham Silberschatz,William Stallings,Donald E. Knuth,John L. Hennessy,Larry L. Peterson 等大师名家的一批经典作品,以“计算机科学丛书”为总称出版,供读者学习、研究及珍藏。大理石纹理的封面,也正体现了这套丛书的品位和格调。
“计算机科学丛书”的出版工作得到了国内外学者的鼎力相助,国内的专家不仅提供了中肯的选题指导,还不辞劳苦地担任了翻译和审校的工作;而原书的作者也相当关注其作品在中国的传播,有的还专门为其书的中译本作序。迄今,“计算机科学丛书”已经出版了近两百个品种,这些书籍在读者中树立了良好的口碑,并被许多高校采用为正式教材和参考书籍。其影印版“经典原版书库”作为姊妹篇也被越来越多实施双语教学的学校所采用。
权威的作者、经典的教材、一流的译者、严格的审校、精细的编辑,这些因素使我们的图书有了质量的保证。随着计算机科学与技术专业学科建设的不断完善和教材改革的逐渐深化,教育界对国外计算机教材的需求和应用都将步入一个新的阶段,我们的目标是尽善尽美,而反馈的意见正是我们达到这一终极目标的重要帮助。华章公司欢迎老师和读者对我们的工作提出建议或给予指正,我们的联系方法如下:
华章网站:www.hzbook.com
电子邮件:hzjsj@hzbook.com
联系电话:(010)88379604
联系地址:北京市西城区百万庄南街1号
邮政编码:100037

媒体评论: ★我喜欢作者类似于讲故事一样的写作风格,对初学者非常适合。书中逐步引出新的概念,内容逻辑合理,易于学习掌握。  ——Chenglie Hu, 卡罗尔学院
★作者给出了很多存在错误的程序来说明常见问题。我喜欢这样,因为大多数教材都只会给出“经典的”正确代码。  ——Tammy VanDeGrift, 波特兰大学