首页 > 代码库 > 侃侃Thinking In Java

侃侃Thinking In Java

我是从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