Java程序设计与问题求解(原书第8版)

更多详情

内容简介: 本书不仅介绍Java语言的基础语法知识,还通过大量案例研究、编程示例,着重讲授问题求解和编程技术,如程序控制流(分支和循环)、定义类与方法、异常处理等。

目录: 出版者的话
译者序
前言
致谢
依赖关系图
第1章 计算机与Java引论 1
1.1 计算机基础 1
1.1.1 硬件与内存 2
1.1.2 程序 3
1.1.3 编程语言、编译器和解释器 4
1.1.4 Java字节码 5
1.1.5 类加载器 7
1.2 浅尝Java 8
1.2.1 Java语言的历史 8
1.2.2 应用程序与小应用程序 9
1.2.3 第一个Java应用程序 9
1.2.4 编写、编译和运行Java程序 13
1.3 编程基础 14
1.3.1 面向对象编程 14
1.3.2 算法 17
1.3.3 测试与调试 18
1.3.4 软件复用 19
1.4 图形化编程补充读物 20
1.4.1 一个JavaFX应用程序样例 21
1.4.2 图形的尺寸和位置 23
1.4.3 绘制椭圆和圆 24
1.4.4 绘制弧 25
本章小结 27
练习 28
实践程序 29
编程项目 29
自测问题答案 30
第2章 基本的计算 33
2.1 变量和表达式 33
2.1.1 变量 33
2.1.2 数据类型 35
2.1.3 Java标识符 37
2.1.4 赋值语句 38
2.1.5 简单输入 40
2.1.6 简单屏幕输出 41
2.1.7 常量 42
2.1.8 具名常量 43
2.1.9 赋值兼容性 44
2.1.10 类型强制转换 45
2.1.11 算术运算 48
2.1.12 括号和优先级规则 50
2.1.13 特殊赋值操作符 51
2.1.14 案例研究:售货机找零 52
2.1.15 递增和递减操作符 56
2.1.16 更多有关递增和递减操作符的讨论 57
2.2 String类 57
2.2.1 字符串常量和变量 58
2.2.2 字符串连接 58
2.2.3 字符串方法 59
2.2.4 字符串处理 62
2.2.5 转义字符 63
2.2.6 Unicode字符集 64
2.3 键盘和屏幕I/O 65
2.3.1 屏幕输出 65
2.3.2 键盘输入 67
2.3.3 其他输入界定符(选修) 72
2.3.4 使用printf的格式化输出(选修) 73
2.4 文档和样式 75
2.4.1 有意义的变量名 75
2.4.2 注释 75
2.4.3 缩进 77
2.4.4 使用具名常量 78
2.5 图形化编程补充读物 80
2.5.1 将样式规则应用于JavaFX应用程序 80
2.5.2 介绍JOptionPane类 81
2.5.3 将输入作为其他数字类型读取 87
2.5.4 编程示例:具有窗口化I/O的找零程序 88
本章小结 90
练习 90
实践程序 92
编程项目 93
自测问题答案 94
第3章 流控制—分支 98
3.1 if-else语句 98
3.1.1 基本的if-else语句 98
3.1.2 布尔表达式 104
3.1.3 比较字符串 107
3.1.4 嵌套的if-else语句 111
3.1.5 多重分支的if-else语句 112
3.1.6 编程示例:给出字母等第 114
3.1.7 案例研究:体重指数 116
3.1.8 条件操作符(选修) 118
3.1.9 exit方法 119
3.2 boolean类型 120
3.2.1 布尔变量 120
3.2.2 优先级规则 121
3.2.3 布尔值的输入和输出 123
3.3 switch语句 124
3.4 图形化编程补充读物 130
3.4.1 指定绘图颜色 131
3.4.2 Yes或No问题的对话框 134
本章小结 135
练习 136
实践程序 137
编程项目 138
自测问题答案 140
第4章 流控制—循环 142
4.1 Java循环语句 142
4.1.1 while语句 143
4.1.2 do-while语句 146
4.1.3 编程示例:臭虫侵扰 149
4.1.4 编程示例:嵌套循环 154
4.1.5 for语句 155
4.1.6 在for语句中声明变量 160
4.1.7 在for语句中使用逗号(选修) 160
4.1.8 for-each语句 162
4.2 用循环编程 162
4.2.1 循环体 162
4.2.2 初始化语句 163
4.2.3 控制循环迭代次数 164
4.2.4 案例研究:使用布尔变量来终止循环 166
4.2.5 编程示例:消费热潮 168
4.2.6 循环中的break语句和continue语句(选修) 170
4.2.7 循环缺陷 172
4.2.8 跟踪变量 174
4.2.9 断言检查 175
4.3 图形化编程补充读物 177
4.3.1 编程示例:一个包含多张脸的JavaFX应用程序 177
4.3.2 绘制文本 181
本章小结 182
练习 182
实践程序 184
编程项目 185
自测问题答案 188
第5章 定义类和方法 193
5.1 类和方法定义 193
5.1.1 类文件和单独编译 195
5.1.2 编程示例:实现Dog类 195
5.1.3 实例变量 196
5.1.4 方法 198
5.1.5 定义void方法 200
5.1.6 定义有返回值的方法 201
5.1.7 编程示例:实现Species类的第一次尝试 205
5.1.8 关键词this 208
5.1.9 局部变量 209
5.1.10 块 211
5.1.11 基本类型参数 212
5.2 信息隐藏和封装 216
5.2.1 信息隐藏 217
5.2.2 前置条件和后置条件注释 217
5.2.3 public和private修饰符 218
5.2.4 编程示例:为什么实例变量应该是私有的 220
5.2.5 编程示例:矩形类的另一种实现 221
5.2.6 访问器方法和修改器方法 223
5.2.7 编程示例:Purchase类 225
5.2.8 调用方法的方法 228
5.2.9 封装 233
5.2.10 使用javadoc自动归档 235
5.2.11 UML类图 235
5.3 对象和引用 236
5.3.1 类类型变量 237
5.3.2 定义类的equals方法 242
5.3.3 编程示例:Species类 244
5.3.4 布尔值方法 246
5.3.5 案例研究:单元测试 247
5.3.6 类类型参数 249
5.3.7 编程示例:类类型参数与基本类型参数 252
5.4 图形化编程补充读物 255
5.4.1 GraphicsContext类 255
5.4.2 编程示例:用辅助方法绘制多张脸 257
5.4.3 向JavaFX应用程序添加标签 260
本章小结 261
练习 262
实践程序 264
编程项目 265
自测问题答案 269
第6章 对象和方法进阶 274
6.1 构造器 275
6.1.1 定义构造器 275
6.1.2 在构造器中调用方法 281
6.1.3 在构造器中调用其他构造器(选修) 284
6.2 静态变量和静态方法 285
6.2.1 静态变量 285
6.2.2 静态方法 286
6.2.3 将main方法中的任务划分为子任务 291
6.2.4 在类中添加main方法 293
6.2.5 Math类 294
6.2.6 包装器类 296
6.3 编写方法 300
6.3.1 案例研究:格式化输出 300
6.3.2 分解 305
6.3.3 解决编译器问题 305
6.3.4 测试方法 307
6.4 重载 309
6.4.1 重载基础知识 309
6.4.2 重载和自动类型转换 311
6.4.3 重载和返回类型 313
6.4.4 编程示例:Money类 315
6.5 再探信息隐藏 320
6.6 作为类的枚举 323
6.7 包 325
6.7.1 包和导入机制 325
6.7.2 包名和目录 326
6.7.3 名字冲突 328
6.8 图形化编程补充读物 329
6.8.1 添加按钮 329
6.8.2 添加图标 330
本章小结 332
练习 332
实践程序 334
编程项目 335
自测问题答案 338
第7章 数组 343
7.1 数组基础 344
7.1.1 创建和访问数组 344
7.1.2 数组详情 346
7.1.3 实例变量length 349
7.1.4 进一步了解数组索引 351
7.1.5 初始化数组 354
7.2 类和方法中的数组 355
7.2.1 案例研究:销售报表 355
7.2.2 索引变量作为方法引元 362
7.2.3 整个数组作为方法引元 363
7.2.4 main方法的引元 365
7.2.5 数组赋值和判等 365
7.2.6 返回数组的方法 368
7.3 用数组和类编程 371
7.3.1 编程示例:专用列表类 371
7.3.2 部分填充的数组 377
7.4 数组排序和搜索 378
7.4.1 选择排序 378
7.4.2 其他排序算法 382
7.4.3 在数组中搜索 383
7.5 多维数组 383
7.5.1 多维数组基础知识 384
7.5.2 多维数组作为参数和返回值 386
7.5.3 多维数组的Java表示形式 388
7.5.4 参差数组(选修) 389
7.5.5 编程示例:工时记录 390
7.6 图形化编程补充读物 395
7.6.1 布局面板 395
7.6.2 文本域、文本框和组合布局 401
7.6.3 绘制多边形 404
本章小结 407
练习 407
实践程序 411
编程项目 412
自测问题答案 416
第8章 继承、多态和接口 422
8.1 继承基础 422
8.1.1 派生类 423
8.1.2 覆盖方法定义 426
8.1.3 覆盖与重载 427
8.1.4 final修饰符 427
8.1.5 基类的私有实例变量与私有方法 428
8.1.6 UML继承图 429
8.2 运用继承编程 431
8.2.1 派生类中的构造器 431
8.2.2 再论this方法 432
8.2.3 调用被覆盖的方法 433
8.2.4 编程示例:派生类的派生类 434
8.2.5 在Undergraduate中定义equals方法的另一种方式 437
8.2.6 类型兼容性 437
8.2.7 Object类 441
8.2.8 更好的equals方法 442
8.3 多态 444
8.3.1 动态绑定和继承 444
8.3.2 动态绑定toString 447
8.4 接口与抽象类 448
8.4.1 类接口 448
8.4.2 Java接口 449
8.4.3 实现接口 450
8.4.4 作为类型的接口 452
8.4.5 扩展接口 454
8.4.6 案例研究:字符图形 455
8.4.7 案例研究:Comparable接口 464
8.4.8 抽象类 468
8.5 图形化编程补充读物 469
8.5.1 事件驱动编程 470
8.5.2 在单独的类中处理事件 471
8.5.3 在主GUI应用类中处理事件 473
8.5.4 在匿名内部类中处理事件 475
8.5.5 编程示例:添加数字 477
本章小结 479
练习 479
实践程序 480
编程项目 481
自测问题答案 483
第9章 异常处理 486
9.1 基本的异常处理 486
9.1.1 Java中的异常 487
9.1.2 预定义的异常类 495
9.2 定义自己的异常类 496
9.3 更多有关异常类的知识 503
9.3.1 声明异常(传递责任) 504
9.3.2 异常的种类 506
9.3.3 错误 507
9.3.4 多个抛出和捕获 508
9.3.5 finally块 513
9.3.6 重新抛出异常(选修) 513
9.3.7 案例研究:面向命令行的计算器 514
9.4 图形化编程补充读物 523
9.4.1 更多的用户界面控件和形状 523
9.4.2 图像和形状 526
9.4.3 处理鼠标事件 527
9.4.4 Timeline类 530
本章小结 532
练习 533
实践程序 534
编程项目 536
自测问题答案 538
第10章 流、文件I/O和网络 542
10.1 流和文件I/O概览 542
10.1.1 流的概念 543
10.1.2 为什么用文件来进行输入/输出 543
10.1.3 文本文件和二进制文件 543
10.2 文本文件I/O 545
10.2.1 创建文本文件 545
10.2.2 在文本文件中追加内容 550
10.2.3 从文本文件中读取内容 551
10.3 适用于所有文件的技术 553
10.3.1 File类 553
10.3.2 编程示例:从键盘读取文件名 554
10.3.3 使用路径名 555
10.3.4 File类的方法 556
10.3.5 定义方法来打开流 558
10.3.6 案例研究:处理由逗号分隔的数值文件 559
10.4 基本的二进制文件I/O 561
10.4.1 创建二进制文件 561
10.4.2 向二进制文件中写入基本类型值 563
10.4.3 向二进制文件中写入字符串 565
10.4.4 有关writeUTF的一些细节 566
10.4.5 从二进制文件中读取内容 566
10.4.6 EOFException类 570
10.4.7 编程示例:处理二进制数据文件 572
10.5 包含对象和数组的二进制文件I/O 576
10.5.1 包含类的对象的二进制文件I/O 576
10.5.2 序列化的一些细节 579
10.5.3 二进制文件中的数组对象 580
10.6 使用流的网络通信 582
10.7 图形化编程补充读物 586
本章小结 591
练习 591
实践程序 593
编程项目 594
自测问题答案 597
第11章 递归 601
11.1 递归基础 601
11.1.1 案例研究:数字位显示成单词 603
11.1.2 递归如何工作 607
11.1.3 无限递归 610
11.1.4 递归方法与迭代方法 612
11.1.5 有返回值的递归方法 614
11.2 运用递归编程 617
11.2.1 编程示例:要求用户输入必须正确 617
11.2.2 案例研究:二分搜索 618
11.2.3 编程示例:归并排序—一种递归排序方法 624
11.3 图形化编程补充读物 627
本章小结 630
练习 630
实践程序 632
编程项目 632
自测问题答案 636
第12章 动态数据结构和泛型 639
12.1 基于数组的数据结构 640
12.1.1 ArrayList类 640
12.1.2 创建ArrayList的实例 641
12.1.3 使用ArrayList的方法 642
12.1.4 编程示例:待办事项列表 645
12.1.5 参数化类和泛化数据类型 647
12.2 Java集合框架 648
12.2.1 Collection接口 648
12.2.2 HashSet类 649
12.2.3 Map接口 650
12.2.4 HashMap类 650
12.3 链式数据结构 653
12.3.1 LinkedList类 653
12.3.2 链表 653
12.3.3 实现链表的操作 655
12.3.4 隐私泄露 660
12.3.5 内部类 661
12.3.6 节点内部类 662
12.3.7 迭代器 662
12.3.8 Java的Iterator接口 670
12.3.9 链表的异常处理 671
12.3.10 链表的变体 673
12.3.11 其他链式数据结构 675
12.4 泛型 675
12.4.1 基础知识 675
12.4.2 编程示例:一个泛化的链表 678
12.5 图形化编程补充读物 682
12.5.1 用场景构建器构建JavaFX应用程序 682
12.5.2 何去何从 686
本章小结 686
练习 687
实践程序 689
编程项目 690
自测问题答案 693
附录A 获取Java 696
附录B 运行Applet 697
附录C protected和包修饰符 698
附录D DecimalFormat类 699
附录E javadoc 702
附录F C++和Java之间的区别 704
附录G Unicode字符编码 707
附录H Java 8函数式编程简介 708
附录I Iterator接口 712
附录J 克隆 713
附录K Java保留关键词 716
索引一


