第0章 计算机、对象和Java 1
0.1 欢迎 2
0.2 什么是计算机 2
0.3 网络、Internet和万维网 4
0.4 为什么要学习编程 5
0.5 编程语言 6
0.6 为什么要学习Java 7
0.7 什么是面向对象编程 9
0.7.1 面向对象编程的基本特征:交互对象 9
0.7.2 什么是对象 9
0.7.3 属性和值 10
0.7.4 操作和消息 10
0.7.5 什么是类 11
0.7.6 变量和方法 12
0.7.7 实例与类变量、类方法 12
0.7.8 类层次结构和类继承 13
0.7.9 面向对象的原则 15
本章小结 16
习题 18
第1章 Java程序设计与开发 21
1.1 概述 22
1.2 设计优秀的程序 22
1.3 设计一个猜谜程序 24
1.3.1 问题分解 24
1.3.2 对象设计 24
1.3.3 数据、方法与算法 26
1.3.4 用Java编写代码 28
1.3.5 语法和语义 28
1.3.6 测试、调试与修改 29
1.3.7 编写易读的程序 30
1.4 Java语言元素 30
1.4.1 注释 31
1.4.2 程序布局 32
1.4.3 关键字和标识符 32
1.4.4 数据类型和变量 33
1.4.5 语句 34
1.4.6 表达式和操作符 36
1.4.7 类定义 37
1.4.8 声明一个实例变量 37
1.4.9 定义实例方法 38
1.4.10 Java应用程序 38
1.4.11 生成和使用对象 39
1.4.12 Java applet 40
1.4.13 Java类库包 40
1.4.14 import语句 41
1.4.15 Java中的限定名称 41
1.5 编辑、编译与运行Java程序 42
1.5.1 Java开发环境 42
1.5.2 编辑程序 43
1.5.3 编译程序 44
1.5.4 运行Java应用程序 44
1.5.5 运行Java applet 45
1.6 Java库:System和PrintStream 46
本章小结 48
习题 50
第2章 对象的定义、创建和使用 55
2.1 概述 56
2.2 使用String对象 56
2.3 用Graphics对象画图形(选读) 59
2.4 类的定义 63
2.4.1 Riddle类 63
2.4.2 RiddleUser类 65
2.4.3 对象实例化:创建Riddle实例 66
2.4.4 与Riddle交互 66
2.4.5 定义、创建和使用 67
2.5 案例学习:模拟两人游戏 67
2.5.1 设计OneRowNim类 68
2.5.2 定义OneRowNim类 69
2.5.3 测试OneRowNim类 74
2.5.4 流程控制:方法调用与返回 75
2.5.5 跟踪OneRowNim程序 76
2.5.6 面向对象设计:基本原则 77
2.6 Java库:java.util.Scanner 79
2.6.1 用Scanner类进行键盘输入 79
2.6.2 使用KeyboardReader类进行键盘输入 81
本章小结 82
习题 84
第3章 方法:与对象进行通信 89
3.1 概述 90
3.2 给对象传递信息 90
3.2.1 实参和形参 92
3.2.2 传递一个int值给OneRowNim方法 94
3.2.3 传递键盘输入值给takeSticks() 95
3.3 构造函数 96
3.3.1 默认构造函数 97
3.3.2 构造函数重载与方法签名 98
3.3.3 构造函数的调用 99
3.4 从对象获取信息 99
3.4.1 调用一个有返回值的方法 100
3.4.2 扩展的OneRowNim类 100
3.5 值传递与引用传递 102
3.6 控制流:控制结构 104
3.6.1 简单的if语句 105
3.6.2 if-else语句 107
3.6.3 嵌套的if-else多路选择结构 108
3.6.4 while结构 110
3.7 测试改进后的OneRowNim类 112
3.8 Java库:java.lang.Object 116
3.9 面向对象设计:继承与多态 117
3.10 画线与定义图形方法(选读) 118
本章小结 120
习题 123
第4章 输入/输出:用户界面设计 129
4.1 概述 130
4.2 用户界面 130
4.3 命令行界面 131
4.3.1 用BufferedReader实现从键盘输入字符串 132
4.3.2 从键盘输入数字 133
4.3.3 设计一个键盘读取类 134
4.3.4 设计一个命令行界面 136
4.4 图形用户界面 138
4.4.1 Java的GUI组件 139
4.4.2 类继承:超类的扩展 140
4.4.3 顶层窗口 141
4.4.4 输入、输出和控制的GUI组件 143
4.4.5 在顶层窗口中添加GUI组件 145
4.4.6 控制GUI的动作 146
4.4.7 ActionListener接口 148
4.4.8 GUI和计算对象之间的连接 149
4.4.9 在Java应用程序中使用GUI 151
4.4.10 在Java applet中使用GUI 152
4.5 案例学习:The One-Row Nim游戏 154
4.5.1 OneRowNim的命令行界面 154
4.5.2 为OneRowNim类设计GUI 157
4.6 Java库:java.io.File和文件输入(选读) 160
本章小结 164
习题 167
第5章 Java数据与运算符 171
5.1 概述 172
5.2 布尔数据与运算符 173
5.2.1 布尔(或逻辑)运算 173
5.2.2 运算优先级与运算结合性 174
5.2.3 短路计算 175
5.2.4 在OneRowNim中使用布尔类型 176
5.3 数值数据与运算符 179
5.3.1 数值运算 180
5.3.2 运算符优先级 183
5.3.3 自增与自减运算符 184
5.3.4 赋值运算符 186
5.3.5 关系运算符 186
5.4 Java库:java.lang.Math 188
5.5 数值处理范例 189
5.5.1 范例:保留两位小数 189
5.5.2 范例:转换华氏温度为摄氏温度 190
5.5.3 范例:使用类常量 194
5.5.4 面向对象设计:信息隐藏 196
5.5.5 范例:One-Row Nim游戏的必胜算法 197
5.6 Java库:java.text.NumberFormat 200
5.7 字符数据与运算符 202
5.7.1 把字符转换为整数 203
5.7.2 字典顺序 204
5.7.3 关系运算符 205
5.8 范例:字符转换 205
5.9 问题解决=描述+行为 207
本章小结 208
习题 213
第6章 控制结构 219
6.1 概述 220
6.2 流控制:循环结构 220
6.3 可计数循环 221
6.3.1 for结构 222
6.3.2 循环边界 224
6.3.3 无限循环 224
6.3.4 循环缩进 225
6.3.5 嵌套循环 227
6.4 范例:汽车贷款 228
6.5 绘图范例:绘制棋盘 230
6.6 条件循环 234
6.6.1 再谈while结构 235
6.6.2 do-while结构 236
6.7 范例:计算平均数 239
6.8 范例:数据校验 242
6.9 循环设计原则 244
6.10 switch多路选择结构 245
6.11 面向对象设计:结构化编程 248
本章小结 255
习题 261
第7章 字符串和字符串处理 265
7.1 概述 266
7.2 String基本知识 266
7.2.1 构造String 267
7.2.2 字符串连接 269
7.2.3 字符串索引 270
7.2.4 将数据转换为字符串 271
7.3 字符串查找 272
7.4 范例:关键字查找 274
7.5 Java库:java.lang.StringBuffer 275
7.6 检索字符串中的一部分 278
7.7 范例:处理名称和口令 279
7.8 处理字符串中的每个字符 280
7.8.1 差1错误 281
7.8.2 范例:字符计数 281
7.8.3 范例:倒置字符串 282
7.8.4 范例:首字母大写 282
7.8.5 其他String方法 283
7.9 比较字符串 283
7.9.1 对象相同与对象相等的对比 285
7.9.2 字符串相同与字符串相等的对比 287
7.10 Java库:java.util.StringTokenizer 289
7.11 处理图形上下文中的文本(选读) 290
7.11.1 Font和FontMetrics类 291
7.11.2 字体规格 292
7.11.3 范例:文本居中 293
本章小结 295
习题 298
第8章 继承与多态 301
8.1 概述 302
8.2 Java的继承机制 302
8.2.1 使用继承方法 303
8.2.2 覆盖继承方法 304
8.2.3 静态绑定、动态绑定以及多态 305
8.2.4 多态和面向对象设计 306
8.2.5 使用super引用超类 308
8.2.6 继承和构造函数 308
8.3 抽象类、接口以及多态 310
8.3.1 实现一个抽象方法 311
8.3.2 实现一个Java接口 314
8.4 范例:Toggle按钮 315
8.5 范例:Ciper类层次结构 319
8.5.1 类设计:Caesar类 321
8.5.2 算法设计:移位字符 322
8.5.3 类设计:Transpose类 323
8.5.4 测试和调试 324
8.6 案例学习:一个两人游戏的类层次结构 325
8.6.1 设计目的 325
8.6.2 设计Two Player Game类 325
8.6.3 TwoPlayerGame超类 327
8.6.4 CLUIPlayableGame接口 330
8.6.5 面向对象设计:接口还是抽象类 332
8.6.6 修改后的OneRowNim类 332
8.6.7 IPlayer接口 335
8.6.8 运行OneRowNim 337
8.6.9 扩展TwoPlayerGame的层次结构 339
8.7 面向对象设计原则 344
本章小结 345
习题 347
第9章 数组与数组处理 351
9.1 概述 352
9.2 一维数组 352
9.2.1 声明和创建数组 354
9.2.2 数组分配 354
9.2.3 初始化数组 357
9.2.4 数组赋值和使用数组值 358
9.3 简单的数组例子 358
9.4 范例:计算字母频度 361
9.4.1 保存一个字母频度的类 361
9.4.2 计算字母频度的类 362
9.5 数组算法:排序 364
9.5.1 插入排序 364
9.5.2 选择排序 367
9.5.3 算法:交换内存元素 368
9.5.4 值传递和引用传递 368
9.6 数组算法:查找 370
9.6.1 顺序查找 370
9.6.2 折半查找 371
9.7 二维数组 373
9.7.1 二维数组方法 376
9.7.2 把部分数组传递给方法 377
9.8 多维数组(选学) 380
9.9 面向对象设计:多态排序(选学) 381
9.10 Java库:java.lang.Vector 385
9.11 案例学习:N个玩家的计算机游戏 386
9.11.1 ComputerGame类层次 386
9.11.2 ComputerGame类 387
9.11.3 WordGuess类和WordGuesser类 390
9.12 基于GUI的游戏(图形选学) 393
9.12.1 GUIPlayableGame接口 394
9.12.2 SlidingTilePuzzle 395
9.12.3 SlidingGUI类 398
本章小结 400
习题 405
第10章 异常:出现问题的时候 409
10.1 概述 410
10.2 异常情况处理 410
10.2.1 传统的错误处理 410
10.2.2 Java的默认异常处理 411
10.3 Java的异常体系 412
10.3.1 可控式异常和不可控异常 413
10.3.2 Exception类 415
10.4 处理程序中的异常 415
10.4.1 测试、抛出和捕获异常 415
10.4.2 分离错误检查和错误处理 418
10.4.3 try/throw/catch的语法和语义 419
10.4.4 对try/catch/finally指令的限制 420
10.4.5 动态作用域法和静态作用域法 421
10.4.6 异常的传播:寻找一个catch区块 422
10.5 错误处理和健壮程序设计 425
10.5.1 打印一条消息并终止 426
10.5.2 记录错误并继续 426
10.5.3 修复错误并继续 426
10.5.4 修复还是不修复 429
10.6 创建并抛出你自己的异常 433
10.7 Java库:javax.swing.JOptionPane 436
本章小结 438
习题 441
第11章 文件与流:输入/输出技术 445
11.1 概述 446
11.2 流和文件 446
11.2.1 数据层次 446
11.2.2 二进制文件和文本文件 448
11.2.3 输入和输出流 448
11.3 案例学习:读/写文本文件 452
11.3.1 文本文件格式 452
11.3.2 写入一个文本文件 453
11.3.3 代码重用:设计文本文件输出 455
11.3.4 读取一个文本文件 456
11.3.5 代码重用:设计文本文件输入 459
11.3.6 TextIO应用程序 460
11.4 File类 463
11.4.1 名称和路径 463
11.4.2 验证文件名 463
11.5 案例学习:读/写二进制文件 465
11.5.1 写二进制数据 466
11.5.2 读二进制数据 469
11.5.3 BinaryIO应用程序 471
11.5.4 从文件中提取数据 474
11.6 对象序列化:读/写对象 475
11.7 Java库:javax.swing.JFileChooser 479
11.8 在程序中使用文件数据 480
本章小结 483
习题 485
第12章 递归问题求解 489
12.1 概述 490
12.1.1 替代循环功能的递归调用 490
12.1.2 利用递归求解问题 492
12.2 递归的定义 492
12.2.1 阶乘:N! 492
12.2.2 嵌套图案的绘制 493
12.3 递归的字符串方法 495
12.3.1 输出字符串 495
12.3.2 逆序输出字符串 497
12.3.3 字符串中的字符计数 499
12.3.4 转换字符串 501
12.3.5 输出掷N枚硬币时的所有可能结果 502
12.4 数组的递归处理 504
12.4.1 利用递归进行顺序查找 504
12.4.2 信息隐藏 506
12.4.3 利用递归实现选择排序 507
12.5 范例:绘制(递归的)分形 509
12.5.1 嵌套正方形 510
12.5.2 Sierpinski垫片 511
12.6 面向对象设计:尾递归 513
12.7 面向对象设计:递归还是迭代 514
12.8 Java库:javax.swing.JComboBox 516
本章小结 521
习题 525
第13章 图形用户界面 529
13.1 概述 530
13.2 Java GUI:从AWT到Swing 530
13.3 Swing组件集 532
13.4 面向对象设计:模型-视图-控制器结构 533
13.5 Java事件模型 535
13.6 案例学习:设计基本的GUI 539
13.6.1 米制转换器应用程序 539
13.6.2 内部类和适配器类 543
13.6.3 GUI设计缺点 544
13.6.4 扩展基本GUI:按钮数组 546
13.6.5 GUI设计缺点 550
13.7 容器和布局管理器 551
13.7.1 布局管理器 551
13.7.2 GridLayout管理器 552
13.7.3 GUI设计缺点 553
13.7.4 BorderLayout管理器 553
13.8 复选框、单选按钮和边框 556
13.8.1 复选框和单选按钮数组 557
13.8.2 Swing边框 559
13.8.3 BoxLayout管理器 559
13.8.4 ItemListener接口 560
13.8.5 OrderApplet程序 561
13.9 菜单和滚动条 564
13.9.1 添加菜单栏到应用程序 564
13.9.2 菜单层次 565
13.9.3 处理菜单行为 566
13.9.4 添加滚动条到文本区 568
本章小结 572
习题 575
第14章 线程和并发编程 577
14.1 概述 578
14.2 什么是线程 578
14.2.1 线程的并发执行 579
14.2.2 多线程编号 580
14.3 Java库:java.lang.Thread 582
14.3.1 线程控制 584
14.3.2 线程优先级 584
14.3.3 强制线程睡眠 585
14.3.4 多线程的异步特征 586
14.4 线程状态与生命周期 587
14.5 运用线程改善界面的响应性能 588
14.5.1 单线程设计 588
14.5.2 多线程绘图:Dotty线程 592
14.5.3 多线程设计的优越之处 595
14.6 案例学习:协作线程 596
14.6.1 问题描述 596
14.6.2 设计:TakeANumber类 597
14.6.3 Java监视器和互斥 598
14.6.4 Customer类 599
14.6.5 Clerk类 600
14.6.6 Bakery类 601
14.6.7 问题:临界区 603
14.6.8 运用wait/notify来协调线程 606
14.7 案例学习:Pong游戏 609
14.7.1 多线程设计 609
14.7.2 Pong程序的实现 611
14.7.3 KeyListener接口 613
14.7.4 弹球动画 615
本章小结 616
习题 618
第15章 套接字和网络 621
15.1 概述 622
15.2 网络概述 622
15.2.1 网络的规模和拓扑结构 622
15.2.2 互联网络 623
15.2.3 网络协议 624
15.2.4 客户端/服务器应用程序 625
15.2.5 较低层的网络协议 626
15.2.6 java.net包 627
15.3 在applet中使用网络资源 628
15.4 Java库:java.net.URL 629
15.5 放映幻灯片的applet 630
15.5.1 SlideShowApplet类 632
15.5.2 Timer类 634
15.6 在应用程序中使用网络资源 635
15.6.1 从Web上下载文本文件 635
15.6.2 代码重用 644
15.7 通过socket进行客户端/服务器通信 644
15.7.1 服务器协议 645
15.7.2 客户端协议 646
15.7.3 双向流通信 647
15.8 案例学习:通用客户端/服务器类 648
15.8.1 面向对象设计 649
15.8.2 EchoServer类 651
15.8.3 EchoClient类 654
15.9 开发网络版One-Row Nim游戏 658
15.9.1 NimServer类 661
15.9.2 NimClient类 663
15.9.3 测试Nim服务 664
15.10 Java网络安全约束 664
15.11 Java Servlet和Java Server Page(JSP) 665
15.11.1 Java Server Pages 666
15.11.2 Java servlet 667
15.11.3 一个简单的servlet程序 668
15.11.4 Nim servlet 669
15.11.5 设置并使用Java Servlets 673
本章小结 673
习题 675
第16章 数据结构:列表、栈和队列 677
16.1 概述 678
16.2 链表数据结构 678
16.2.1 使用引用来链接对象 678
16.2.2 范例:动态电话链表 680
16.2.3 操作电话列表 682
16.3 面向对象设计:链表ADT 689
16.4 栈ADT 695
16.4.1 Stack类 696
16.4.2 测试Stack类 697
16.5 队列ADT 698
16.6 Java库:Java集合框架和泛型 701
16.6.1 Java中的泛型 701
16.6.2 List〈E〉接口和LinkedList〈E〉类 703
16.7 使用Set和Map接口 705
16.7.1 使用Set接口 705
16.7.2 使用接口Map〈K,V〉 707
16.8 二叉查找树数据结构 708
本章小结 710
习题 714
附录A 编码约定 717
附录B Java开发工具包 724
附录C ASCII码和Unicode字符集 732
附录D Java关键字 733
附录E 运算符的优先级结构 734
附录F Java内部类 735
附录G 自动装箱和枚举 740
附录H Java和UML资源 744