对于想将Java应用于实际项目中的程序员来说,本书是一本权威性的指导书籍。
本书针对Java SE 6平台进行了全面更新,并通过大量测试过的示例说明了最重要的语言特性和类库特性。本书示例程序经过精心地设计,不但具有实用价值,而且易阅读、易理解,可以作为读者自己编写程序的良好开端。
本书试图让读者快速地了解Java SE 6的新特性,并帮助读者有效地从Java早期版本升级到最新版本,或从一种其他的语言变换为使用Java语言。作者十分注重Java语言的基本概念以及用户界面程序设计基础。本卷详细介绍以下内容:
■Java语言基础知识
■面向对象程序设计
■接口与内部类
■事件监听器模型
■Swing图形用户界面程序设计
■打包应用程序
■异常处理
■登录与调试
■泛型程序设计
■集合框架
■多线程
《Java核心技术》自第1版出版以来,一直备受广大Java程序设计人员的青睐,是一本畅销不衰的Java经典书籍。本书的两位作者Cay S.Horstmann和Gary Cornell都具有编写程序设计方面书籍的丰富经验。
众所周知,Java程序设计语言仍处于不断完善和发展的活跃时期,为了能够及时地跟上Java 的前进步伐,在短短的10余年间,本书已经修订了7次,第8版同样是为了适应Java的最新特性而重新修订的。新版主要增加了对Java标准版(Java SE 6)特性的全面介绍,并对第7版中两卷的内容安排做了部分调整。即将第7版第Ⅰ卷中的“流与文件”调到第Ⅱ卷中,将第7版第Ⅱ卷中的“集合”与“多线程”调到第Ⅰ卷中。
我们诚心地向您推荐这本书籍。它囊括了Java 2平台、标准版(J2SE)的全部基础知识。作为一本精练的技术指南和可信赖的参考书籍,其中提供了大量的应用实例,用来说明Java的重要语言规则和库功能,而且,这些示例程序都是完整且具有实际意义的。最重要的是:所有程序都已经被升级为Java SE 6,它们将成为独自编写Java程序的良好开端。
参加本书翻译的有叶乃文、邝劲筠以及杜永萍。书中文字与内容力求忠实原著,但限于译者水平有限,加上时间仓促,译文中难免有疏漏之处,敬请广大读者批评指正。
封面图
目录
- 译者序
- 前言
- 致谢
- 第1章 Java程序设计概述1
- 1.1 Java程序设计平台1
- 1.2 Java“白皮书”的关键术语2
- 1.2.1 简单性2
- 1.2.2 面向对象3
- 1.2.3 网络技能3
- 1.2.4 健壮性3
- 1.2.5 安全性4
- 1.2.6 体系结构中立4
- 1.2.7 可移植性4
- 1.2.8 解释型5
- 1.2.9 高性能5
- 1.2.10 多线程5
- 1.2.11 动态性6
- 1.3 Java Applet 与Internet6
- 1.4 Java发展简史7
- 1.5 关于Java的常见误解9
- 第2章 Java程序设计环境12
- 2.1 安装Java开发工具箱12
- 2.1.1下载JDK12
- 2.1.2 设置执行路径13
- 2.1.3 安装源代码库和文档15
- 2.1.4 安装本书中的示例16
- 2.1.5 导航Java目录16
- 2.2 选择开发环境17
- 2.3 使用命令行工具17
- 2.4 使用集成开发环境20
- 2.5 运行图形化应用程序22
- 2.6 建立并运行applet24
- 第3章 Java基本的程序设计结构28
- 3.1 一个简单的Java应用程序28
- 3.2 注释31
- 3.3 数据类型31
- 3.3.1 整型32
- 3.3.2 浮点类型32
- 3.3.3 char类型33
- 3.3.4 boolean类型35
- 3.4 变量35
- 3.4.1 变量初始化36
- 3.4.2 常量36
- 3.5 运算符37
- 3.5.1 自增运算符与自减运算符38
- 3.5.2 关系运算符与boolean运算符38
- 3.5.3 位运算符39
- 3.5.4 数学函数与常量40
- 3.5.5 数值类型之间的转换41
- 3.5.6 强制类型转换41
- 3.5.7 括号与运算符级别42
- 3.5.8 枚举类型43
- 3.6 字符串43
- 3.6.1 子串43
- 3.6.2 拼接44
- 3.6.3 不可变字符串44
- 3.6.4 检测字符串是否相等45
- 3.6.5 代码点与代码单元46
- 3.6.6 字符串API47
- 3.6.7 阅读联机API文档48
- 3.6.8 构建字符串50
- 3.7 输入输出51
- 3.7.1 读取输入52
- 3.7.2 格式化输出54
- 3.7.3 文件输入与输出57
- 3.8 控制流程58
- 3.8.1 块作用域59
- 3.8.2 条件语句59
- 3.8.3 循环62
- 3.8.4 确定循环65
- 3.8.5 多重选择:switch语句68
- 3.8.6 中断控制流程语句70
- 3.9 大数值72
- 3.10 数组74
- 3.10.1 For each循环75
- 3.10.2 数组初始化以及匿名数组76
- 3.10.3 数组拷贝76
- 3.10.4 命令行参数78
- 3.10.5 数组排序79
- 3.10.6 多维数组82
- 3.10.7 不规则数组84
- 第4章 对象与类87
- 4.1 面向对象程序设计概述87
- 4.1.1 类88
- 4.1.2 对象89
- 4.1.3 识别类89
- 4.1.4 类之间的关系90
- 4.2 使用现有类91
- 4.2.1 对象与对象变量91
- 4.2.2 Java类库中的GregorianCalendar类94
- 4.2.3 更改器方法与访问器方法95
- 4.3 用户自定义类101
- 4.3.1 一个Employee类101
- 4.3.2 多个源文件的使用104
- 4.3.3 解析Employee类104
- 4.3.4 从构造器开始105
- 4.3.5 隐式参数与显式参数106
- 4.3.6 封装的优点107
- 4.3.7 基于类的访问权限109
- 4.3.8 私有方法109
- 4.3 9 Final实例域110
- 4.4 静态域与静态方法110
- 4.4.1 静态域110
- 4.4.2 静态常量111
- 4.4.3 静态方法111
- 4.4.4 Factory方法112
- 4.4.5 Main方法113
- 4.5 方法参数115
- 4.6 对象构造120
- 4.6.1 重载120
- 4.6.2 默认域初始化121
- 4.6.3 默认构造器121
- 4.6.4 显式域初始化122
- 4.6.5 参数名123
- 4.6.6 调用另一个构造器123
- 4.6.7 初始化块124
- 4.6.8 对象析构与finalize方法127
- 4.7 包128
- 4.7.1 类的导入128
- 4.7.2 静态导入130
- 4.7.3 将类放入包中130
- 4.7.4 包作用域133
- 4.8 类路径134
- 4.9 文档注释136
- 4.9.1 注释的插入136
- 4.9.2 类注释137
- 4.9.3 方法注释137
- 4.9.4 域注释138
- 4.9.5 通用注释138
- 4.9.6 包与概述注释139
- 4.9.7 注释的抽取140
- 4.10 类设计技巧140
- 第5章 继承143
- 5.1 类、超类和子类143
- 5.1.1 继承层次149
- 5.1.2 多态149
- 5.1.3 动态绑定151
- 5.1.4 阻止继承:final类和方法152
- 5.1.5 强制类型转换154
- 5.1.6 抽象类155
- 5.1.7 受保护访问160
- 5.2 Object:所有类的超类160
- 5.2.1 Equals方法161
- 5.2.2 相等测试与继承162
- 5.2.3 HashCode方法164
- 5.2.4 ToString方法166
- 5.3 泛型数组列表171
- 5.3.1 访问数组列表元素173
- 5.3.2 类型化与原始数组列表的兼容性176
- 5.4 对象包装器与自动打包177
- 5.5 参数数量可变的方法179
- 5.6 枚举类181
- 5.7 反射182
- 5.7.1 Class类183
- 5.7.2 捕获异常184
- 5.7.3 利用反射分析类的能力186
- 5.7.4 在运行时使用反射分析对象191
- 5.7.5 使用反射编写泛型数组代码195
- 5.7.6 方法指针198
- 5.8 继承设计的技巧201
- 第6章 接口与内部类204
- 6.1 接口204
- 6.1.1 接口的特性209
- 6.1.2 接口与抽象类210
- 6.2 对象克隆211
- 6.3 接口与回调216
- 6.4 内部类219
- 6.4.1 使用内部类访问对象状态220
- 6.4.2 内部类的特殊语法规则223
- 6.4.3 内部类是否有用、必要和安全224
- 6.4.4 局部内部类226
- 6.4.5 由外部方法访问final变量226
- 6.4.6 匿名内部类229
- 6.4.7 静态内部类231
- 6.5 代理234
- 第7章 图形程序设计239
- 7.1 Swing概述239
- 7.2 创建框架242
- 7.3 框架定位244
- 7.4 框架属性246
- 7.5 决定框架大小246
- 7.6 在组件中显示信息249
- 7.7 2D图形253
- 7.8 颜色260
- 7.9 为文本设定特殊字体263
- 7.10 图像270
- 第8章 事件处理274
- 8.1 事件处理基础274
- 8.1.1 实例:处理按钮点击事件276
- 8.1.2 建议使用内部类280
- 8.1.3 创建包含一个方法调用的监听器282
- 8.1.4 实例:改变观感283
- 8.1.5 适配器类286
- 8.2 动作290
- 8.3 鼠标事件296
- 8.4 AWT事件继承层次302
- 第9章 Swing用户界面组件306
- 9.1 Swing和模型-视图-控制器设计模式306
- 9.1.1 设计模式306
- 9.1.2 模型-视图-控制器模式307
- 9.1.3 Swing按钮的模型-视图-控制器分析310
- 9.2 布局管理器概述311
- 9.2.1 边框布局313
- 9.2.2 网格布局314
- 9.3 文本输入318
- 9.3.1 文本域319
- 9.3.2 标签和标签组件320
- 9.3.3 密码域321
- 9.3.4 文本区322
- 9.3.5 滚动窗格322
- 9.4 选择组件325
- 9.4.1 复选框325
- 9.4.2 单选按钮327
- 9.4.3 边框331
- 9.4.4 组合框335
- 9.4.5 滑块338
- 9.5 菜单344
- 9.5.1 菜单创建344
- 9.5.2 菜单项中的图标346
- 9.5.3 复选框和单选按钮菜单项347
- 9.5.4 弹出菜单348
- 9.5.5 快捷键和加速器349
- 9.5.6 启用和禁用菜单项351
- 9.5.7 工具栏355
- 9.5.8 工具提示356
- 9.6 复杂的布局管理359
- 9.6.1 网格组布局360
- 9.6.2 组布局369
- 9.6.3 不使用布局管理器377
- 9.6.4 定制布局管理器378
- 9.6.5 遍历顺序382
- 9.7 对话框383
- 9.7.1 选项对话框383
- 9.7.2 创建对话框392
- 9.7.3 数据交换396
- 9.7.4 文件对话框402
- 9.7.5 颜色选择器412
- 第10章 部署应用程序和applet418
- 10.1 JAR文件418
- 10.1.1 清单文件419
- 10.1.2 可运行JAR文件420
- 10.1.3 资源421
- 10.1.4 密封423
- 10.2 Java Web Start424
- 10.2.1 沙箱427
- 10.2.2 签名代码428
- 10.2.3 JNLP API430
- 10.3 Applet437
- 10.3.1 一个简单的 applet438
- 10.3.2 将应用程序转换为applet440
- 10.3.3 Applet的HTML 标记和属性441
- 10.3.4 Object 标记444
- 10.3.5 使用参数向applet传递信息444
- 10.3.6 访问图像和音频文件449
- 10.3.7 Applet上下文450
- 10.4 应用程序存储的配置457
- 10.4.1 属性映射457
- 10.4.2 Preferences API462
- 第11章 异常、日志、断言和调试468
- 11.1 处理异常468
- 11.1.1 异常分类470
- 11.1.2 声明已检查异常471
- 11.1.3 如何抛出异常473
- 11.1.4 创建异常类474
- 11.2 捕获异常475
- 11.2.1 捕获多个异常477
- 11.2.2 再次抛出异常与异常链477
- 11.2.3 Finally子句478
- 11.2.4 分析堆栈跟踪元素481
- 11.3 使用异常机制的建议483
- 11.4 断言486
- 11.4.1 启用和禁用断言487
- 11.4.2 使用断言的建议487
- 11.4.3 为文档使用断言488
- 11.5 记录日志489
- 11.5.1 基本日志490
- 11.5.2 高级日志490
- 11.5.3 修改日志管理器配置492
- 11.5.4 本地化493
- 11.5.5 处理器494
- 11.5.6 过滤器496
- 11.5.7 格式化器497
- 11.5.8 日志记录说明497
- 11.6 调试技术505
- 11.6.1 使用控制台窗口510
- 11.6.2 跟踪AWT事件511
- 11.6.3 AWT的Robot类515
- 11.7 使用调试器519
- 第12章 泛型程序设计523
- 12.1 为什么要使用泛型程序设计523
- 12.2 简单泛型类的定义525
- 12.3 泛型方法526
- 12.4 类型变量的限定527
- 12.5 泛型代码和虚拟机529
- 12.5.1 翻译泛型表达式531
- 12.5.2 翻译泛型方法531
- 12.5.3 调用遗留代码533
- 12.6 约束与局限性534
- 12.6.1 不能用基本类型实例化类型参数534
- 12.6.2 运行时类型查询只适用于原始类型534
- 12.6.3 不能抛出也不能捕获泛型类实例535
- 12.6.4 参数化类型的数组不合法535
- 12.6.5 不能实例化类型变量536
- 12.6.6 泛型类的静态上下文中类型变量无效537
- 12.6.7 注意擦除后的冲突537
- 12.7 泛型类型的继承规则538
- 12.8 通配符类型540
- 12.8.1 通配符的超类型限定541
- 12.8.2 无限定通配符544
- 12.8.3 通配符捕获544
- 12.9 反射和泛型547
- 12.9.1 使用Class T 参数进行类型匹配548
- 12.9.2 虚拟机中的泛型类型信息549
- 第13章 集合554
- 13.1 集合接口554
- 13.1.1 将集合的接口与实现分离554
- 13.1.2 Java类库中的集合接口和迭代器接口557
- 13.2 具体的集合561
- 13.2.1 链表562
- 13.2.2 数组列表570
- 13.2.3 散列集570
- 13.2.4 树集573
- 13.2.5 对象的比较574
- 13.2.6 队列与双端队列579
- 13.2.7 优先级队列580
- 13.2.8 映射表581
- 13.2.9 专用集与映射表类585
- 13.3 集合框架589
- 13.3.1 视图与包装器592
- 13.3.2 批操作598
- 13.3.3 集合与数组之间的转换599
- 13.4 算法599
- 13.4.1 排序与混排601
- 13.4.2 二分查找603
- 13.4.3 简单算法604
- 13.4.4 编写自己的算法605
- 13.5 遗留的集合606
- 13.5.1 Hashtable 类606
- 13.5.2 枚举607
- 13.5.3 属性映射表608
- 13.5.4 栈608
- 13.5.5 位集609
- 第14章 多线程613
- 14.1 线程的概念613
- 14.2 中断线程623
- 14.3 线程状态625
- 14.3.1 新生线程626
- 14.3.2 可运行线程626
- 14.3.3 被阻塞线程和等待线程626
- 14.3.4 被终止的线程627
- 14.4 线程属性628
- 14.4.1 线程优先级628
- 14.4.2 守护线程629
- 14.4.3 未捕获异常处理器629
- 14.5 同步631
- 14.5.1 竞争条件的一个例子631
- 14.5.2 详解竞争条件635
- 14.5.3 锁对象636
- 14.5.4 条件对象639
- 14.5.5 synchronized关键字643
- 14.5.6 同步阻塞646
- 14.5.7 监视器概念647
- 14.5.8 Volatile域648
- 14.5.9 死锁649
- 14.5.10 锁测试与超时652
- 14.5.11 读/写锁653
- 14.5.12 为什么弃用stop和suspend方法654
- 14.6 阻塞队列655
- 14.7 线程安全的集合661
- 14.7.1 高效的映像、集合和队列662
- 14.7.2 写数组的拷贝663
- 14.7.3 旧的线程安全的集合663
- 14.8 Callable与Future664
- 14.9 执行器668
- 14.9.1 线程池669
- 14.9.2 预定执行673
- 14.9.3 控制任务组673
- 14.10 同步器675
- 14.10.1 信号量675
- 14.10.2 倒计时门栓675
- 14.10.3 障栅676
- 14.10.4 交换器676
- 14.10.5 同步队列677
- 14.10.6 例子:暂停动画与恢复动画677
- 14.11 线程与Swing682
- 14.11.1 运行耗时的任务683
- 14.11.2 使用Swing工作器687
- 14.11.3 单一线程规则693