前言: 致教师
欢迎阅读《Java程序设计与问题求解(原书第8版)》。本书是按照编程和计算机科学的第一门课程设计的,涵盖了编程技术和Java编程语言的基础知识,适合短至半学期,长至一学年的课程。本书不要求读者具有任何编程经验,除了高中代数之外,也不要求读者具有任何其他数学知识。对于已经上过其他编程课的学生,教师也可以用本书教授Java课程,在这种情况下,书中前几章可以布置成课外读物。
本版内容更新
下面列出了第8版与第7版之间的差异:
纠正了错误,并且改善了可读性。
Java Applet的内容从纸质版的书中移除了,但是其仍可在线获得。
除了JOptionPane,图形化编程补充读物已经全部从Swing改为JavaFX,介绍了JavaFX绘制、布局、事件处理和常用的UI控件。有关Swing的内容仍可在线获得。
使用事件处理器的事件驱动编程的示例是在主应用类中作为单独的类的匿名内部类,并且使用了Lambda函数。
介绍了时间线和场景构建器。
10个新的/修订过的编程项目。
使用的Java版本
本书所有的代码都用Oracle Java SE 8开发工具包(JDK)进行过测试。任何导入的类都是标准类,并且都在作为Java组成部分的Java类库中,不需要任何其他的类或特殊的类库。
灵活的章节顺序
如果你是一位教师,那么本书可以适应你的教学,而不是让你适应本书的结构。本书并没有严格地规定你的课程必须覆盖的主题之间的顺序,可以很容易地改变教授的章节顺序。重新安排这些章节所涉及的细节在前言之后的依赖关系图中进行解释,更多的细节在每一章开头部分的“先修条件”中进行描述。
提前介绍图形化编程
每一章都是以图形化编程补充读物结尾的。这使得你可以选择在课程一开始就教授图形化编程和GUI编程。图形化编程补充读物的各个小节强调了使用JavaFX构建的GUI。在第8章之后,你可以转而教授有关使用Swing进行GUI编程的补充章节第13~15章,现在这几章内容都在本书的网站上。另一种方案是,你可以继续教授到第10章,中间混杂着图形化编程和更传统的编程。对于教师来说,如果倾向于推迟有关图形化编程的教学,那么可以推迟或跳过有关图形化编程补充读物的小节。
涵盖问题求解和编程技术
本书的设计初衷是教会学生基本的问题求解和编程技术,而不仅仅是一本有关Java语法的书。书中包含了大量的案例研究、编程示例和编程窍门。另外,许多小节还解释了问题求解和编程技术的重要性,例如循环设计技术、调试技术、样式技术、抽象数据类型和基础的面向对象编程技术,包括UML、事件驱动编程和使用类型参数的泛型编程。
提前介绍类
任何教授Java的课程都必须尽早讲解类,因为Java中所有事物都是类。Java程序就是类,字符串的数据类型也是类,甚至判等操作符(==)的行为也取决于它比较的是类的对象还是简单的数据项。类无法回避,要是能回避也肯定是用了那些长得离谱且异常复杂的“魔力方案”。本书对类的介绍相当早。在第1章和第2章就已经点出了类的使用,第5章讨论了如何定义类。关于类的所有基础信息(包括继承在内)在第8章的末尾进行了阐述(尽管你可以忽略第7章)。但是,有些关于类的主题(包括继承在内)可以推迟到课程后期再开始介绍。
尽管本书尽早地介绍了类,但是也没有忽略传统的编程技术,例如自顶向下设计和循环设计技术。这些较老的主题可能显得不再那么光彩夺目,但是它们是所有初学者都需要了解的知识。
泛型编程
在讨论第12章的列表时,会向学生介绍类型参数。通过讲解ArrayList类的示例来介绍如何使用具有类型参数的类。然后,会向学生展示如何定义他们自己的包含类型参数的类。
语言细节和样例代码
本书教授的是编程技术,而不只是Java语言。但是,无论是学生还是教师,都不会只满足于一门不教授编程语言的介绍性编程课程。在为学生详细阐述Java语言的细节后,才能使其聚焦在更重大的主题上。为此,本书给出了对Java语言特性的完整解释,以及许多样例代码。程序是完整呈现的,包含了样例输入和输出。在许多情况下,除了书中完整的示例,在互联网上还可以获得其他完整的示例。
自测问题
自测问题贯穿于本书的每一章,这些问题难度不一,有些题的答案只需要一个词,而有些题却需要读者编写不那么容易完成的完整程序。在每一章的末尾都给出了所有自测问题的完整答案,包括那些需要完整程序的问题。
练习和编程项目
在每一章的末尾呈现的是全新的练习。因为只有教师才有权限获得答案,所以这些练习非常适合留作作业,有些甚至可以扩展成编程项目。但是,每一章也包含其他的编程项目,其中有些是这一版中新添加的。
支持材料
下面的材料仅供教师使用,可以从网站www.personhighered.com/src获得:
大部分练习和编程项目的解决方案。
PowerPoint幻灯片。
实验手册与相关的代码。
联系我们
我们任何时刻都欢迎你提出评论、建议、问题和纠错。请发送电子邮件到savitch.progra-
mming.java@gmail.com。
致学生
本书旨在教授Java编程语言,更重要的是,教授基本的编程技术。本书不要求你之前具有任何编程经验,除了高中代数之外,也不要求你具有任何其他数学知识。但是,为了充分汲取本书的知识,你应该在计算机上安装好Java,以便实践书中给出的示例和技术。最好是安装最新版本的Java。
如果你有编程经验
你不需要具有任何编程经验就可以阅读本书,因为本书是为初学者设计的。如果你具有某种其他编程语言的编程经验,那么千万不要以为Java与你之前使用的编程语言一样。所有语言都不相同,而且即使是微小的区别,也足以给你带来问题。因此,请浏览本书的前四章,至少要阅读“回顾”部分。等到你阅读第5章时,最好是完整地阅读这一章。
如果你之前用C或C++编过程,那么迁移到Java会让你痛并快乐着。乍一看,Java可能与C或C++几乎完全相同,但是,Java与这些语言差异巨大,你需要意识到这些差异的存在。附录F对Java和C++进行了比较,这有助于你看清楚这些差异到底是什么。
获得Java的副本
附录A提供了下载Java编译器和编程环境的网站链接。对于初学者,我们推荐使用Oracle的Java JDK作为你的Java编译器和相关的软件,并使用TextPad或DrJava作为编写Java代码的简单编辑器环境。当下载Java JDK时,要确保获取最新的版本。
辅助学习工具
每一章都包含了下列内容来帮助你学习相关的内容:
开篇概览,包括本章目标和先修条件,以及一两段对所学内容的简介。
“回顾”部分简洁地总结了Java语法的主要方面和其他重要的概念。
“常见问题”部分回答了其他学生问过的问题。
“牢记”部分强调了你应该牢记的重要思想。
“编程窍门”部分给出了能够让你提升编程技能的方法。
“疑难杂症”部分指出了你在编程时可能会犯但是应该避免的错误。
“自测问题”部分测试你各个方面的知识,并在每一章章末给出了答案。实践所学知识的最佳方式之一,就是在查看答案之前先完成这些自测问题。
每一章末尾都会对重要概念进行总结。
本书也是一本参考书
除了将本书用作教科书外,你还可以将本书用作参考书。当需要检查你已经忘记了的知识点,或者你听别人提到了但是自己还没学过的知识点时,只需查看本书的索引。许多索引项都给出了“回顾”部分的页码,翻到那一页,它包含了一个简短的强调项,你所关注的话题的要点将一览无余。通过这种方式,不但可以查看Java语言的细节,还可以查看编程技术的细节。
每一章的“回顾”部分都提供了对这一章要点的扼要总结。同时,在每一章的末尾还包含对重要概念的总结。你可以用这些内容来复习每一章,或者查看Java语言的细节。

媒体评论: 本书涵盖了Java语言的基础特性和程序设计的基本思想,以程序设计思想的讲解为主轴,提供了大量的案例研究、编程示例和编程窍门,同时给出了对Java语言特性的完整解释,将问题求解的技能、编程技巧和良好的编程实践融会其中,使得读者不但能够了解Java语言的使用方法,还能掌握问题求解和编程技术。
本书内容:
·类、方法、对象、数组、继承和异常处理等Java语言的基础知识和编程技巧。
·有关JavaFX的绘制、布局、事件处理和常用的UI控件。
·使用事件处理器、Lambda函数的函数式编程技巧。
·如何使用时间线和场景构建器。
·流、文件I/O和网络、递归、动态数据结构和泛型等相关知识和编程技巧。