Java领域极有影响力和价值的著作之一,与《Java编程思想》齐名,10余年全球畅销不衰,广受好评。
针对Java SE 9、10、11全面更新,系统全面讲解Java语言的核心概念、语法、重要特性和开发方法,包含大量案例,实践性强。
本书是一本可以指导程序员编写健壮且可维护代码的经典教程和参考书。不论是使用Java SE 9、10还是11,本书都能帮助你深入理解这门语言及其API。书中提供了数百个示例程序,所有这些代码都经过精心设计,不仅易于理解,也很容易实际应用。
这一版做了全面更新,特别是示例的更新,反映了人们期待已久的Java模块化特性,为读者展示了如何编写更易于管理和演进的代码。你会了解如何使用新的JShell的读取-计算-打印循环(REPL)进行快捷且更具探索性的开发,以及应用Process API、竞争锁定、日志和编译的重大改进。
在本卷中,作者全面深入地介绍了Java语言的基础知识和UI编程,包括对象、泛型、集合、lambda表达式、Swing设计、并发和函数式编程。如果你是一个有经验的程序员,正在转向Java SE 9、10或11,要想获得专家见解、解决方案和丰富的代码,再没有比这本书更好的资源了。
通过阅读本书,你将:
●掌握编写一流Java代码的基本技术以及Java用法和*实践
●充分利用接口、lambda表达式和内部类的强大功能
● 通过有效的异常处理和调试使程序更坚固
● 利用泛型编程编写更安全、更可重用的代码
● 利用Java的标准集合改善性能和效率
● 利用Swing工具包构建跨平台GUI
●使用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 安全性 3
- 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与Internet 6
- 1.4 Java发展简史 7
- 1.5 关于Java的常见误解 10
- 第2章 Java程序设计环境 12
- 2.1 安装Java开发工具包 12
- 2.1.1 下载JDK 12
- 2.1.2 设置JDK 14
- 2.1.3 安装库源文件和文档 16
- 2.2 使用命令行工具 16
- 2.3 使用集成开发环境 20
- 2.4 JShell 23
- 第3章 Java的基本程序设计结构 26
- 3.1 一个简单的Java应用程序 26
- 3.2 注释 29
- 3.3 数据类型 29
- 3.3.1 整型 30
- 3.3.2 浮点类型 31
- 3.3.3 char类型 32
- 3.3.4 Unicode和char类型 33
- 3.3.5 boolean类型 34
- 3.4 变量与常量 34
- 3.4.1 声明变量 34
- 3.4.2 变量初始化 35
- 3.4.3 常量 36
- 3.4.4 枚举类型 37
- 3.5 运算符 37
- 3.5.1 算术运算符 37
- 3.5.2 数学函数与常量 38
- 3.5.3 数值类型之间的转换 40
- 3.5.4 强制类型转换 41
- 3.5.5 结合赋值和运算符 41
- 3.5.6 自增与自减运算符 41
- 3.5.7 关系和boolean运算符 42
- 3.5.8 位运算符 43
- 3.5.9 括号与运算符级别 43
- 3.6 字符串 44
- 3.6.1 子串 45
- 3.6.2 拼接 45
- 3.6.3 不可变字符串 45
- 3.6.4 检测字符串是否相等 47
- 3.6.5 空串与Null串 48
- 3.6.6 码点与代码单元 48
- 3.6.7 String API 49
- 3.6.8 阅读联机API文档 51
- 3.6.9 构建字符串 54
- 3.7 输入与输出 55
- 3.7.1 读取输入 55
- 3.7.2 格式化输出 57
- 3.7.3 文件输入与输出 61
- 3.8 控制流程 62
- 3.8.1 块作用域 63
- 3.8.2 条件语句 63
- 3.8.3 循环 66
- 3.8.4 确定循环 69
- 3.8.5 多重选择:switch语句 72
- 3.8.6 中断控制流程的语句 74
- 3.9 大数 76
- 3.10 数组 79
- 3.10.1 声明数组 79
- 3.10.2 访问数组元素 80
- 3.10.3 for each循环 81
- 3.10.4 数组拷贝 82
- 3.10.5 命令行参数 82
- 3.10.6 数组排序 83
- 3.10.7 多维数组 86
- 3.10.8 不规则数组 88
- 第4章 对象与类 92
- 4.1 面向对象程序设计概述 92
- 4.1.1 类 93
- 4.1.2 对象 94
- 4.1.3 识别类 94
- 4.1.4 类之间的关系 95
- 4.2 使用预定义类 96
- 4.2.1 对象与对象变量 96
- 4.2.2 Java类库中的LocalDate类 99
- 4.2.3 更改器方法与访问器方法 100
- 4.3 用户自定义类 103
- 4.3.1 Employee类 104
- 4.3.2 多个源文件的使用 106
- 4.3.3 剖析Employee类 107
- 4.3.4 从构造器开始 107
- 4.3.5 用var声明局部变量 109
- 4.3.6 使用null引用 109
- 4.3.7 隐式参数与显式参数 110
- 4.3.8 封装的优点 111
- 4.3.9 基于类的访问权限 113
- 4.3.10 私有方法 114
- 4.3.11 f?inal实例字段 114
- 4.4 静态字段与静态方法 115
- 4.4.1 静态字段 115
- 4.4.2 静态常量 116
- 4.4.3 静态方法 116
- 4.4.4 工厂方法 117
- 4.4.5 main方法 118
- 4.5 方法参数 121
- 4.6 对象构造 126
- 4.6.1 重载 126
- 4.6.2 默认字段初始化 127
- 4.6.3 无参数的构造器 127
- 4.6.4 显式字段初始化 128
- 4.6.5 参数名 129
- 4.6.6 调用另一个构造器 129
- 4.6.7 初始化块 130
- 4.6.8 对象析构与f?inalize方法 134
- 4.7 包 134
- 4.7.1 包名 134
- 4.7.2 类的导入 135
- 4.7.3 静态导入 136
- 4.7.4 在包中增加类 137
- 4.7.5 包访问 139
- 4.7.6 类路径 140
- 4.7.7 设置类路径 142
- 4.8 JAR文件 143
- 4.8.1 创建JAR文件 143
- 4.8.2 清单文件 144
- 4.8.3 可执行JAR文件 145
- 4.8.4 多版本JAR文件 145
- 4.8.5 关于命令行选项的说明 146
- 4.9 文档注释 148
- 4.9.1 注释的插入 148
- 4.9.2 类注释 149
- 4.9.3 方法注释 149
- 4.9.4 字段注释 150
- 4.9.5 通用注释 150
- 4.9.6 包注释 151
- 4.9.7 注释抽取 151
- 4.10 类设计技巧 152
- 第5章 继承 155
- 5.1 类、超类和子类 155
- 5.1.1 定义子类 155
- 5.1.2 覆盖方法 157
- 5.1.3 子类构造器 158
- 5.1.4 继承层次 162
- 5.1.5 多态 162
- 5.1.6 理解方法调用 163
- 5.1.7 阻止继承:f?inal类和方法 165
- 5.1.8 强制类型转换 166
- 5.1.9 抽象类 168
- 5.1.10 受保护访问 173
- 5.2 Object:所有类的超类 174
- 5.2.1 Object类型的变量 174
- 5.2.2 equals方法 175
- 5.2.3 相等测试与继承 176
- 5.2.4 hashCode方法 179
- 5.2.5 toString方法 181
- 5.3 泛型数组列表 186
- 5.3.1 声明数组列表 187
- 5.3.2 访问数组列表元素 189
- 5.3.3 类型化与原始数组列表的
- 兼容性 191
- 5.4 对象包装器与自动装箱 192
- 5.5 参数数量可变的方法 195
- 5.6 枚举类 196
- 5.7 反射 198
- 5.7.1 Class类 199
- 5.7.2 声明异常入门 201
- 5.7.3 资源 202
- 5.7.4 利用反射分析类的能力 203
- 5.7.5 使用反射在运行时分析
- 对象 208
- 5.7.6 使用反射编写泛型数组
- 代码 213
- 5.7.7 调用任意方法和构造器 216
- 5.8 继承的设计技巧 219
- 第6章 接口、lambda表达式与内部类 222
- 6.1 接口 222
- 6.1.1 接口的概念 222
- 6.1.2 接口的属性 228
- 6.1.3 接口与抽象类 229
- 6.1.4 静态和私有方法 230
- 6.1.5 默认方法 230
- 6.1.6 解决默认方法冲突 231
- 6.1.7 接口与回调 233
- 6.1.8 Comparator接口 235
- 6.1.9 对象克隆 236
- 6.2 lambda表达式 242
- 6.2.1 为什么引入lambda表达式 242
- 6.2.2 lambda表达式的语法 243
- 6.2.3 函数式接口 245
- 6.2.4 方法引用 247
- 6.2.5 构造器引用 250
- 6.2.6 变量作用域 250
- 6.2.7 处理lambda表达式 252
- 6.2.8 再谈Comparator 254
- 6.3 内部类 255
- 6.3.1 使用内部类访问对象状态 256
- 6.3.2 内部类的特殊语法规则 259
- 6.3.3 内部类是否有用、必要和
- 安全 260
- 6.3.4 局部内部类 262
- 6.3.5 由外部方法访问变量 263
- 6.3.6 匿名内部类 264
- 6.3.7 静态内部类 267
- 6.4 服务加载器 270
- 6.5 代理 273
- 6.5.1 何时使用代理 273
- 6.5.2 创建代理对象 273
- 6.5.3 代理类的特性 277
- 第7章 异常、断言和日志 279
- 7.1 处理错误 279
- 7.1.1 异常分类 280
- 7.1.2 声明检查型异常 282
- 7.1.3 如何抛出异常 284
- 7.1.4 创建异常类 285
- 7.2 捕获异常 286
- 7.2.1 捕获异常 286
- 7.2.2 捕获多个异常 288
- 7.2.3 再次抛出异常与异常链 289
- 7.2.4 f?inally子句 290
- 7.2.5 try-with-Resources语句 292
- 7.2.6 分析堆栈轨迹元素 294
- 7.3 使用异常的技巧 297
- 7.4 使用断言 300
- 7.4.1 断言的概念 300
- 7.4.2 启用和禁用断言 301
- 7.4.3 使用断言完成参数检查 302
- 7.4.4 使用断言提供假设文档 303
- 7.5 日志 304
- 7.5.1 基本日志 305
- 7.5.2 高级日志 305
- 7.5.3 修改日志管理器配置 307
- 7.5.4 本地化 308
- 7.5.5 处理器 309
- 7.5.6 过滤器 312
- 7.5.7 格式化器 313
- 7.5.8 日志技巧 313
- 7.6 调试技巧 321
- 第8章 泛型程序设计 326
- 8.1 为什么要使用泛型程序设计 326
- 8.1.1 类型参数的好处 326
- 8.1.2 谁想成为泛型程序员 328
- 8.2 定义简单泛型类 328
- 8.3 泛型方法 330
- 8.4 类型变量的限定 331
- 8.5 泛型代码和虚拟机 333
- 8.5.1 类型擦除 333
- 8.5.2 转换泛型表达式 335
- 8.5.3 转换泛型方法 335
- 8.5.4 调用遗留代码 337
- 8.6 限制与局限性 338
- 8.6.1 不能用基本类型实例化类型参数 338
- 8.6.2 运行时类型查询只适用于原始类型 338
- 8.6.3 不能创建参数化类型的数组 338
- 8.6.4 Varargs警告 339
- 8.6.5 不能实例化类型变量 340
- 8.6.6 不能构造泛型数组 341
- 8.6.7 泛型类的静态上下文中类型变量无效 342
- 8.6.8 不能抛出或捕获泛型类的实例 343
- 8.6.9 可以取消对检查型异常的检查 343
- 8.6.10 注意擦除后的冲突 345
- 8.7 泛型类型的继承规则 346
- 8.8 通配符类型 348
- 8.8.1 通配符概念 348
- 8.8.2 通配符的超类型限定 349
- 8.8.3 无限定通配符 351
- 8.8.4 通配符捕获 352
- 8.9 反射和泛型 354
- 8.9.1 泛型Class类 354
- 8.9.2 使用Class参数进行类型匹配 355
- 8.9.3 虚拟机中的泛型类型信息 356
- 8.9.4 类型字面量 359
- 第9章 集合 365
- 9.1 Java集合框架 365
- 9.1.1 集合接口与实现分离 365
- 9.1.2 Collection接口 368
- 9.1.3 迭代器 368
- 9.1.4 泛型实用方法 370
- 9.2 集合框架中的接口 373
- 9.3 具体集合 375
- 9.3.1 链表 375
- 9.3.2 数组列表 384
- 9.3.3 散列集 385
- 9.3.4 树集 388
- 9.3.5 队列与双端队列 391
- 9.3.6 优先队列 392
- 9.4 映射 394
- 9.4.1 基本映射操作 394
- 9.4.2 更新映射条目 397
- 9.4.3 映射视图 398
- 9.4.4 弱散列映射 399
- 9.4.5 链接散列集与映射 400
- 9.4.6 枚举集与映射 401
- 9.4.7 标识散列映射 402
- 9.5 视图与包装器 403
- 9.5.1 小集合 404
- 9.5.2 子范围 405
- 9.5.3 不可修改的视图 405
- 9.5.4 同步视图 406
- 9.5.5 检查型视图 407
- 9.5.6 关于可选操作的说明 407
- 9.6 算法 411
- 9.6.1 为什么使用泛型算法 411
- 9.6.2 排序与混排 412
- 9.6.3 二分查找 414
- 9.6.4 简单算法 415
- 9.6.5 批操作 417
- 9.6.6 集合与数组的转换 418
- 9.6.7 编写自己的算法 418
- 9.7 遗留的集合 419
- 9.7.1 Hashtable类 419
- 9.7.2 枚举 419
- 9.7.3 属性映射 421
- 9.7.4 栈 424
- 9.7.5 位集 424
- 第10章 图形用户界面程序设计 429
- 10.1 Java用户界面工具包简史 429
- 10.2 显示窗体 430
- 10.2.1 创建窗体 431
- 10.2.2 窗体属性 433
- 10.3 在组件中显示信息 435
- 10.3.1 处理2D图形 439
- 10.3.2 使用颜色 445
- 10.3.3 使用字体 446
- 10.3.4 显示图像 452
- 10.4 事件处理 453
- 10.4.1 基本事件处理概念 453
- 10.4.2 实例:处理按钮点击事件 454
- 10.4.3 简洁地指定监听器 457
- 10.4.4 适配器类 458
- 10.4.5 动作 460
- 10.4.6 鼠标事件 464
- 10.4.7 AWT事件继承层次 469
- 10.5 项API 472
- 第11章 Swing用户界面组件 478
- 11.1 Swing和模型–视图–控制器设计模式 478
- 11.2 布局管理概述 481
- 11.2.1 布局管理器 482
- 11.2.2 边框布局 483
- 11.2.3 网格布局 484
- 11.3 文本输入 485
- 11.3.1 文本域 486
- 11.3.2 标签和标签组件 487
- 11.3.3 密码域 488
- 11.3.4 文本区 489
- 11.3.5 滚动窗格 489
- 11.4 选择组件 491
- 11.4.1 复选框 492
- 11.4.2 单选按钮 494
- 11.4.3 边框 497
- 11.4.4 组合框 499
- 11.4.5 滑动条 502
- 11.5 菜单 507
- 11.5.1 菜单构建 507
- 11.5.2 菜单项中的图标 509
- 11.5.3 复选框和单选按钮菜单项 510
- 11.5.4 弹出菜单 511
- 11.5.5 键盘助记符和加速器 512
- 11.5.6 启用和禁用菜单项 514
- 11.5.7 工具条 518
- 11.5.8 工具提示 519
- 11.6 复杂的布局管理 520
- 11.6.1 网格包布局 520
- 11.6.2 定制布局管理器 529
- 11.7 对话框 532
- 11.7.1 选项对话框 533
- 11.7.2 创建对话框 536
- 11.7.3 数据交换 540
- 11.7.4 文件对话框 545
- 第12章 并发 552
- 12.1 什么是线程 552
- 12.2 线程状态 555
- 12.2.1 新建线程 556
- 12.2.2 可运行线程 556
- 12.2.3 阻塞和等待线程 556
- 12.2.4 终止线程 558
- 12.3 线程属性 558
- 12.3.1 中断线程 558
- 12.3.2 守护线程 561
- 12.3.3 线程名 561
- 12.3.4 未捕获异常的处理器 561
- 12.3.5 线程优先级 563
- 12.4 同步 563
- 12.4.1 竞态条件的一个例子 563
- 12.4.2 竞态条件详解 567
- 12.4.3 锁对象 568
- 12.4.4 条件对象 571
- 12.4.5 synchronized关键字 576
- 12.4.6 同步块 579
- 12.4.7 监视器概念 580
- 12.4.8 volatile字段 581
- 12.4.9 final变量 582
- 12.4.10 原子性 582
- 12.4.11 死锁 584
- 12.4.12 线程局部变量 586
- 12.4.13 为什么废弃stop和suspend方法 587
- 12.5 线程安全的集合 589
- 12.5.1 阻塞队列 589
- 12.5.2 高效的映射、集和队列 595
- 12.5.3 映射条目的原子更新 596
- 12.5.4 对并发散列映射的批操作 599
- 12.5.5 并发集视图 600
- 12.5.6 写数组的拷贝 601
- 12.5.7 并行数组算法 601
- 12.5.8 较早的线程安全集合 602
- 12.6 任务和线程池 603
- 12.6.1 Callable与Future 603
- 12.6.2 执行器 605
- 12.6.3 控制任务组 607
- 12.6.4 fork-join框架 612
- 12.7 异步计算 615
- 12.7.1 可完成Future 615
- 12.7.2 组合可完成Future 616
- 12.7.3 用户界面回调中的长时间运行任务 622
- 12.8 进程 628
- 12.8.1 建立一个进程 628
- 12.8.2 运行一个进程 630
- 12.8.3 进程句柄 631
- 附录 Java关键字 634