第一部分 基础知识 2
第1章 引言 2
1.1 计算机程序 2
1.2 计算机剖析 3
计算与社会1.1 计算机无处不在 4
1.3 Java编程语言 5
1.4 熟悉你的编程环境 7
编程技巧1.1 备份副本 10
1.5 分析你的第一个程序 10
常见错误1.1 缺少分号 13
1.6 错误 14
常见错误1.2 单词拼写错误 15
1.7 解决问题:算法设计 15
1.7.1 算法概念 16
1.7.2 解决一个投资问题的算法 16
1.7.3 伪代码 17
1.7.4 从算法到程序 18
操作指南1.1 用伪代码描述算法 19
实用示例1.1 编写一个铺地板瓷砖的算法 21
第2章 使用对象 31
2.1 对象和类 31
2.1.1 使用对象 32
2.1.2 类 32
2.2 变量 33
2.2.1 变量声明 33
2.2.2 类型 35
2.2.3 名 35
2.2.4 注释 36
2.2.5 赋值 37
常见错误2.1 使用未声明或未初始化的变量 39
常见错误2.2 混淆变量声明和赋值语句 39
编程技巧2.1 选择描述性的变量名 39
2.3 调用方法 40
2.3.1 类的公共接口 40
2.3.2 方法参数 40
2.3.3 返回值 42
2.3.4 方法声明 43
编程技巧2.2 通过尝试来学习 44
2.4 构造对象 45
常见错误2.3 试图如调用方法一样调用构造函数 47
2.5 访问器和修改器方法 47
2.6 API文档 48
2.6.1 浏览API文档 49
2.6.2 包 50
编程技巧2.3 不要强记,使用在线帮助 51
2.7 实现一个测试程序 51
专题2.1 在交互环境中测试类 51
实用示例2.1 你活了多少天? 53
实用示例2.2 处理图片 54
2.8 对象引用 54
计算与社会2.1 计算机垄断 57
2.9 图形应用 57
2.9.1 帧窗口 58
2.9.2 在组件上绘制 59
2.9.3 在帧窗口中显示组件 61
2.10 椭圆、线、文本和颜色 62
2.10.1 椭圆和圆 63
2.10.2 线 63
2.10.3 绘制文本 64
2.10.4 颜色 64
第3章 实现类 78
3.1 实例变量和封装 78
3.1.1 实例变量 78
3.1.2 Counter类的方法 80
3.1.3 封装 80
3.2 指定类的公共接口 82
3.2.1 指定方法 82
3.2.2 指定构造函数 83
3.2.3 使用公共接口 85
3.2.4 为公共接口加注释 85
常见错误3.1 将构造函数声明为void 88
编程技巧3.1 j avadoc工具 88
3.3 提供类实现 89
3.3.1 提供实例变量 89
3.3.2 提供构造函数 89
3.3.3 提供方法 91
常见错误3.2 忽略参数变量 93
操作指南3.1 实现一个类 94
实用示例3.1 建立一个简单的菜单 97
3.4 单元测试 98
计算与社会3.1 电子投票机 99
3.5 解决问题:跟踪对象 100
3.6 局部变量 102
常见错误3.3 在局部变量中重复实例变量 103
常见错误3.4 提供不必要的实例变量 104
常见错误3.5 忘记在构造函数中初始化对象引用 105
3.7 thi s引用 105
专题3.1 从一个构造函数调用另一个构造函数 108
3.8 图形类 108
操作指南3.2 绘制图形 112
第4章 基本数据类型 127
4.1 数字 127
4.1.1 数字类型 127
4.1.2 常量 129
专题4.1 大数 134
编程技巧4.1 不要使用魔法数 134
4.2 算术运算 135
4.2.1 算术操作符 135
4.2.2 自增和自减 135
4.2.3 整除和求余 135
4.2.4 幂和平方根 136
4.2.5 浮点数转换为整数 138
常见错误4.1 意外的整除 139
常见错误4.2 小括号不匹配 140
编程技巧4.2 表达式中的空格 140
Java 8说明4.1 避免负余数 140
专题4.2 结合赋值和算术运算 141
专题4.3 实例方法和静态方法 141
计算与社会4.1 奔腾处理器的浮点数bug 141
4.3 输入和输出 143
4.3.1 读取输入 143
4.3.2 格式化输出 144
操作指南4.1 完成计算 147
实用示例4.1 计算金字塔的体积和表面积 150
4.4 解决问题:先手动完成 150
实用示例4.2 计算旅行时间 152
4.5 字符串 152
4.5.1 String类型 152
4.5.2 字符串连接 153
4.5.3 字符串输入 154
4.5.4 转义序列 154
4.5.5 字符串和字符 154
4.5.6 子串 155
编程技巧4.3 阅读异常报告 157
专题4.4 使用对话框提供输入和输出 158
计算与社会4.2 国际字母表和Unicode 158
第5章 判断 174
5.1 if语句 174
编程技巧5.1 大括号布局 177
编程技巧5.2 总是使用大括号 178
常见错误5.1 if条件后有分号 178
编程技巧5.3 制表符 178
专题5.1 条件操作符 179
编程技巧5.4 避免不同分支中重复 179
5.2 比较值 180
5.2.1 关系操作符 180
5.2.2 比较浮点数 181
5.2.3 比较字符串 182
5.2.4 比较对象 183
5.2.5 测试null 184
常见错误5.2 使用==比较字符串 185
操作指南5.1 实现一个if语句 186
实用示例5.1 抽取中间字符 188
计算与社会5.1 丹佛机场的行李处理系统 188
5.3 多个候选条件 189
专题5.2 switch语句 192
5.4 嵌套分支 193
编程技巧5.5 手动跟踪 196
常见错误5.3 空悬else问题 197
专题5.3 块作用域 198
专题5.4 枚举类型 199
5.5 解决问题:流程图 200
5.6 解决问题:选择测试用例 202
编程技巧5.6 制订计划并为意料外的问题留出时间 204
专题5.5 记录日志 205
5.7 布尔变量和操作符 205
常见错误5.4 结合多个关系操作符 208
常见错误5.5 混淆&&和||条件 209
专题5.6 布尔操作符的短路计算 209
专题5.7 德·摩根定律 210
5.8 应用:输入验证 211
计算与社会5.2 人工智能 213
第6章 循环 233
6.1 while循环 233
常见错误6.1 不要想“我们到了吗?” 239
常见错误6.2 无限循环 239
常见错误6.3 差一错误 240
6.2 解决问题:手动跟踪 241
计算与社会6.1 数字盗版 244
6.3 for循环 245
编程技巧6.1 按其预期用途使用for循环 250
编程技巧6.2 选择满足任务要求的循环边界 251
编程技巧6.3 统计迭代 251
专题6.1 for循环首部中声明的变量 252
6.4 do循环 253
编程技巧6.4 画出循环的流程图 254
6.5 应用:处理卫哨值 254
专题6.2 输入和输出重定向 257
专题6.3 “半循环”问题 258
专题6.4 break和continue语句 259
6.6 解决问题:故事板 260
6.7 常用循环算法 263
6.7.1 求和与平均值 263
6.7.2 匹配计数 263
6.7.3 找到第一个匹配 264
6.7.4 提示用户输入,直到找到匹配 265
6.7.5 最大值和最小值 265
6.7.6 比较相邻值 265
操作指南6.1 写一个循环 267
实用示例6.1 信用卡处理 270
6.8 嵌套循环 270
实用示例6.2 处理图像中的像素 273
6.9 应用:随机数和仿真 273
6.9.1 生成随机数 273
6.9.2 蒙特卡罗方法 275
6.10 使用调试器 277
操作指南6.2 调试 279
实用示例6.3 示例调试会话 281
计算与社会6.2 第一个bug 281
第7章 数组和数组列表 303
7.1 数组 303
7.1.1 声明和使用数组 303
7.1.2 数组引用 306
7.1.3 利用方法使用数组 307
7.1.4 部分填充的数组 307
常见错误7.1 边界错误 309
常见错误7.2 未初始化和未填充的数组 309
编程技巧7.1 对相关数据项的序列使用数组 309
编程技巧7.2 将并行数组重组为对象数组 310
专题7.1 参数数目可变的方法 311
计算与社会7.1 计算机病毒 311
7.2 增强的for循环 312
7.3 常用数组算法 314
7.3.1 填充 314
7.3.2 求和与平均值 314
7.3.3 最大值和最小值 314
7.3.4 元素分隔符 315
7.3.5 线性查找 315
7.3.6 删除一个元素 316
7.3.7 插入一个元素 316
7.3.8 交换元素 317
7.3.9 复制数组 318
7.3.1 0读取输入 319
常见错误7.3 低估数据集的大小 322
专题7.2 利用Java库排序 322
7.4 解决问题:调整算法 323
操作指南7.1 处理数组 325
实用示例7.1 掷骰子 327
7.5 解决问题:通过管理实体对象发现算法 327
7.6 二维数组 330
7.6.1 声明二维数组 331
7.6.2 访问元素 332
7.6.3 定位相邻元素 333
7.6.4 访问行和列 333
实用示例7.2 世界入口表 336
专题7.3 行长度可变的二维数组 336
专题7.4 多维数组 337
7.7 数组列表 338
7.7.1 声明和使用数组列表 338
7.7.2 对数组列表使用增强的for循环 340
7.7.3 复制数组列表 341
7.7.4 包装器和自动装箱 341
7.7.5 对数组列表使用数组算法 342
7.7.6 在数组列表中存储输入值 343
7.7.7 删除匹配元素 343
7.7.8 在数组列表和数组间选择 344
常见错误7.4 长度和大小 346
专题7.5 钻石语法 346
7.8 回归测试 346
编程技巧7.3 批文件和Shell脚本 348
计算与社会7.2 Therac-25事件 349
第二部分 面向对象设计 372
第8章 设计类 372
8.1 发现类 372
8.2 设计好方法 373
8.2.1 提供一个一致的公共接口 373
8.2.2 最小化依赖 374
8.2.3 区分访问器和修改器 375
8.2.4 最小化副作用 376
编程技巧8.1 一致性 377
专题8.1 按值调用和按引用调用 378
8.3 解决问题:对象数据模式 382
8.3.1 管理总数 382
8.3.2 统计事件 382
8.3.3 收集值 383
8.3.4 管理对象的属性 384
8.3.5 为有不同状态的对象建模 384
8.3.6 描述对象的位置 385
8.4 静态变量和方法 386
编程技巧8.2 尽量减少使用静态方法 389
常见错误8.1 试图在静态方法中访问实例变量 389
专题8.2 初始化实例和静态变量的其他形式 390
专题8.3 静态导入 390
8.5 解决问题:先解决比较简单的问题 391
8.6 包 395
8.6.1 将相关的类组织为包 395
8.6.2 导入包 396
8.6.3 包名 396
8.6.4 包和源文件 397
常见错误8.2 混淆点号 398
专题8.4 包访问 398
操作指南8.1 使用包编程 399
8.7 单元测试框架 400
计算与社会8.1 个人计算 402
第9章 继承 416
9.1 继承层次体系 416
编程技巧9.1 单个类表示值的差异,继承表示行为的差异 419
9.2 实现子类 420
常见错误9.1 从超类复制实例变量 423
常见错误9.2 混淆超类和子类 424
9.3 覆盖方法 424
常见错误9.3 意外重载 428
常见错误9.4 调用超类方法时忘记使用super 429
专题9.1 调用超类构造函数 429
9.4 多态 430
专题9.2 动态方法查找和隐式参数 434
专题9.3 抽象类 434
专题9.4 最终方法和最终类 436
专题9.5 保护访问 436
操作指南9.1 开发一个继承层次体系 437
实用示例9.1 实现一个员工层次结构完成工资处理 442
9.5 Object:所有类的超类 442
9.5.1 覆盖tostring方法 442
9.5.2 equals方法 443
9.5.3 i nstanceof操作符 444
常见错误9.5 不要使用类型测试 446
专题9.6 继承和tostring方法 447
专题9.7 继承和equals方法 447
计算与社会9.1 谁在控制互联网? 448
第10章 接口 457
10.1 使用接口实现算法重用 457
10.1.1 发现接口类型 458
10.1.2 声明接口类型 458
10.1.3 实现接口类型 460
10.1.4 比较接口和继承 462
常见错误10.1 忘记将实现方法声明为公共方法 463
常见错误10.2 试图实例化一个接口 463
专题10.1 接口中的常量 464
Java 8说明10.1 接口中的静态方法 464
Java 8说明10.2 默认方法 464
Java 8说明10.3 冲突的默认方法 465
10.2 处理接口类型 466
10.2.1 从类转换为接口 466
10.2.2 在接口变量上调用方法 467
10.2.3 从接口强制转换为类 467
实用示例10.1 研究数字序列 468
10.3 Comparable接口 469
编程技巧10.1 比较整数和浮点数 470
专题10.2 clone方法和Cloneable接口 470
10.4 使用接口实现回调 473
Java 8说明10.4 lambda表达式 477
专题10.3 泛型接口类型 478
10.5 内部类 479
专题10.4 匿名类 480
10.6 模拟对象 481
10.7 事件处理 482
10.7.1 监听事件 483
10.7.2 使用内部类实现监听器 485
常见错误10.3 在实现方法中改变参数类型 488
常见错误10.4 试图调用监听器方法 488
Java 8说明10.5 lambda表达式实现事件处理 488
10.8 用按钮构建应用 488
常见错误10.5 忘记关联监听器 491
编程技巧10.2 不要把容器用作监听器 492
10.9 处理计时器事件 492
常见错误10.6 忘记重绘 495
10.10 鼠标事件 495
专题10.5 键盘事件 499
专题10.6 事件适配器 499
计算与社会10.1 开源和免费软件 500
第11章 输入/输出和异常处理 512
11.1 读写文本文件 512
常见错误11.1 文件名中的反斜线 515
常见错误11.2 用String构造一个Scanner 515
专题11.1 读Web页面 515
专题11.2 文件对话框 516
专题11.3 字符编码 516
11.2 文本输入和输出 517
11.2.1 读取单词 517
11.2.2 读取字符 518
11.2.3 字符分类 518
11.2.4 读取文本行 519
11.2.5 扫描字符串 520
11.2.6 把字符串转换为数字 520
11.2.7 读数字时避免错误 521
11.2.8 混合数字、单词和文本行输入 521
11.2.9 格式化输出 522
专题11.4 正则表达式 524
专题11.5 读取整个文件 524
11.3 命令行参数 525
操作指南11.1 处理文本文件 527
实用示例11.1 分析婴儿名字 530
计算与社会11.1 加密算法 531
11.4 异常处理 532
11.4.1 抛出异常 532
11.4.2 捕获异常 533
11.4.3 受查异常 535
11.4.4 关闭资源 536
11.4.5 设计你自己的异常类型 537
编程技巧11.1 早抛出,晚捕获 539
编程技巧11.2 不要压制异常 539
编程技巧11.3 要抛出特定的异常 540
专题11.6 断言 540
专题11.7 try/finally语句 541
11.5 应用:处理输入错误 541
计算与社会11.2 阿丽亚娜火箭事故 546
第12章 面向对象设计 556
12.1 类及其职责 556
12.1.1 发现类 556
12.1.2 CRC卡方法 557
12.2 类之间的关系 558
12.2.1 依赖 558
12.2.2 聚合 559
12.2.3 继承 560
操作指南12.1 程序设计中使用CRC卡和UML图 561
专题12.1 UML图中的属性和方法 562
专题12.2 重数 563
专题12.3 聚合、关联和组合 563
12.3 应用:打印一个发货单 564
12.3.1 需求 564
12.3.2 CRC卡 565
12.3.3 UML图 567
12.3.4 方法文档 567
12.3.5 实现 569
计算与社会12.1 数据库和隐私 574
实用示例12.1 模拟一个自动柜员机 575
附录A Unicode基本拉丁语和拉丁语-1子集 581
附录B Java操作符小结 583
附录C Java保留字小结 585
附录D Java库 587
附录E Java语言编码指南 608
术语表 614