我是从Bruce Eckel的网站开始,读Thinking In Java 1st edition的,那是2000年左右。实话实说,对于TIJ,我又喜欢又讨厌它。
又喜欢又讨厌
正如大多数同学所感觉的,TIJ偏重于介绍面向对象的“思想”,而不是像绝大多数(国内的)《Xxx程序设计》之类的书籍,前者是思想流派,后者是语法流。这点很吸引我,而且,这也是我写《编程导论(Java)》时学习的地方。
但,我并没有完整地读完TIJ,因为
- 我不喜欢他的讲述方式。Bruce Eckel按照上课的方式安排内容,“在我思考书中的一章时,实际上是在想如何教好一堂课。我的目标是得到一系列规模适中的教学模块,可以在合理的时间内教完。”,而我个人的阅读习惯是,以内容的适当集中来看待一个章节。当然,这只是不关紧要的对TIJ的第一印象。我会以内容为主线,跳着阅读一些章节——因而我也就没有完整地读完它。
- 我发现他所宣扬的面向对象“思想”,并不能够让我信服。注意,并非Bruce Eckel讲得有多大的错误,而是他的“思想”并不完整和系统。所以,在很早(2005)的一篇博客中,我说:“其实,你把Timothy
A.Budd..面向对象程序设计(第3版)再加上垃圾堆中顺便一本Java书,捣鼓捣鼓,就可以达到《Thinking in Java》的程度。”那时,我不看TIJ已经很久了。
- TIJ中有一些我认为不正确或严谨的地方。
- 太厚了。书我没有买的欲望,也不想借一本回家看。
再读一遍?
TIJ受到大家的推崇,必然有值得借鉴的地方。我打算再读一遍才下载的Java编程思想《Thinking In Java》中文版 (第4版).pdf。
我的笔记将列举在下面。(先将目录拷贝过来,很多与《编程导论(Java)》无交集的章节——API编程部分,可能不会仔细读)
- 第 1 章对象入门........................27
1.1 抽象的进步......................27
1.2 对象的接口......................28
1.3 实现方案的隐藏.............29
1.4 方案的重复使用.............30
1.5 继承:重新使用接口.................30
1.5.1 改善基础类............... 30
1.5.2 等价与类似关系................... 31
1.6 多形对象的互换使用.................31
1.6.1 动态绑定................... 32
1.6.2 抽象的基础类和接口.......... 32
1.7 对象的创建和存在时间.............33
1.7.1 集合与继承器....................... 33
1.7.2 单根结构................... 34
1.7.3 集合库与方便使用集合................... 35
1.7.4 清除时的困境:由谁负责清除? .............. 35
1.8 违例控制:解决错误.................36
1.9 多线程..................37
1.10 永久性...............37
1.11 Java 和因特网...............37
1.11.1 什么是Web? .................... 37
1.11.2 客户端编程(注释⑧) ................ 38
1.11.3 服务器端编程..................... 41
1.11.4 一个独立的领域:应用程序..................... 41
1.12 分析和设计....................42
1.12.1 不要迷失................. 42
1.12.2 阶段0:拟出一个计划.................. 42
1.12.3 阶段1:要制作什么?.................. 43
1.12.4 阶段2:如何构建? ...................... 43
1.12.5 阶段3:开始创建............. 44
1.12.6 阶段4:校订...................... 44
1.12.7 计划的回报............ 45
1.13 Java 还是C++?......................45
18
第2 章一切都是对象 ...............46
2.1 用句柄操纵对象.............46
2.2 所有对象都必须创建.................46
2.2.1 保存到什么地方................... 46
2.2.2 特殊情况:主要类型.......... 47
2.2.3 Java 的数组.............. 48
2.3 绝对不要清除对象.....................48
2.3.1 作用域....................... 48
2.3.2 对象的作用域....................... 49
2.4 新建数据类型:类.....................49
2.4.1 字段和方法............... 49
2.5 方法、自变量和返回值.............50
2.5.1 自变量列表............... 51
2.6 构建Java 程序................52
2.6.1 名字的可见性....................... 52
2.6.2 使用其他组件....................... 52
2.6.3 static 关键字............. 52
2.7 我们的第一个Java 程序...........53
2.8 注释和嵌入文档.............55
2.8.1 注释文档................... 56
2.8.2 具体语法................... 56
2.8.3 嵌入HTML.............. 56
2.8.4 @see:引用其他类............. 57
2.8.5 类文档标记............... 57
2.8.6 变量文档标记....................... 57
2.8.7 方法文档标记....................... 57
2.8.8 文档示例................... 58
2.9 编码样式.............59
2.10 总结....................59
2.11 练习....................59
第 3 章控制程序流程 ...............60
3.1 使用Java 运算符...........60
3.1.1 优先级....................... 60
3.1.2 赋值............... 60
3.1.3 算术运算符............... 62
3.1.4 自动递增和递减................... 64
3.1.5 关系运算符............... 65
3.1.6 逻辑运算符............... 66
3.1.7 按位运算符............... 68
3.1.8 移位运算符............... 68
3.1.9 三元if-else 运算符.............. 71
3.1.10 逗号运算符............ 72
3.1.11 字串运算符+....................... 72
3.1.12 运算符常规操作规则..................... 72
3.1.13 造型运算符............ 73
3.1.14 Java 没有“sizeof” .......... 74
3.1.15 复习计算顺序..................... 75
3.1.16 运算符总结............ 75
3.2 执行控制.............84
3.2.1 真和假....................... 84
3.2.2 if-else............ 84
3.2.3 反复............... 85
19
3.2.4 do-while..................... 85
3.2.5 for.................. 86
3.2.6 中断和继续............... 87
3.2.7 开关............... 91
3.3 总结......................94
3.4 练习......................94
第 4 章初始化和清除 ...............95
4.1 用构建器自动初始化.................95
4.2 方法过载.............96
4.2.1 区分过载方法....................... 97
4.2.2 主类型的过载....................... 98
4.2.3 返回值过载............. 101
4.2.4 默认构建器............. 102
4.2.5 this 关键字.............. 102
4.3 清除:收尾和垃圾收集..........105
4.3.1 finalize()用途何在.............. 105
4.3.2 必须执行清除..................... 106
4.4 成员初始化...................108
4.4.1 规定初始化............. 109
4.4.2 构建器初始化..................... 111
4.5 数组初始化...................116
4.5.1 多维数组................. 119
4.6 总结...................121
4.7 练习...................121
第 5 章隐藏实施过程 ............123
5.1 包:库单元...................123
5.1.1 创建独一无二的包名..................... 124
5.1.2 自定义工具库..................... 126
5.1.3 利用导入改变行为............ 128
5.1.4 包的停用................. 130
5.2 Java 访问指示符......................130
5.2.1 “友好的”............. 130
5.2.2 public:接口访问.............. 131
5.2.3 private:不能接触!...................... 132
5.2.4 protected:“友好的一种”......... 133
5.3 接口与实现...................134
5.4 类访问...............135
5.5 总结...................136
5.6 练习...................137
第 6 章类再生 ............139
6.1 合成的语法...................139
6.2 继承的语法...................141
6.2.1 初始化基础类..................... 143
6.3 合成与继承的结合..................145
6.3.1 确保正确的清除................. 146
6.3.2 名字的隐藏............. 148
6.4 到底选择合成还是继承..........149
6.5 protected ........................ 150
6.6 累积开发.......................151
6.7 上溯造型.......................151
6.7.1 何谓“上溯造型”?..................... 152
6.8 final 关键字...................152
6.8.1 final 数据................. 152
20
6.8.2 final 方法................. 155
6.8.3 final 类..................... 156
6.8.4 final 的注意事项................ 156
6.9 初始化和类装载.......................157
6.9.1 继承初始化............. 157
6.10 总结.................158
6.11 练习.................159
第 7 章多形性 ............160
7.1 上溯造型.......................160
7.1.1 为什么要上溯造型............ 161
7.2 深入理解.......................162
7.2.1 方法调用的绑定................. 163
7.2.2 产生正确的行为................. 163
7.2.3 扩展性..................... 165
7.3 覆盖与过载...................168
7.4 抽象类和方法..............169
7.5 接口...................172
7.5.1 Java 的“多重继承”..................... 174
7.5.2 通过继承扩展接口............ 176
7.5.3 常数分组................. 177
7.5.4 初始化接口中的字段..................... 178
7.6 内部类...............179
7.6.1 内部类和上溯造型............ 180
7.6.2 方法和作用域中的内部类............ 181
7.6.3 链接到外部类..................... 186
7.6.4 static 内部类........... 187
7.6.5 引用外部类对象................. 189
7.6.6 从内部类继承..................... 190
7.6.7 内部类可以覆盖吗?..................... 190
7.6.8 内部类标识符..................... 192
7.6.9 为什么要用内部类:控制框架................. 192
7.7 构建器和多形性.......................198
7.7.1 构建器的调用顺序............ 198
7.7.2 继承和finalize() ................. 199
7.7.3 构建器内部的多形性方法的行为............ 202
7.8 通过继承进行设计..................204
7.8.1 纯继承与扩展..................... 205
7.8.2 下溯造型与运行期类型标识..................... 206
7.9 总结...................208
7.10 练习.................208
第 8 章对象的容纳 .................209
8.1 数组...................209
8.1.1 数组和第一类对象............ 209
8.1.2 数组的返回............. 212
8.2 集合...................213
8.2.1 缺点:类型未知................. 213
8.3 枚举器(反复器) ..................217
8.4 集合的类型...................220
8.4.1 Vector...................... 220
8.4.2 BitSet....................... 221
8.4.3 Stack ........................ 222
8.4.4 Hashtable.................223
8.4.5 再论枚举器............. 228
21
8.5 排序...................229
8.6 通用集合库...................232
8.7 新集合...............233
8.7.1 使用Collections................. 235
8.7.2 使用Lists................ 238
8.7.3 使用Sets ................. 242
8.7.4 使用Maps............... 244
8.7.5 决定实施方案..................... 247
8.7.6 未支持的操作..................... 253
8.7.7 排序和搜索............. 255
8.7.8 实用工具................. 259
8.8 总结...................261
8.9 练习...................262
第 9 章违例差错控制 ............263
9.1 基本违例.......................263
9.1.1 违例自变量............. 264
9.2 违例的捕获...................264
9.2.1 try 块........................ 264
9.2.2 违例控制器............. 265
9.2.3 违例规范................. 265
9.2.4 捕获所有违例..................... 266
9.2.5 重新“掷”出违例............ 267
9.3 标准 Java 违例............. 270
9.3.1 RuntimeException 的特殊情况................. 270
9.4 创建自己的违例.......................271
9.5 违例的限制...................274
9.6 用finally 清除..............276
9.6.1 用finally 做什么................ 277
9.6.2 缺点:丢失的违例............ 279
9.7 构建器...............280
9.8 违例匹配.......................283
9.8.1 违例准则................. 284
9.9 总结...................284
9.10 练习.................284
第 10 章JAVA IO 系统.......................285
10.1 输入和输出.................285
10.1.1 InputStream的类型...................... 285
10.1.2 OutputStream的类型................... 286
10.2 增添属性和有用的接口....................286
10.2.1 通过FilterInputStream 从InputStream里读入数据.................. 287
10.2.2 通过FilterOutputStream 向OutputStream 里写入数据............ 287
10.3 本身的缺陷:RandomAccessFile.................288
10.4 File 类.............288
10.4.1 目录列表器....................... 288
10.4.2 检查与创建目录...............292
10.5 IO 流的典型应用....................294
10.5.1 输入流................... 296
10.5.2 输出流................... 298
10.5.3 快捷文件处理................... 298
10.5.4 从标准输入中读取数据............... 300
10.5.5 管道数据流....................... 300
10.6 StreamTokenizer......................300
22
10.6.1 StringTokenizer ................ 303
10.7 Java 1.1 的IO 流....................305
10.7.1 数据的发起与接收.......... 305
10.7.2 修改数据流的行为.......... 306
10.7.3 未改变的类....................... 306
10.7.4 一个例子............... 307
10.7.5 重导向标准IO.................. 310
10.8 压缩.................311
10.8.1 用GZIP 进行简单压缩................ 311
10.8.2 用Zip 进行多文件保存............... 312
10.8.3 Java 归档(jar)实用程序.......... 314
10.9 对象序列化.................315
10.9.1 寻找类................... 318
10.9.2 序列化的控制................... 319
10.9.3 利用“持久性”...............326
10.10 总结...............332
10.11 练习...............332
第 11 章运行期类型鉴定...................333
11.1 对RTTI 的需要.......................333
11.1.1 Class 对象............. 334
11.1.2 造型前的检查................... 337
11.2 RTTI 语法....................342
11.3 反射:运行期类信息............343
11.3.1 一个类方法提取器.......... 344
11.4 总结.................347
11.5 练习.................348
第 12 章传递和返回对象...................349
12.1 传递句柄.....................349
12.1.1 别名问题............... 349
12.2 制作本地副本............351
12.2.1 按值传递............... 351
12.2.2 克隆对象............... 352
12.2.3 使类具有克隆能力.......... 353
12.2.4 成功的克隆....................... 353
12.2.5 Object.clone()的效果................... 355
12.2.6 克隆合成对象................... 356
12.2.7 用Vector 进行深层复制.............. 358
12.2.8 通过序列化进行深层复制.......... 359
12.2.9 使克隆具有更大的深度............... 361
12.2.10 为什么有这个奇怪的设计..................... 362
12.3 克隆的控制.................363
12.3.1 副本构建器....................... 366
12.4 只读类............369
12.4.1 创建只读类....................... 370
12.4.2 “一成不变”的弊端................... 371
12.4.3 不变字串............... 373
12.4.4 String 和StringBuffer 类............. 374
12.4.5 字串的特殊性................... 376
12.5 总结.................376
12.6 练习.................376
第十三 章创建窗口和程序片 ............378
13.1 为何要用AWT ?....................378
23
13.2 基本程序片.................379
13.2.1 程序片的测试................... 380
13.2.2 一个更图形化的例子................... 381
13.2.3 框架方法的演示...............381
13.3 制作按钮.....................382
13.4 捕获事件.....................382
13.5 文本字段.....................384
13.6 文本区域.....................385
13.7 标签.................386
13.8 复选框............387
13.9 单选钮............388
13.10 下拉列表...................389
13.11 列表框.......................390
13.11.1 handleEvent() .................. 391
13.12 布局的控制..............393
13.12.1 FlowLayout..................... 393
13.12.2 BorderLayout .................. 393
13.12.3 GridLayout...................... 394
13.12.4 CardLayout...................... 394
13.12.5 GridBagLayout...............396
13.13 action 的替代品....................396
13.14 程序片的局限.......................400
13.14.1 程序片的优点................. 401
13.15 视窗化应用..............401
13.15.1 菜单..................... 401
13.15.2 对话框................. 404
13.16 新型AWT .................. 408
13.16.1 新的事件模型................. 409
13.16.2 事件和接收者类型..................... 410
13.16.3 用Java 1.1 AWT制作窗口和程序片............... 414
13.16.4 再研究一下以前的例子............ 416
13.16.5 动态绑定事件................. 431
13.16.6 将事务逻辑与UI 逻辑区分开.............. 433
13.16.7 推荐编码方法................. 435
13.17 Java 1.1 用户接口API.....................448
13.17.1 桌面颜色............ 448
13.17.2 打印..................... 448
13.17.3 剪贴板................. 454
13.18 可视编程和Beans...............456
13.18.1 什么是Bean.................... 457
13.18.2 用Introspector 提取BeanInfo............... 458
13.18.3 一个更复杂的Bean ................... 463
13.18.4 Bean 的封装.................... 465
13.18.5 更复杂的Bean 支持................... 466
13.18.6 Bean 更多的知识........... 466
13.19 Swing 入门(注释⑦)....................467
13.19.1 Swing 有哪些优点...................... 467
13.19.2 方便的转换..................... 467
13.19.3 显示框架............ 468
13.19.4 工具提示............ 469
13.19.5 边框..................... 469
13.19.6 按钮..................... 470
13.19.7 按钮组................. 471
24
13.19.8 图标..................... 472
13.19.9 菜单..................... 474
13.19.10 弹出式菜单................... 477
13.19.11 列表框和组合框.......... 479
13.19.12 滑杆和进度指示条................... 479
13.19.13 树....................... 480
13.19.14 表格................... 482
13.19.15 卡片式对话框.............. 483
13.19.16 Swing 消息框...............485
13.19.17 Swing 更多的知识.................... 485
13.20 总结...............485
13.21 练习...............486
第 14 章多线程 .......................487
14.1 反应灵敏的用户界面............487
14.1.1 从线程继承....................... 489
14.1.2 针对用户界面的多线程............... 490
14.1.3 用主类合并线程...............493
14.1.4 制作多个线程................... 495
14.1.5 Daemon 线程.................... 498
14.2 共享有限的资源.....................499
14.2.1 资源访问的错误方法................... 499
14.2.2 Java 如何共享资源.......... 503
14.2.3 回顾Java Beans ...............506
14.3 堵塞.................510
14.3.1 为何会堵塞....................... 510
14.3.2 死锁....................... 518
14.4 优先级............521
14.4.1 线程组................... 525
14.5 回顾runnable............. 530
14.5.1 过多的线程....................... 532
14.6 总结.................535
14.7 练习.................535
第 15 章网络编程...................537
15.1 机器的标识.................537
15.1.1 服务器和客户机...............538
15.1.2 端口:机器内独一无二的场所.............. 539
15.2 套接字............539
15.2.1 一个简单的服务器和客户机程序.......... 539
15.3 服务多个客户............543
15.4 数据报............547
15.5 一个Web 应用...........551
15.5.1 服务器应用....................... 552
15.5.2 NameSender程序片..................... 556
15.5.3 要注意的问题................... 560
15.6 Java 与CGI 的沟通...............560
15.6.1 CGI 数据的编码...............561
15.6.2 程序片................... 562
15.6.3 用C++写的CGI 程序.................. 566
15.6.4 POST 的概念.................... 573
15.7 用JDBC 连接数据库............576
15.7.1 让示例运行起来...............578
15.7.2 查找程序的GUI 版本.................. 580
25
15.7.3 JDBC API 为何如何复杂............ 582
15.8 远程方法.....................582
15.8.1 远程接口概念................... 582
15.8.2 远程接口的实施...............583
15.8.3 创建根与干....................... 585
15.8.4 使用远程对象................... 585
15.8.5 RMI 的替选方案.............. 586
15.9 总结.................586
15.10 练习...............586
第 16 章设计范式...................588
16.1.1 单子....................... 588
16.1.2 范式分类............... 589
16.2 观察器范式.................590
16.3 模拟垃圾回收站.....................592
16.4 改进设计.....................595
16.4.1 “制作更多的对象” ................... 595
16.4.2 用于原型创建的一个范式.......... 597
16.5 抽象的应用.................604
16.6 多重派遣.....................607
16.6.1 实现双重派遣................... 607
16.7 访问器范式.................612
16.8 RTTI 真的有害吗....................618
16.9 总结.................620
16.10 练习...............621
第 17 章项 目 ..............622
17.1 文字处理.....................622
17.1.1 提取代码列表................... 622
17.1.2 检查大小写样式...............633
17.2 方法查找工具............639
17.3 复杂性理论.................643
17.4 总结.................649
17.5 练习.................649
附 录 A 使用非JAVA 代码...............650
A.1 Java 固有接口............. 650
A.1.1 调用固有方法.................... 650
A.1.2 访问JNI 函数:JNIEnv 自变量............... 652
A.1.3 传递和使用Java 对象................... 653
A.1.4 JNI 和Java 异常................ 654
A.1.5 JNI 和线程处理................. 655
A.1.6 使用现成代码.................... 655
A.2 微软的解决方案......................655
A.3 J/Direct.............655
A.3.1 @dll.import 引导命令................... 656
A.3.2 com.ms.win32 包...............657
A.3.3 汇集............ 658
A.3.4 编写回调函数....................659
A.3.5 其他J/Direct 特性............. 659
A.4 本原接口(RNI)....................660
A.4.1 RNI 总结................ 661
A.5 Java/COM 集成...........661
A.5.1 COM 基础.............. 662
A.5.2 MS Java/COM 集成.......... 663
26
A.5.3 用Java 设计COM 服务器........... 663
A.5.4 用Java 设计COM 客户................ 665
A.5.5 ActiveX/Beans 集成.......... 666
A.5.6 固有方法与程序片的注意事项................ 666
A.6 CORBA .............666
A.6.1 CORBA 基础..................... 666
A.6.2 一个例子................ 667
A.6.3 Java 程序片和CORBA................. 671
A.6.4 比较CORBA 与RMI ................... 671
A.7 总结...................671
附 录B 对比C++和JAVA..................672
附 录 C JAVA编程规则.......................677
附 录 D 性能................679
D.1 基本方法......................679
D.2 寻找瓶颈......................679
D.2.1 安插自己的测试代码.................... 679
D.2.2 JDK 性能评测[2]...............679
D.2.3 特殊工具................ 680
D.2.4 性能评测的技巧................ 680
D.3 提速方法......................680
D.3.1 常规手段................ 680
D.3.2 依赖语言的方法................ 680
D.3.3 特殊情况................ 681
D.4 参考资源......................682
D.4.1 性能工具................ 682
D.4.2 Web 站点............... 682
D.4.3 文章............ 682
D.4.4 Java 专业书籍.................... 683
D.4.5 一般书籍................ 683
附 录 E 关于垃圾收集的一些话.....................684
附 录 F 推荐读物.....................686