第一部分 对象基础 2
第1章 抽象和建模 2
1.1 通过抽象来简化 2
1.2 通过抽象来概括 3
1.2.1 将抽象组织成类层次结构 3
1.2.2 将抽象作为软件开发的基础 6
1.3 抽象的重用 6
1.4 固有的问题 7
1.5 小结 9
第2章 Java基础 10
2.1 为什么选择Java 10
2.1.1 Java是体系结构中立的 10
2.1.2 Java提供“一站式服务” 13
2.1.3 Java是完全面向对象的 15
2.1.4 实践使Java更完美 16
2.1.5 Java是一种开放标准 16
2.1.6 Java是免费的 16
2.1.7 关于伪代码和真正Java代码的提醒 16
2.2 简单Java程序剖析 17
2.2.1 注释 17
2.2.2 类声明 18
2.2.3 main方法 19
2.3 Java的“机制” 19
2.3.1 把Java源代码编译成字节码 21
2.3.2 执行字节码 21
2.4 基本类型 22
2.3.3 JVM内幕 22
2.5 变量 23
2.6 变量初始化 25
2.7 String类型 25
2.8 区分大小写 26
2.9 Java表达式 27
2.9.1 算术运算符 27
2.9.2 关系和逻辑运算符 28
2.9.3 表达式求值和运算符优先级 29
2.9.4 表达式类型 30
2.10 自动类型转换和显式转型 30
2.11 循环和其他流程控制结构 32
2.11.1 if语句 32
2.11.2 switch语句 34
2.11.3 for语句 35
2.11.4 while语句 37
2.11.5 跳转语句 38
2.12 块结构语言和变量作用域 39
2.13 打印到屏幕 40
2.13.1 print与println 41
2.13.2 转义序列 42
2.14 Java风格要素 43
2.14.1 适当使用缩进 43
2.14.2 明智地使用注释 46
2.14.3 大括号位置 46
2.14.4 描述性的变量名称 47
2.15 小结 47
3.1 最简软件 49
3.1.1 功能分解 49
第3章 对象和类 49
3.1.2 面向对象方法 51
3.2 对象是什么 51
3.2.1 状态/数据/属性 52
3.2.2 行为/操作/方法 53
3.3 类是什么 53
3.3.1 关于命名约定的提示 54
3.3.2 Java风格的类声明 55
3.4 实例化 56
3.5 封装 57
3.6 用户定义类型和引用变量 57
3.7 实例化对象:近距离的审视 58
3.8 对象作为属性 63
3.8.1 一个编译计策:“框架”类 65
3.8.2 合成 66
3.8.3 引用作为属性的优点 68
3.9 面向对象编程语言的三个典型特征 69
3.10 小结 69
第4章 对象交互 70
4.1 事件驱动对象协作 70
4.2 声明方法 71
4.2.1 方法首部 72
4.2.2 方法命名约定 72
4.2.3 给方法传递实参 72
4.2.4 方法返回值类型 74
4.2.5 一个类比 74
4.2.6 方法体 75
4.2.8 return语句 76
4.2.7 特征可以按任何顺序声明 76
4.3 用方法实现业务规则 79
4.4 对象作为方法调用的环境 80
4.4.1 回顾Java表达式 82
4.4.2 捕获方法返回值 83
4.4.3 方法签名 84
4.4.4 选择描述性方法名 84
4.5 方法重载 85
4.6 对象间的消息传递 87
4.7 委托 88
4.8 获得对象句柄 88
4.9 对象作为客户和供应者 91
4.10 信息隐藏/可访问性 92
4.10.1 公有可访问性 93
4.10.2 私有可访问性 94
4.10.3 公开服务 95
4.10.4 回顾方法首部 96
4.10.5 从类的方法内部访问类的特征 96
4.11 从客户代码访问私有特征 99
4.11.1 声明访问器方法 100
4.11.2 推荐的“Get”/“Set”方法首部 101
4.11.3 属性值的“持久性” 103
4.11.4 在客户代码中使用访问器方法 103
4.12 封装+信息隐藏的能力 104
4.12.1 防止对封装数据的未授权访问 104
4.12.2 有助于保证数据完整性 105
4.12.3 当私有特征改变时限制“连锁反应” 106
4.12.4 在类自己的方法内部使用访问器方法 108
4.13 公有/私有准则的例外 111
4.13.2 例外2:内部的辅助方法 112
4.13.1 例外1:内部的辅助属性 112
4.13.3 例外3:“只读”属性 113
4.13.4 例外4:公有属性 114
4.14 构造方法 114
4.14.1 默认构造方法 114
4.14.2 编写自己的显式构造方法 115
4.14.3 给构造方法传递实参 116
4.14.4 替换默认构造方法 117
4.14.5 更精巧的构造方法 117
4.14.6 重载构造方法 118
4.14.7 关于默认构造方法的重要告诫 120
4.14.8 使用“this”关键字促进构造方法重用 121
4.15 回顾最简软件 124
4.16 小结 125
第5章 对象关系 127
5.1 关联和连接 127
5.1.1 多重性 129
5.1.2 多重性和连接 130
5.2 聚集和组合 131
5.3 继承 132
5.3.1 用新的抽象来响应多变的需求 132
5.3.2 (不适当的)方法1:修改Student类 133
5.3.3 (不适当的)方法2:“复制”Student类以创建新的Graduate-Student类 135
5.3.4 (适当的)方法3:利用继承 136
5.3.5 继承的“是一个”特性 137
5.3.6 继承的优点 139
5.3.7 类层次结构 140
5.3.9 继承真的是一种关系吗 141
5.3.8 Object类 141
5.3.10 避免类层次结构中的“连锁反应” 142
5.3.11 派生类的准则:可以做的 142
5.3.12 覆盖 142
5.3.13 重用超类行为:“super”关键字 145
5.3.14 派生类的准则:不能做的 147
5.3.15 私有特征和继承 149
5.3.16 继承和构造方法 151
5.3.17 关于多重继承 157
5.4 回顾OOPL的三个典型特征 159
5.5 小结 159
第6章 对象集合 162
6.1 什么是集合 162
6.1.2 集合组织其他对象的引用 163
6.1.1 集合是由类定义的且必须实例化 163
6.1.3 集合被封装了 164
6.2 三种一般集合类型 164
6.2.1 有序链表 164
6.2.2 字典 165
6.2.3 集(Set) 166
6.3 数组作为简单集合 167
6.3.1 声明并实例化数组 167
6.3.2 访问单个数组元素 168
6.3.3 初始化数组内容 169
6.3.4 操作对象数组 170
6.4 一个更复杂的集合类型:ArrayList类 173
6.4.1 使用ArrayList类:一个示例 173
6.4.2 导入指令和包 174
6.4.3 类的名字空间 176
6.4.4 用户定义包和默认包 177
6.4.5 泛型 178
6.4.6 ArrayList的特征 179
6.4.7 遍历ArrayList 181
6.4.8 将ArrayList的内容复制到数组 182
6.5 集合类HashMap 183
6.6 TreeMap类 187
6.7 同一对象可以同时被多个集合引用 189
6.8 创造自己的集合类型 190
6.8.1 方法1:从零开始设计一个新的集合类 190
6.8.2 方法2:扩展一个预定义集合类(MyIntCollection) 190
6.8.3 方法3:封装一个标准集合(MyIntCollection2) 194
6.8.4 权衡方法2和方法3 197
6.9 集合作为方法返回类型 198
6.10 派生类型的集合 199
6.11 回顾Student类的设计 200
6.11.1 Student类的courseLoad属性 200
6.11.2 Student类的transcript属性 201
6.11.3 transcript属性,第二种表示方法 203
6.11.4 完整的Student类数据结构 207
6.12 小结 207
第7章 其他对象概念 209
7.1 多态 209
7.2 面向对象编程语言的三种典型特征 215
7.2.1 用户定义类型的优点 215
7.2.2 继承的优点 216
7.2.3 多态的优点 216
7.3 抽象类 216
7.3.1 实现抽象方法 219
7.3.2 抽象类和实例化 220
7.3.3 声明抽象类型的引用变量 221
7.3.4 一个关于多态的有趣现象 222
7.4 接口 223
7.4.1 实现接口 225
7.4.2 另一种形式的“是一个”关系 227
7.4.3 接口和转型 228
7.4.4 实现多个接口 230
7.4.5 回顾接口和转型 232
7.4.6 接口和实例化 233
7.4.7 接口和多态 233
7.4.8 接口的重要性 234
7.5 静态特征 241
7.5.1 静态变量 242
7.5.2 一个设计改进:掩盖实现细节 245
7.5.3 静态方法 246
7.5.4 静态方法的限制 246
7.5.5 回顾Print语句的语法 248
7.5.6 实用类 248
7.5.7 final关键字 248
7.5.8 静态导入功能 251
7.5.9 自定义实用类 252
7.6 小结 253
第二部分 对象建模基础 256
第8章 对象建模过程概要 256
8.1 对象建模的主要目标 256
8.2 Jacquie建议的对象建模过程概要 259
8.2.1 关于对象建模软件工具的考虑 259
8.3 小结 261
8.2.2 提醒 261
第9章 通过用例形式化需求 262
9.1 什么是用例 262
9.1.1 功能需求与技术需求 262
9.1.2 包含用户 263
9.2 参与者 264
9.2.1 识别参与者并确定其角色 264
9.2.2 用图表示系统和参与者 265
9.3 指定用例 266
9.4 匹配用例和参与者 267
9.5 是否用图来表示用例 268
9.6 小结 269
第10章 对系统的静态/数据特征建模 270
10.1 识别恰当的类 270
10.1.1 名词短语分析 271
10.1.2 精炼候选类列表 274
10.1.3 重新审查用例 277
10.2 产生数据字典 278
10.3 确定类关联 279
10.4 识别属性 281
10.5 UML表示法:对抽象的静态特征建模 281
10.5.1 类、属性和操作 282
10.5.2 类之间的关系 283
10.5.3 反映多重性 287
10.6 对象图 289
10.7 关联作为属性 290
10.8 信息沿着关联“管道”“流动” 291
10.9 “混合与匹配”关系表示法 295
10.10 关联类 297
10.11 “完整的”学生注册系统类图 299
10.12 元数据 303
10.13 小结 304
第11章 对系统的动态/行为特征建模 306
11.1 行为如何影响状态 306
11.2 场景 310
11.2.1 表示“注册课程”用例的场景1 311
11.2.2 表示“注册课程”用例的场景2 312
11.3 顺序图 313
11.4 用顺序图确定方法 317
11.5 通信图 318
11.6 修正后的SRS类图 319
11.7 小结 320
12.1 测试模型 322
第12章 包装建模成果 322
12.2 重新审查需求 323
12.3 模型重用:关于设计模式的讨论 324
12.4 小结 326
第三部分 将对象蓝图转换为Java代码 328
第13章 完善Java知识 328
13.1 Java特定的术语 328
13.2 Java应用程序架构 331
13.3 Java归档文件(JAR) 332
13.3.1 创建JAR文件 333
13.3.2 检查JAR文件的内容 333
13.3.3 使用JAR文件内包含的字节码 334
13.3.4 从JAR文件中提取内容 334
13.3.5 “打包”整个目录结构 335
13.4 Java文档注释 336
13.5 String的对象特性 340
13.5.1 操作String 340
13.5.2 String是不可改变的 342
13.5.3 StringBuffer类 344
13.5.4 StringTokenizer类 345
13.5.5 实例化String和String常量池 347
13.5.6 测试String是否相等 349
13.6 消息链 350
13.7 用“this”关键字引用对象自己 351
13.8 Java异常处理 353
13.8.1 异常处理机制 354
13.8.2 捕获异常 361
13.8.3 解释异常栈跟踪 365
13.8.4 异常类层次结构 366
13.8.5 捕获通用Exception类型 368
13.8.6 编译器强制异常处理 369
13.8.7 利用“捕获”的异常 370
13.8.8 嵌套try/catch块 371
13.8.9 用户定义异常类型 372
13.8.10 抛出多个异常类型 374
13.9 枚举 375
13.10 给命令行驱动的程序提供输入 382
13.10.1 接受命令行参数:agrs数组 382
13.10.2 引入自定义命令行标志来控制程序行为 383
13.10.3 为输入转换使用包装类 387
13.10.4 接受键盘输入 389
13.11.1 确定对象所属的类 392
13.11 Object类的特征 392
13.11.2 测试对象是否相等 394
13.11.3 覆盖equals方法 397
13.11.4 覆盖toString方法 399
13.12 深度审视JVM内幕 401
13.12.1 JVM的类加载器 401
13.12.2 -verbose选项 402
13.12.3 main(...)的静态特性 405
13.12.4 回顾import指令 405
13.12.5 静态初始化器 407
13.13 Date类 409
13.14 重新审查可访问性 413
13.14.1 特征的默认可访问性 414
13.14.2 公有类与非公有类 414
13.14.3 回顾变量初始化 417
13.15 内部类 419
13.16 J2SE 5.0的附加改进 422
13.16.1 格式化输出 422
13.16.2 格式化输入 423
13.16.3 可变参数 425
13.17 小结 427
第14章 将模型转换为Java代码 429
14.1 关于充分利用本章和后续章节的建议 429
14.2 SRS类图回顾 430
14.2.1 Person类(定义抽象类) 431
14.2.2 Student类(通过继承重用、扩展抽象类、委托) 433
14.2.3 Professor类(双向关系) 440
14.2.4 Course类(自反关系、单向关系) 441
14.2.5 Section类(表示关联类、公有静态最终属性、枚举) 444
14.2.6 回顾委托 451
14.2.7 ScheduleOfClasses类 455
14.2.8 TranscriptEntry关联类(静态方法) 456
14.2.9 Transcript类 459
14.2.10 SRS“驱动器”程序 460
14.3 模型-视图分离与模型-数据层分离的重要性 468
14.4 小结 469
第15章 完善自己的应用程序,第一部分:添加数据访问层 471
15.1 即将到来的SRS增强的概述 472
1 5.2 对象持久化的方法 472
15.3 Java中基本的文件I/O 474
15.3.1 读取文件 474
15.3.2 写入文件 476
15.3.3 文件I/O的异常处理 478
15.4.2 两个新的集合封装类:CourseCatalog和Faculty 480
15.4 填充主要的SRS集合 480
15.4.1 ScheduleOfClasses集合 480
15.4.3 从面向记录的数据文件初始化SRS集合 482
15.4.4 持久化学生数据 485
15.4.5 数据文件的读访问和写访问 486
15.5 用Java的Properties类配置应用程序 486
15.5.1 文件FileNames.properties 487
15.5.2 访问系统属性 488
15.6 为SRS定义自定义异常 490
15.7 封装持久化细节 491
15.7.1 引入SRSDataAccess类 491
15.7.2 初始化ScheduleOfClasses集合 494
15.7.3 初始化Faculty集合 496
15.7.4 初始化CourseCatalog集合 499
15.7.5 初始化学生状态 501
15.7.6 持久化学生状态 503
15.7.7 简化SRS“驱动器”类 504
15.8 模型-数据访问层分离的重要性 511
15.8.1 对象与数据库 512
15.8.2 使用JDBC API:概念纵览 513
15.8.3 用数据库访问改进SRS 515
15.9 回顾对SRS的改进 518
15.10 小结 519
第16章 完善自己的应用程序,第二部分:添加表示层 521
16.1 Java GUI入门 522
16.1.1 组件 522
16.1.2 容器 522
16.1.3 模型-视图分离 523
16.1.4 AWT组件与Swing组件 525
16.2 制作GUI视图/表示 528
16.2.1 JFrame 529
16.2.2 在屏幕上定位窗口 531
16.2.3 在屏幕上明确地定位窗口 532
16.2.4 把窗口定位在屏幕中间 533
16.2.5 向JFrame添加组件 535
16.2.6 JPanel 536
16.2.7 通用组件属性和行为 536
16.2.8 布局基础 539
16.2.9 BorderLayout 539
16.2.10 GridLayout 543
16.2.11 FlowLayout 547
16.2.12 JLabel 548
16.2.13 JTextField与JPasswordField 549
16.2.14 JButton 551
16.2.15 JList 552
16.3 简单的计算器示例 554
16.4 改良的GUI应用程序体系结构 557
16.5 其他值得探讨的AWT/Swing组件 561
16.6 Java事件处理 562
16.6.1 事件的基本概念 562
16.6.2 基本事件类型 564
16.6.3 创建并注册监听器 565
16.6.4 给计算器程序添加行为 567
16.6.5 合并监听器:利用ActionEvent 571
16.6.6 关闭窗口 572
16.6.7 适配器类与监听器接口 574
16.6.8 从JList中选择一项 577
16.7 更多容器类型 582
16.7.1 JDialog 583
16.7.2 用JOptionPane一步创建对话框 587
16.8 可重用自定义组件 588
16.9 小结 590
第17章 SRS,第三部分:添加GUI 592
17.1 SRS代码路线图 592
17.2 准备操作概念 594
17.3 MainFrame类 598
17.3.1 设计MainFrame的“外观”:创造性地使用GridLayout 598
17.3.2 编写MainFrame的“外观” 599
17.3.3 给MainFrame添加行为 603
17.4 PasswordPopup类:跨窗口/类共享信息 614
17.5 SRS驱动器类,显著地简化 616
17.6 J2EE概述 617
17.6.1 桌面应用程序部署的不利方面 618
17.6.2 Web部署的优势 618
17.6.3 什么是J2EE 622
17.6.4 什么是servlet 623
17.6.5 什么是JavaServer Page(JSP) 624
17.6.6 J2EE,模型视图控制器风格 626
17.6.7 N层体系结构 628
17.6.8 什么是EJB 629
17.6.9 打破J2EE神话 630
17.6.10 本书讨论的知识与J2EE的关系 631
17.7 回顾“工业强度”Java应用程序的体系结构 632
17.8 小结 634
18.1 Jacquie的“经过实践证明的”学好Java的方法 635
第18章 下一步 635
18.2 驯服科技浪潮 636
18.3 其他推荐读物 637
18.4 敬请指正 638
第四部分 附录 640
附录A 关于将本书作为教科书的建议 640
附录B 可选的案例研究 642
附录C 建立Java开发环境 646
附录D 下载并编译本书的源代码 658
附录E 对有经验的C++程序员的提示 659
附录F 多态性的幕后工作原理(静态绑定与动态绑定) 663
附录G J2SE 5.0以前的集合 667
附录H 编程基础以及编译器的职责 676
索引 680