
在《Java完全参考手册(第8版)》中,编程畅销书作者Herb Schildt向您展示了开发、编译、调试以及运行Java程序所需要掌握的全部知识。本书内容丰富,针对Java SE 7进行了全面更新,涵盖了Java语言的方方面面,包括语法、关键字以及基本的编程原则。此外,本书还介绍了Java API库的关键元素,分析了Java Bean、servlet、applet以及Swing,并通过真实的案例演示了Java在编程中的实际应用。在讲解的过程中,书中贯穿了Java SE 7的最新特性,例如带资源的try语句、在switch语句中使用字符串、使用菱形运算符“<>”的类型推断功能、NIO.2输入输出系统以及Fork/Join Framework。
前 言
Java是当今世界最重要、也是使用最广泛的计算机语言之一。而且,在多年之前它就已经拥有这一荣誉。与其他一些计算机语言随着时间的流逝、影响也逐渐减弱不同,Java随着时间的推移反而变得更加强大。从首次发布开始,Java就跃到了Internet编程的前沿。后续的每一个版本都进一步巩固了这一地位。如今,Java依然是开发基于Web的应用程序的最佳选择。此外,Java还是智能手机变革的推手,Android编程采用的就是Java语言。在现实世界中,很多应用都是使用Java开发的,Java真的是非常重要!
Java成功的一个关键原因是它的敏捷性。自从最初的1.0版发布以来,Java不断地进行完善以适应编程环境和开发人员编程方式的变化。最重要的是,Java不仅仅是在跟随潮流,更是在帮助创造潮流。Java能够适应计算机世界快速变化的能力,是它一直并且仍将如此成功的关键因素。
本书自从1996年首次出版以来,已经经历了7次改版,每次改版都反映了Java的不断演化进程。这是本书的第8版,并且已经针对Java SE 7进行了升级。因此,本版包含了大量新的内容。例如,包含了Project Coin语言改进、扩展的NIO(NIO.2)以及Fork/Join框架。总体而言,对新特性的讨论被集成到已有的章节中。然而,本书的整体结构保持不变。这意味着如果您熟悉本书的以前版本,那么阅读本版本会感觉很自然。
一本适合所有编程人员的书
本书面向所有开发人员,不管是初学者还是有经验的编程人员。初学者将从本书中发现每个主题的详细讨论,以及许多特别有帮助的例子。而对Java更高级特性和库的深入讨论,将会吸引有经验的编程人员。无论是对于初学者还是有经验的编程人员,本书都提供了持久的资源和方便实用的参考。
本书内容
本书是对Java语言的全面指导,描述了它的语法、关键字以及基本的编程原则,另外还介绍了Java API库的重要部分。本书分为4部分,每部分关注Java开发环境的不同方面。
第Ⅰ部分是对Java语言的深入辅导。该部分从基础知识开始讲解,包括数据类型、运算符、控制语句以及类等。然后本部分介绍继承、包、接口、异常处理以及多线程。本部分的最后几章介绍注解、枚举、自动装箱以及泛型等内容。本部分还介绍了I/O以及applet。
第Ⅱ部分介绍Java标准API库的关键内容。本部分的主题包括字符串、I/O、网络、标准实用工具、集合框架、applet、基于GUI的控件、图像以及并发编程(包括新的Fork/Join框架)等。
第Ⅲ部分分析三个重要的Java技术:Java Bean、servlet和Swing。
第Ⅳ部分包含两章,这两章展示了几个实际的Java程序。本部分的第33章开发了几个执行各种流行金融计算的applet,如定期还贷、获得预期养老金的最小投资额等。本章还介绍如何将这些applet转换成servlet。本部分的第34章开发了一个用于监控文件下载过程的下载管理器,其功能包括启动、停止和恢复传输。这两章都改编自我的著作The Art Of Java,本书由我和James Holmes合著。
不要忘记:Web上的代码
请记住,本书中全部示例程序的源代码都可以从www.oraclepressbooks.com上免费下载。
致 谢
在此我要特别感谢Patrick Naughton、Joe O’Neil、James Holmes和Danny Coward。
Patrick Naughton是Java语言的创立者之一,他还帮助我编写了本书的第1版。例如,本书第19、20和25章的大部分材料最初都是由Patrick提供的,他还为本书做出了其他许多贡献。他的洞察力、专业知识和活力都对本书的成功付梓贡献极大。
在准备本书的第2版和第3版的过程中,Joe O’Neil为目前本书第28、29、31和32章的内容提供了原始素材。Joe对我的好几本书都有帮助,并且他提供的帮助一直都是最高质量的。
James Holmes提供了第34章的内容。James是一位卓越的程序员和作者,他和我合著了The Art of Java一书,他还是Struts:The Complete Reference的作者以及JSF:The Complete Reference的合著者之一。
Danny Coward是本书第8版的技术编辑。他的忠告、洞察力和建议都有巨大的价值,对此表示非常感谢。
如何进一步学习
《Java完全参考手册(第8版)》开启了Herb Schildt编程图书系列的大门。下面是其他一些您可能感兴趣的图书。
要进一步学些Java编程,我们推荐下列书籍:
Herb Schildt’s Java Programming Cookbook
Java:A Beginner’s Guide
Swing:A Beginner’s Guide
The Art of Java
要学习C++,您将会发现下列书籍特别有用:
C++:The Complete Reference
Herb Schildt’s C++ Programming Cookbook
C++:A Beginner’s Guide
The Art of C++
C++ From the Ground Up
STL Programming From the Ground Up
要学习C#,我们建议阅读下列图书:
C#:The Complete Reference
C#:A Beginner’s Guide
要学习C语言,下面这本书您可能会感兴趣:
C:The Complete Reference
目 录
第Ⅰ部分 Java语言
第1章 Java的历史和演变 3
1.1 Java的家世 4
1.1.1 现代编程语言的诞生:
C语言 4
1.1.2 C++:下一个阶段 5
1.1.3 Java出现的时机已经成熟 6
1.2 Java的诞生 6
1.3 Java改变Internet的方式 8
1.3.1 Java applet 8
1.3.2 安全性 8
1.3.3 可移植性 9
1.4 Java的魔力:字节码 9
1.5 servlet:服务器端的Java 10
1.6 Java的关键特性 10
1.6.1 简单性 10
1.6.2 面向对象 11
1.6.3 健壮性 11
1.6.4 多线程 11
1.6.5 体系结构中立 11
1.6.6 解释执行和高性能 12
1.6.7 分布式 12
1.6.8 动态性 12
1.7 Java的演变历程 12
1.8 文化革新 15
第2章 Java综述 17
2.1 面向对象编程 17
2.1.1 两种范式 18
2.1.2 抽象 18
2.1.3 OOP三原则 19
2.2 第一个简单程序 23
2.2.1 输入程序 23
2.2.2 编译程序 23
2.2.3 深入分析第一个示例程序 24
2.3 第二个简短程序 26
2.4 两种控制语句 28
2.4.1 if语句 28
2.4.2 for循环 29
2.5 使用代码块 30
2.6 词汇问题 32
2.6.1 空白符 32
2.6.2 标识符 32
2.6.3 字面值 32
2.6.4 注释 32
2.6.5 分隔符 33
2.6.6 Java关键字 33
2.7 Java类库 34
第3章 数据类型、变量和数组 35
3.1 Java是强类型化的语言 35
3.2 基本类型 36
3.3 整型 36
3.3.1 byte 37
3.3.2 short 37
3.3.3 int 37
3.3.4 long 37
3.4 浮点型 38
3.4.1 float 38
3.4.2 double 39
3.5 字符型 39
3.6 布尔型 41
3.7 深入分析字面值 42
3.7.1 整型字面值 42
3.7.2 浮点型字面值 43
3.7.3 布尔型字面值 44
3.7.4 字符型字面值 44
3.7.5 字符串字面值 44
3.8 变量 45
3.8.1 变量的声明 45
3.8.2 动态初始化 45
3.8.3 变量的作用域和生命周期 46
3.9 类型转换和强制类型转换 48
3.9.1 Java的自动类型转换 49
3.9.2 强制转换不兼容的类型 49
3.10 表达式中的自动类型提升 50
3.11 数组 52
3.11.1 一维数组 52
3.11.2 多维数组 54
3.11.3 另一种数组声明语法 58
3.12 关于字符串的一些说明 59
3.13 向C/C++程序员提供指针
方面的注解 60
第4章 运算符 61
4.1 算术运算符 61
4.1.1 基本算术运算符 62
4.1.2 求模运算符 63
4.1.3 算术与赋值复合运算符 64
4.1.4 自增与自减运算符 65
4.2 位运算符 66
4.2.1 位逻辑运算符 68
4.2.2 左移 70
4.2.3 右移 71
4.2.4 无符号右移 73
4.2.5 位运算符与赋值的组合 74
4.3 关系运算符 75
4.4 布尔逻辑运算符 76
4.5 赋值运算符 78
4.6 “?”运算符 78
4.7 运算符的优先级 79
4.8 使用圆括号 80
第5章 控制语句 83
5.1 Java的选择语句 83
5.1.1 if语句 84
5.1.2 switch语句 87
5.2 迭代语句 91
5.2.1 while语句 92
5.2.2 do-while语句 93
5.2.3 for语句 96
5.2.4 for循环的for-each版本 100
5.2.5 嵌套的循环 105
5.3 跳转语句 106
5.3.1 使用break语句 106
5.3.2 使用continue语句 110
5.3.3 return语句 111
第6章 类 113
6.1 类的基础知识 114
6.1.1 类的一般形式 114
6.1.2 一个简单的类 115
6.2 声明对象 117
6.3 为对象引用变量赋值 119
6.4 方法 120
6.4.1 为Box类添加方法 120
6.4.2 返回值 122
6.4.3 添加带参数的方法 124
6.5 构造函数 126
6.6 this关键字 129
6.7 垃圾回收 130
6.8 finalize()方法 130
6.9 堆栈类 131
第7章 方法和类的深入分析 135
7.1 重载方法 135
7.2 将对象用作参数 140
7.3 参数传递的深入分析 143
7.4 返回对象 145
7.5 递归 146
7.6 访问控制 148
7.7 理解static 151
7.8 final介绍 153
7.9 重新审视数组 154
7.10 嵌套类和内部类 156
7.11 String类介绍 158
7.12 使用命令行参数 161
7.13 varargs:可变长度参数 162
7.13.1 重载varargs方法 165
7.13.2 varargs方法与模糊性 166
第8章 继承 169
8.1 继承的基础知识 169
8.1.1 成员访问与继承 171
8.1.2 一个更实际的例子 172
8.1.3 超类变量可以引用子类
对象 174
8.2 使用super关键字 175
8.2.1 使用super调用超类的
构造函数 176
8.2.2 super的另一种用法 179
8.3 创建多级继承层次 180
8.4 构造函数的调用时机 183
8.5 方法重写 184
8.6 动态方法调度 187
8.6.1 重写方法的目的 189
8.6.2 应用方法重写 189
8.7 使用抽象类 191
8.8 在继承中使用final关键字 193
8.8.1 使用final关键字阻止
重写 194
8.8.2 使用final关键字阻止
继承 194
8.9 Object类 195
第9章 包和接口 197
9.1 包 198
9.1.1 定义包 198
9.1.2 包查找与CLASSPATH 199
9.1.3 一个简短的包示例 199
9.2 访问保护 200
9.3 导入包 204
9.4 接口 206
9.4.1 定义接口 207
9.4.2 实现接口 207
9.4.3 嵌套接口 210
9.4.4 应用接口 211
9.4.5 接口中的变量 214
9.4.6 接口可以扩展 216
第10章 异常处理 219
10.1 异常处理的基础知识 219
10.2 异常类型 220
10.3 未捕获的异常 221
10.4 使用try和catch 222
10.5 多条catch子句 224
10.6 嵌套的try语句 226
10.7 throw 228
10.8 throws 229
10.9 finally 230
10.10 Java的内置异常 232
10.11 创建自己的异常子类 233
10.12 链式异常 235
10.13 JDK 7中3个新的
异常特性 237
10.14 使用异常 238
第11章 多线程编程 239
11.1 Java线程模型 240
11.1.1 线程优先级 241
11.1.2 同步 242
11.1.3 消息传递 242
11.1.4 Thread类和Runnable
接口 242
11.2 主线程 243
11.3 创建线程 244
11.3.1 实现Runnable接口 245
11.3.2 扩展Thread类 247
11.3.3 选择一种创建方式 248
11.4 创建多个线程 248
11.5 使用isAlive()和join()方法 250
11.6 线程优先级 252
11.7 同步 253
11.7.1 使用同步方法 253
11.7.2 synchronized语句 255
11.8 线程间通信 257
11.9 挂起、恢复与停止线程 263
11.9.1 Java 1.1以前使用的挂起、
恢复和停止线程的方式 264
11.9.2 挂起、恢复与停止线程的
现代方式 266
11.10 获取线程的状态 268
11.11 使用多线程 270
第12章 枚举、自动装箱与注解
(元数据) 271
12.1 枚举 271
12.1.1 枚举的基础知识 272
12.1.2 values()和valueOf()
方法 274
12.1.3 Java枚举是类类型 275
12.1.4 枚举继承自Enum类 278
12.1.5 另一个枚举示例 279
12.2 类型封装器 281
12.2.1 Character封装器 281
12.2.2 Boolean封装器 282
12.2.3 数值类型封装器 282
12.3 自动装箱 283
12.3.1 自动装箱与方法 284
12.3.2 表达式中发生的
自动装箱/拆箱 285
12.3.3 布尔型和字符型数值的
自动装箱/拆箱 287
12.3.4 自动装箱/拆箱有助于
防止错误 287
12.3.5 一些警告 288
12.4 注解(元数据) 289
12.4.1 注解的基础知识 289
12.4.2 指定保留策略 289
12.4.3 在运行时使用反射获取
注解 290
12.4.4 AnnotatedElement接口 296
12.4.5 使用默认值 296
12.4.6 标记注解 297
12.4.7 单成员注解 298
12.4.8 内置注解 300
12.4.9 一些限制 301
第13章 I/O、applet以及其他主题 303
13.1 I/O的基础知识 304
13.1.1 流 304
13.1.2 字节流和字符流 304
13.1.3 预定义流 306
13.2 读取控制台输入 307
13.2.1 读取字符 307
13.2.2 读取字符串 308
13.3 向控制台写输出 310
13.4 PrintWriter类 311
13.5 读/写文件 312
13.6 自动关闭文件 318
13.7 applet的基础知识 321
13.8 transient和volatile修饰符 324
13.9 使用instanceof运算符 324
13.10 strictfp 327
13.11 本地方法 327
13.12 使用断言 331
13.13 静态导入 334
13.14 通过this()调用重载的
构造函数 336
第14章 泛型 339
14.1 什么是泛型 340
14.2 一个简单的泛型示例 340
14.2.1 泛型只使用对象 344
14.2.2 基于不同类型参数的泛型类型是不同的 344
14.2.3 泛型提升类型安全性的原理 344
14.3 带两个类型参数的泛型类 347
14.4 泛型类的一般形式 348
14.5 有界类型 349
14.6 使用通配符参数 351
14.7 创建泛型方法 359
14.8 泛型接口 362
14.9 原始类型与遗留代码 364
14.10 泛型类层次 367
14.10.1 使用泛型超类 367
14.10.2 泛型子类 369
14.10.3 泛型层次中的运行时类型比较 370
14.10.4 强制转换 373
14.10.5 重写泛型类的方法 373
14.11 泛型的类型推断 374
14.12 擦拭 376
14.13 模糊性错误 379
14.14 使用泛型的一些限制 381
14.14.1 不能实例化类型参数 381
14.14.2 对静态成员的一些限制 381
14.14.3 对泛型数组的一些限制 382
14.14.4 对泛型异常的限制 383
第Ⅱ部分 Java库
第15章 字符串处理 387
15.1 String类的构造函数 388
15.2 字符串的长度 390
15.3 特殊的字符串操作 391
15.3.1 字符串字面值 391
15.3.2 字符串连接 391
15.3.3 字符串和其他数据类型的连接 392
15.3.4 字符串转换和toString()方法 393
15.4 提取字符 394
15.4.1 charAt() 394
15.4.2 getChars() 394
15.4.3 getBytes() 395
15.4.4 toCharArray() 395
15.5 比较字符串 395
15.5.1 equals()和equalsIgnoreCase() 395
15.5.2 regionMatches() 396
15.5.3 startsWith()和endsWith() 397
15.5.4 equals()与== 397
15.5.5 compareTo() 398
15.6 查找字符串 399
15.7 修改字符串 401
15.7.1 substring() 401
15.7.2 concat() 402
15.7.3 replace() 402
15.7.4 trim() 403
15.8 使用valueOf()转换数据 404
15.9 改变字符串中字符的大小写 404
15.10 其他String方法 405
15.11 StringBuffer类 406
15.11.1 StringBuffer类的构造函数 406
15.11.2 length()与capacity() 407
15.11.3 ensureCapacity() 407
15.11.4 setLength() 408
15.11.5 charAt()与setCharAt() 408
15.11.6 getChars() 409
15.11.7 append() 409
15.11.8 insert() 409
15.11.9 reverse() 410
15.11.10 delete()与deleteCharAt() 411
15.11.11 replace() 411
15.11.12 substring() 412
15.11.13 其他StringBuffer方法 412
15.12 StringBuilder类 413
第16章 探究java.lang 415
16.1 基本类型封装器 416
16.1.1 Number 416
16.1.2 Double与Float 417
16.1.3 理解isInfinite()与isNaN() 420
16.1.4 Byte、Short、Integer和Long 420
16.1.5 Character 427
16.1.6 对Unicode代码点的附加支持 430
16.1.7 Boolean 431
16.2 Void类 432
16.3 Process类 432
16.4 Runtime类 433
16.4.1 内存管理 434
16.4.2 执行其他程序 435
16.5 ProcessBuilder类 436
16.6 System类 439
16.6.1 使用currentTimeMillis()计时程序的执行 440
16.6.2 使用arraycopy() 441
16.6.3 环境属性 442
16.7 Object类 442
16.8 使用clone()方法和Cloneable接口 443
16.9 Class类 445
16.10 ClassLoader类 448
16.11 Math类 448
16.11.1 三角函数 448
16.11.2 指数函数 449
16.11.3 舍入函数 449
16.11.4 其他数学方法 450
16.12 StrictMath类 452
16.13 Compiler类 452
16.14 Thread类、ThreadGroup类和Runnable接口 452
16.14.1 Runnable接口 452
16.14.2 Thread类 452
16.14.3 ThreadGroup类 454
16.15 ThreadLocal和InheritableThreadLocal类 459
16.16 Package类 459
16.17 RuntimePermission类 460
16.18 Throwable类 460
16.19 SecurityManager类 460
16.20 StackTraceElement类 460
16.21 Enum类 461
16.22 ClassValue类 462
16.23 CharSequence接口 462
16.24 Comparable接口 462
16.25 Appendable接口 463
16.26 Iterable接口 463
16.27 Readable接口 464
16.28 AutoCloseable接口 464
16.29 Thread.UncaughtException-Handler接口 464
16.30 java.lang子包 464
16.30.1 java.lang.annotation 465
16.30.2 java.lang.instrument 465
16.30.3 java.lang.invoke 465
16.30.4 java.lang.management 465
16.30.5 java.lang.ref 465
16.30.6 java.lang.reflect 465
第17章 java.util第1部分:集合框架 467
17.1 集合概述 468
17.2 JDK 5对集合框架的修改 469
17.2.1 泛型从根本上改变了集合框架 470
17.2.2 自动装箱使得使用基本类型更加容易 470
17.2.3 for-each风格的循环 470
17.3 集合接口 470
17.3.1 Collection接口 471
17.3.2 List接口 473
17.3.3 Set接口 474
17.3.4 SortedSet接口 474
17.3.5 NavigableSet接口 475
17.3.6 Queue接口 476
17.3.7 Deque接口 477
17.4 集合类 479
17.4.1 ArrayList类 480
17.4.2 LinkedList类 483
17.4.3 HashSet类 484
17.4.4 LinkedHashSet类 486
17.4.5 TreeSet类 486
17.4.6 PriorityQueue类 487
17.4.7 ArrayDeque类 488
17.4.8 EnumSet类 489
17.5 通过迭代器访问集合 490
17.5.1 使用迭代器 491
17.5.2 使用for-each循环替代迭代器 493
17.6 在集合中存储用户定义的类 494
17.7 RandomAccess接口 495
17.8 使用映射 496
17.8.1 映射接口 496
17.8.2 映射类 500
17.9 比较器 505
17.10 集合算法 508
17.11 Arrays类 513
17.12 需要泛型集合的原因 518
17.13 遗留的类和接口 521
17.13.1 Enumeration接口 521
17.13.2 Vector类 521
17.13.3 Stack类 525
17.13.4 Dictionary类 527
17.13.5 Hashtable类 528
17.13.6 Properties类 532
17.13.7 使用store()和load() 535
17.14 集合小结 537
第18章 java.util第2部分:更多实用工具类 539
18.1 StringTokenizer类 539
18.2 BitSet类 541
18.3 Date类 544
18.4 Calendar类 546
18.5 GregorianCalendar类 549
18.6 TimeZone类 550
18.7 SimpleTimeZone类 551
18.8 Locale类 552
18.9 Random类 554
18.10 Observable类 555
18.10.1 Observer接口 556
18.10.2 Observer示例 556
18.11 Timer和TimerTask类 559
18.12 Currency类 561
18.13 Formatter类 562
18.13.1 Formatter类的构造函数 563
18.13.2 Formatter类的方法 563
18.13.3 格式化的基础知识 564
18.13.4 格式化字符串和字符 566
18.13.5 格式化数字 566
18.13.6 格式化时间和日期 567
18.13.7 %n和%%说明符 569
18.13.8 指定最小字段宽度 569
18.13.9 指定精度 571
18.13.10 使用格式标志 572
18.13.11 对齐输出 572
18.13.12 空格、“+”、“0”以及“(”标志 573
18.13.13 逗号标志 574
18.13.14 “#:”标志 574
18.13.15 大写选项 574
18.13.16 使用参数索引 575
18.13.17 关闭Formatter对象 577
18.13.18 printf()方法 577
18.14 Scanner类 577
18.14.1 Scanner类的构造函数 577
18.14.2 扫描的基础知识 578
18.14.3 一些Scanner示例 581
18.14.4 设置定界符 585
18.14.5 其他Scanner特性 587
18.15 ResourceBundle、ListResourceBundle和PropertyResourceBundle类 588
18.16 其他实用工具类和接口 592
18.17 java.util子包 593
18.17.1 java.util.concurrent、
java.util.concurrent.atomic和java.util.concurrent.locks 593
18.17.2 java.util.jar 593
18.17.3 java.util.logging 593
18.17.4 java.util.prefs 593
18.17.5 java.util.regex 594
18.17.6 java.util.spi 594
18.17.7 java.util.zip 594
第19章 输入/输出:探究Java.io 595
19.1 I/O类和接口 596
19.2 File类 597
19.2.1 600
19.2.2 使用FilenameFilter接口 601
19.2.3 listFiles()方法 602
19.2.4 创建 602
19.3 AutoCloseable、Closeable和Flushable接口 602
19.4 I/O异常 603
19.5 关闭流的两种方式 604
19.6 流类 605
19.7 字节流 605
19.7.1 InputStream类 605
19.7.2 OutputStream类 606
19.7.3 FileInputStream类 606
19.7.4 FileOutputStream类 609
19.7.5 ByteArrayInputStream类 611
19.7.6 ByteArrayOutputStream类 613
19.7.7 过滤的字节流 614
19.7.8 缓存的字节流 614
19.7.9 SequenceInputStream类 618
19.7.10 PrintStream类 620
19.7.11 DataOutputStream和DataInputStream类 622
19.7.12 RandomAccessFile类 624
19.8 字符流 625
19.8.1 Reader类 625
19.8.2 Writer类 626
19.8.3 FileReader类 627
19.8.4 FileWriter类 627
19.8.5 CharArrayReader类 628
19.8.6 CharArrayWriter类 630
19.8.7 BufferedReader类 631
19.8.8 BufferedWriter类 633
19.8.9 PushbackReader类 633
19.8.10 PrintWriter类 634
19.9 Console类 635
19.10 串行化 637
19.10.1 Serializable接口 637
19.10.2 Externalizable接口 637
19.10.3 ObjectOutput接口 638
19.10.4 ObjectOutputStream类 638
19.10.5 ObjectInput接口 639
19.10.6 ObjectInputStream类 640
19.10.7 串行化示例 641
19.11 流的优点 642
第20章 探究NIO 643
20.1 NIO类 643
20.2 NIO的基础知识 644
20.2.1 缓存 644
20.2.2 通道 646
20.2.3 字符集和选择器 647
20.3 JDK 7对NIO的增强 648
20.3.1 Path接口 648
20.3.2 Files类 649
20.3.3 Path接口 651
20.3.4 文件属性接口 652
20.3.5 FileSystem、FileSystems和FileStore类 654
20.4 使用NIO系统 654
20.4.1 为基于通道的I/O使用NIO 654
20.4.2 为基于流的I/O使用NIO 663
20.4.3 为路径和文件系统操作使用NIO 666
20.5 JDK 7之前基于通道的例子 674
20.5.1 读文件(JDK 7之前) 674
20.5.2 写文件(JDK 7之前) 677
第21章 联网 681
21.1 联网的基础知识 682
21.2 联网类和接口 683
21.3 InetAddress类 683
21.3.1 工厂方法 684
21.3.2 实例方法 685
21.4 Inet4Address类和Inet6Address类 685
21.5 TCP/IP客户端套接字 686
21.6 URL类 689
21.7 URLConnection类 691
21.8 HttpURLConnection类 694
21.9 URI类 696
21.10 cookie 696
21.11 TCP/IP服务器套接字 696
21.12 数据报 697
21.12.1 DatagramSocket类 697
21.12.2 DatagramPacket类 698
21.12.3 数据报示例 699
第22章 Applet类 701
22.1 applet的两种类型 701
22.2 applet的基础知识 702
22.3 applet的架构 704
22.4 applet的骨架 705
22.4.1 applet的初始化和终止 706
22.4.2 重写update()方法 707
22.5 简单的applet显示方法 707
22.6 请求重画 709
22.7 使用状态栏窗口 712
22.8 HTML APPLET标签 713
22.9 向applet传递参数 714
22.10 getDocumentBase()和getCodeBase() 718
22.11 AppletContext接口和showDocument()方法 718
22.12 AudioClip接口 720
22.13 AppletStub接口 720
22.14 向控制台输出 720
第23章 事件处理 721
23.1 两种事件处理机制 722
23.2 委托事件模型 722
23.2.1 事件 722
23.2.2 事件源 723
23.2.3 事件监听器 723
23.3 事件类 724
23.3.1 ActionEvent类 725
23.3.2 AdjustmentEvent类 726
23.3.3 ComponentEvent类 726
23.3.4 ContainerEvent类 727
23.3.5 FocusEvent类 727
23.3.6 InputEvent类 728
23.3.7 ItemEvent类 729
23.3.8 KeyEvent类 730
23.3.9 MouseEvent类 730
23.3.10 MouseWheelEvent类 732
23.3.11 TextEvent类 733
23.3.12 WindowEvent类 733
23.4 事件源 734
23.5 事件监听器接口 735
23.5.1 ActionListener接口 736
23.5.2 AdjustmentListener接口 736
23.5.3 ComponentListener接口 736
23.5.4 ContainerListener接口 736
23.5.5 FocusListener接口 736
23.5.6 ItemListener接口 736
23.5.7 KeyListener接口 737
23.5.8 MouseListener接口 737
23.5.9 MouseMotionListener接口 737
23.5.10 MouseWheelListener接口 737
23.5.11 TextListener接口 738
23.5.12 WindowFocusListener接口 738
23.5.13 WindowListener接口 738
23.6 使用委托事件模型 738
23.6.1 处理鼠标事件 739
23.6.2 处理键盘事件 741
23.7 适配器类 744
23.8 内部类 746
第24章 AWT介绍:使用窗口、图形和文本 749
24.1 AWT类 750
24.2 窗口基本元素 752
24.2.1 Component类 752
24.2.2 Container类 753
24.2.3 Panel类 753
24.2.4 Window类 753
24.2.5 Frame类 753
24.2.6 Canvas类 753
24.3 使用框架窗口 753
24.3.1 设置窗口的尺寸 754
24.3.2 隐藏和显示窗口 754
24.3.3 设置窗口的标题 754
24.3.4 关闭框架窗口 754
24.4 在applet中创建框架窗口 755
24.5 创建基于窗口的程序 761
24.6 在窗口中显示信息 763
24.7 使用图形 763
24.7.1 绘制直线 764
24.7.2 绘制矩形 765
24.7.3 绘制椭圆和圆 765
24.7.4 绘制弧形 766
24.7.5 绘制多边形 767
24.7.6 改变图形的大小 767
24.8 使用颜色 768
24.8.1 Color类的方法 769
24.8.2 设置当前图形的颜色 770
24.8.3 一个演示颜色的applet 770
24.9 设置绘图模式 771
24.10 使用字体 773
24.10.1 确定可用字体 774
24.10.2 创建和选择字体 775
24.10.3 获取字体信息 777
24.11 使用FontMetrics管理文本输出 778
24.11.1 显示多行文本 779
24.11.2 居中显示文本 781
24.11.3 对齐多行文本 782
第25章 使用AWT控件、布局管理器和菜单 787
25.1 控件的基础知识 788
25.1.1 添加和移除控件 788
25.1.2 响应控件 788
25.1.3 HeadlessException异常 788
25.2 使用标签 789
25.3 使用命令按钮 790
25.4 使用复选框 793
25.5 使用复选框组 795
25.6 使用下拉列表 796
25.7 使用列表框 798
25.8 管理滚动条 801
25.9 使用TextField 804
25.10 使用TextArea 807
25.11 理解布局管理器 808
25.11.1 FlowLayout布局管理器 809
25.11.2 BorderLayout布局管理器 811
25.11.3 使用Insets 812
25.11.4 GridLayout布局管理器 814
25.11.5 CardLayout布局管理器 815
25.11.6 GridBagLayout布局管理器 818
25.12 菜单栏和菜单 823
25.13 对话框 829
25.14 FileDialog类 834
25.15 扩展AWT控件以处理事件 835
25.15.1 扩展按钮 836
25.15.2 扩展复选框 837
25.15.3 扩展复选框组 838
25.15.4 扩展下拉列表 839
25.15.5 扩展列表框 840
25.15.6 扩展滚动条 841
25.16 关于重载paint()方法 842
第26章 图像 843
26.1 文件格式 844
26.2 图像基础:创建、加载与显示 844
26.2.1 创建Image对象 844
26.2.2 加载图像 845
26.2.3 显示图像 845
26.3 ImageObserver接口 846
26.4 双缓存 848
26.5 MediaTracker类 850
26.6 ImageProducer接口 853
26.7 ImageConsumer接口 855
26.8 ImageFilter类 857
26.8.1 CropImageFilter类 858
26.8.2 RGBImageFilter类 860
26.9 单元格动画 870
26.10 其他图像类 873
第27章 并发实用工具 875
27.1 并发API包 876
27.1.1 java.util.concurrent包 876
27.1.2 java.util.concurrent.atomic包 877
27.1.3 java.util.concurrent.locks包 877
27.2 使用同步对象 877
27.2.1 Semaphore类 878
27.2.2 CountDownLatch类 884
27.2.3 CyclicBarrier类 885
27.2.4 Exchanger类 888
27.2.5 Phaser类 890
27.3 使用执行器 898
27.3.1 一个简单的执行器示例 898
27.3.2 使用Callable和Future接口 900
27.4 TimeUnit枚举 903
27.5 并发集合 904
27.6 锁 905
27.7 原子操作 908
27.8 通过Fork/Join Framework进行并行编程 909
27.8.1 主要的Fork/Join类 909
27.8.2 分而治之的策略 912
27.8.3 一个简单的Fork/Join示例 913
27.8.4 理解并行级别带来的影响 915
27.8.5 一个使用RecursiveTask<V>的例子 918
27.8.6 异步执行任务 921
27.8.7 取消任务 921
27.8.8 确定任务的完成状态 921
27.8.9 重新启动任务 922
27.8.10 深入研究 922
27.8.11 关于Fork/Join Framework的一些提示 923
27.9 并发实用工具与Java传统方式的比较 924
第28章 正则表达式和其他包 925
28.1 核心Java API包 926
28.2 正则表达式处理 927
28.2.1 Pattern类 928
28.2.2 Matcher类 928
28.2.3 正则表达式的语法 929
28.2.4 演示模式匹配 929
28.2.5 模式匹配的两个选项 935
28.2.6 探究正则表达式 935
28.3 反射 936
28.4 远程方法调用 939
28.5 文本格式化 943
28.5.1 DateFormat类 943
28.5.2 SimpleDateFormat类 945
第Ⅲ部分 使用Java开发软件
第29章 Java Bean 951
29.1 Java Bean是什么 952
29.2 Java Bean的优势 952
29.3 反省 952
29.3.1 属性的设计模式 952
29.3.2 事件的设计模式 954
29.3.3 方法与设计模式 954
29.3.4 使用BeanInfo接口 955
29.4 绑定属性与约束属性 955
29.5 持久性 955
29.6 定制器 956
29.7 Java Bean API 956
29.7.1 Introspector类 958
29.7.2 PropertyDescriptor类 958
29.7.3 EventSetDescriptor类 958
29.7.4 MethodDescriptor类 958
29.8 一个Bean示例 958
第30章 Swing简介 963
30.1 Swing的起源 964
30.2 Swing以AWT为基础 964
30.3 两个关键的Swing特性 964
30.3.1 Swing组件是轻量级的 964
30.3.2 Swing支持可插入外观 965
30.4 MVC连接 965
30.5 组件与容器 966
30.5.1 组件 966
30.5.2 容器 967
30.5.3 顶级容器窗格 967
30.6 Swing包 967
30.7 一个简单的Swing应用程序 968
30.8 事件处理 972
30.9 创建Swing applet 975
30.10 在Swing中绘图 977
30.10.1 绘图的基础知识 977
30.10.2 计算可绘制区域 978
30.10.3 一个绘图示例 979
第31章 探究Swing 983
31.1 JLabel与ImageIcon 984
31.2 JTextField 985
31.3 Swing按钮 987
31.3.1 JButton 988
31.3.2 JToggleButton 990
31.3.3 复选框 992
31.3.4 单选按钮 994
31.4 JTabbedPane 996
31.5 JScrollPane 998
31.6 JList 1000
31.7 JComboBox 1003
31.8 树 1006
31.9 JTable 1009
31.10 继续研究Swing 1011
第32章 servlet 1013
32.1 背景 1013
32.2 sevelet的生命周期 1014
32.3 Servlet开发选项 1015
32.4 使用Tomcat 1015
32.5 一个简单的servlet 1017
32.5.1 创建和编译servlet源代码 1017
32.5.2 启动Tomcat 1018
32.5.3 启动Web浏览器并请求servlet 1018
32.6 servlet API 1018
32.7 javax.servlet包 1018
32.7.1 Servlet接口 1019
32.7.2 ServletConfig接口 1020
32.7.3 ServletContext接口 1020
32.7.4 ServletRequest接口 1020
32.7.5 ServletResponse接口 1021
32.7.6 GenericServlet类 1022
32.7.7 ServletInputStream类 1022
32.7.8 ServletOutputStream类 1022
32.7.9 servlet异常类 1022
32.8 读取servlet参数 1022
32.9 javax.servlet.http包 1024
32.9.1 HttpServletRequest接口 1025
32.9.2 HttpServletResponse接口 1025
32.9.3 HttpSession接口 1026
32.9.4 HttpSessionBindingListener接口 1027
32.9.5 Cookie类 1027
32.9.6 HttpServlet类 1028
32.9.7 HttpSessionEvent类 1029
32.9.8 HttpSessionBindingEvent类 1030
32.10 处理HTTP请求和响应 1030
32.10.1 处理HTTP GET请求 1030
32.10.2 处理HTTP POST请求 1032
32.11 使用cookie 1033
32.12 会话跟踪 1035
第Ⅳ部分 Java应用
第33章 applet和servlet在金融领域的应用 1039
33.1 计算贷款的还款额 1040
33.1.1 RegPay中声明的变量 1044
33.1.2 init()方法 1044
33.1.3 makeGUI()方法 1044
33.1.4 actionPerformed()方法 1047
33.1.5 compute()方法 1048
33.2 计算投资的未来收益 1048
33.3 计算为达到未来收益所需要的初始投资额 1052
33.4 计算为拿到期望的养老金所需要的初始投资额 1056
33.5 计算给定投资的最大收益 1060
33.6 计算贷款余额 1064
33.7 创建应用于金融领域的servlet 1068
33.7.1 将RegPay applet转换为servlet 1069
33.7.2 RegPayS servlet 1069
33.8 一些尝试 1072
第34章 使用Java创建下载管理器 1073
34.1 理解Internet下载 1074
34.2 下载管理器概述 1074
34.3 DownLoad类 1075
34.3.1 DownLoad类的变量 1079
34.3.2 DownLoad类的构造函数 1079
34.3.3 download()方法 1079
34.3.4 run()方法 1079
34.3.5 stateChanged()方法 1083
34.3.6 动作和访问器方法 1083
34.4 ProgressRenderer类 1083
34.5 DownloadsTableModel类 1084
34.5.1 addDownload()方法 1086
34.5.2 clearDownload()方法 1087
34.5.3 getColumnClass()方法 1087
34.5.4 getValueAt()方法 1087
34.5.5 update()方法 1088
34.6 DownloadManager类 1088
34.6.1 DownloadManager类的变量 1094
34.6.2 DownloadManager类的构造函数 1095
34.6.3 verifyUrl()方法 1095
34.6.4 tableSelectionChanged()方法 1096
34.6.5 updateButtons()方法 1096
34.6.6 处理动作事件 1097
34.7 编译和运行下载管理器 1098
34.8 进一步完善下载管理器 1098
附录 使用Java的文档注释 1099