《On Java 中文版 基础卷:《Java编程思想》作者新作》封面

内容简介

本书是布鲁斯 • 埃克尔时隔 15 年,继 Thinking in Java 之后又一力作,基于 Java 的 3 个长期支持版(Java 8、11、17),讲解 Java 核心语法,并对 Java 的核心变化进行详述。全书内容通俗易懂,配合示例讲解逐步深入,并结合实际开发需要,从语言底层设计出发,有效帮读者规避一些常见的开发陷阱。

主体部分共 22 章,内容包含对象、操作符、控制流、初始化和清理、复用、多态、接口、内部类、集合、函数式编程、流、异常、代码校验、文件、字符串、泛型等。

本书适合各个层次的 Java 开发者阅读,同时也可作为面向对象程序设计语言以及 Java 语言的参考教材。

作者简介

Bruce Eckel ,C++标准委员会的创始成员之一,知名技术顾问 ,专注于编程语言和软件系统设计方面的研究,常活跃于世界各大顶级技术研讨会。他自1986年以来,累计出版Thinking in C++、Thinking in Java、On Java 8等十余部经典计算机著作,曾多次荣获Jolt 最佳图书奖(“被誉为软件业界的奥斯卡”),其代表作 Thinking in Java被译为中、日、俄、意、波兰、韩等十几种语言,在世界范围内产生广泛影响。

目录

第1章什么是对象
1.1抽象的历程
1.2对象具有接口
1.3对象可以提供服务
1.4隐藏的实现
1.5复用实现
1.6继承
1.7多态
1.8单根层次结构
1.9集合
1.10对象的创建和生命周期
1.11异常处理
1.12总结
第2章安装Java和本书示例
2.1编辑器
2.2shell
2.2.1运行shell
2.2.2目录(文件夹)
2.2.3shell基础操作
2.3安装Java
2.4确认安装成功
2.5安装和运行本书示例
第3章对象无处不在
3.1通过引用操作对象
3.2必须创建所有对象
3.2.1数据保存在哪里
3.2.2特殊情况:基本类型
3.2.3Java中的数组
3.3注释
3.4无须销毁对象
3.4.1作用域
3.4.2对象的作用域
3.5使用class关键字创建新类型
3.6方法、参数以及返回值
3.7编写Java程序
3.7.1名称可见性
3.7.2使用其他组件
3.7.3static关键字
3.8你的第一个Java程序
3.9编程风格
3.10总结
第4章操作符
4.1使用Java操作符
4.2优先级
4.3赋值
4.4算术操作符
4.5自动递增和自动递减
4.6关系操作符
4.7逻辑操作符
4.8字面量
4.8.1字面量里的下划线
4.8.2科学记数法(又称“指数记数法”)
4.9按位操作符
4.10移位操作符
4.11三元操作符
4.12字符串操作符+和+=
4.13使用操作符时常犯的错误
4.14类型转换操作符
4.14.1截尾和舍入
4.14.2提升
4.15Java没有sizeof()
4.16操作符小结
4.17总结
第5章控制流
5.1true和false
5.2if-else
5.3迭代语句
5.3.1do-while
5.3.2for
5.3.3逗号操作符
5.4for-in语法
5.5return
5.6break和continue
5.7臭名昭著的goto
5.8switch
5.9字符串作为选择器
5.10总结
第6章初始化和清理
6.1用构造器保证初始化
6.2方法重载
6.2.1区分重载的方法
6.2.2使用基本类型的重载
6.2.3通过返回值区分重载方法
6.3无参构造器
6.4this关键字
6.4.1在构造器中调用构造器
6.4.2static的含义
6.5清理:终结和垃圾收集
6.5.1finalize()的作用
6.5.2你必须执行清理
6.5.3终止条件
6.5.4垃圾收集器的工作原理
6.6成员初始化
6.7构造器初始化
6.7.1初始化顺序
6.7.2静态数据的初始化
6.7.3显式的静态初始化
6.7.4非静态实例初始化
6.8数组初始化
6.8.1动态数组创建
6.8.2可变参数列表
6.9枚举类型
6.10新特性:局部变量类型推断
6.11总结
第7章实现隐藏
7.1package:库单元
7.1.1代码组织
7.1.2创建独一无二的包名
7.1.3定制工具库
7.1.4用import来改变行为
7.1.5关于包的忠告
7.2Java访问权限修饰符
7.2.1包访问
7.2.2public:接口访问权限
7.2.3private:你无法访问它
7.2.4protected:继承访问权限
7.2.5包访问权限与公共构造器
7.3接口和实现
7.4类的访问权限
7.5新特性:模块
7.6总结
第8章复用
8.1组合语法
8.2继承语法
8.3委托
8.4组合与继承相结合
8.4.1确保正确的清理
8.4.2名称隐藏
8.5选择组合还是继承
8.6protected关键字
8.7向上转型
8.8final关键字
8.8.1final数据
8.8.2final方法
8.8.3final类
8.8.4关于final的忠告
8.9初始化及类的加载
8.10总结
第9章多态
9.1再论向上转型
9.2难点
9.2.1方法调用绑定
9.2.2产生正确的行为
9.2.3可扩展性
9.2.4陷阱:“重写”private方法
9.2.5陷阱:字段与静态方法
9.3构造器和多态
9.3.1构造器的调用顺序
9.3.2继承与清理
9.3.3构造器内部的多态方法行为
9.4协变返回类型
9.5用继承进行设计
第10章接口
10.1抽象类和抽象方法
10.2接口定义
10.2.1默认方法
10.2.2多重继承
10.2.3接口中的静态方法
10.2.4作为接口的Instrument
10.3抽象类与接口
10.4完全解耦
10.5组合多个接口
10.6通过继承来扩展接口
10.7适配接口
10.8接口中的字段
10.9嵌套接口
10.10接口和工厂
10.11新特性:接口的private方法
10.12新特性:密封类和密封接口
10.13总结
第11章内部类
11.1创建内部类
11.2到外部类的链接
11.3使用.this和.new
11.4内部类和向上转型
11.5在方法和作用域中的内部类
11.6匿名内部类
11.7嵌套类
11.7.1接口中的类
11.7.2从多层嵌套的内部类中访问外部成员
11.8为什么需要内部类
11.8.1闭包与回调
11.8.2内部类与控制框架
11.9继承内部类
11.10内部类可以被重写吗
11.11局部内部类
11.12内部类标识符
11.13总结
第12章集合
12.1泛型和类型安全的集合
12.2基本概念
12.3添加一组元素
12.4打印集合
12.5List
12.6Iterator
12.7LinkedList
12.8Stack
12.9Set
12.10Map
12.11新特性:记录(record)类型
12.12Queue
12.13Collection和Iterator的对比
12.14for-in和迭代器
12.15总结
第13章函数式编程
13.1旧方式与新方式
13.2lambda表达式
13.3方法引用
13.3.1Runnable
13.3.2未绑定方法引用
13.3.3构造器方法引用
13.4函数式接口
13.4.1带有更多参数的函数式接口
13.4.2解决缺乏基本类型函数式接口的问题
13.5高阶函数
13.6闭包
13.7函数组合
13.8柯里化和部分求值
13.9纯函数式编程
13.10总结
第14章流
14.1Java8对流的支持
14.2流的创建
14.2.1随机数流
14.2.2int类型的区间范围
14.2.3generate()
14.2.4iterate()
14.2.5流生成器
14.2.6Arrays
14.2.7正则表达式
14.3中间操作
14.3.1跟踪与调试
14.3.2对流元素进行排序
14.3.3移除元素
14.3.4将函数应用于每个流元素
14.3.5在应用map()期间组合流
14.4Optional类型
14.4.1便捷函数
14.4.2创建Optional
14.4.3Optional对象上的操作
14.4.4由Optional组成的流
14.5终结操作
14.5.1将流转换为一个数组
14.5.2在每个流元素上应用某个终结操作
14.5.3收集操作
14.5.4组合所有的流元素
14.5.5匹配
14.5.6选择一个元素
14.5.7获得流相关的信息
14.6小结
第15章异常
15.1概念
15.2基本的异常
15.3捕捉异常
15.3.1try块
15.3.2异常处理程序
15.4创建自己的异常
15.5异常说明
15.6捕捉任何异常
15.6.1多重捕捉
15.6.2栈轨迹
15.6.3重新抛出异常
15.6.4异常链
15.7标准Java异常
15.8新特性:更好的NullPointerException报告机制
15.9使用finally执行清理
15.9.1finally是干什么用的
15.9.2在return期间使用finally
15.9.3缺陷:异常丢失
15.10异常的约束
15.11构造器
15.12try-with-resources语句
15.12.1细节揭秘
15.12.2新特性:try-withresources中的实际上的最终变量
15.13异常匹配
15.14其他可选方式
15.14.1历史
15.14.2观点
15.14.3把异常传递到控制台
15.14.4将“检查型异常”转换为“非检查型异常”
15.15异常使用指南
15.16小结
附记异常的奇异世界
第16章代码校验
16.1测试
16.1.1单元测试
16.1.2测试覆盖率的幻觉
16.2前置条件
16.2.1断言
16.2.2DbC+单元测试
16.2.3使用Guava里的前置条件
16.3测试驱动开发
16.4日志
16.5调试
16.5.1使用JDB进行调试
16.5.2图形调试器
16.6基准测试
16.6.1微基准测试
16.6.2介绍JMH
16.7分析与优化
16.8样式检查
16.9静态错误分析
16.10代码审查
16.11结对编程
16.12重构
16.13持续集成
16.14总结
第17章文件
17.1文件和目录路径
17.1.1选择Path的片段
17.1.2分析Path
17.1.3添加或删除路径片段
17.2目录
17.3文件系统
17.4监听Path
17.5查找文件
17.6读写文件
17.7小结
第18章字符串
18.1不可变的字符串
18.2重载+与StringBuilder
18.3无意识的递归
18.4对字符串的操作
18.5格式化输出
18.5.1printf()
18.5.2System.out.format()
18.5.3Formatter类
18.5.4格式说明符
18.5.5Formatter转换
18.5.6String.format()
18.6新特性:文本块
18.7正则表达式
18.7.1基础
18.7.2创建正则表达式
18.7.3量词
18.7.4Pattern和Matcher
18.7.5split()
18.7.6替换操作
18.7.7reset()
18.7.8正则表达式和JavaI/O
18.8扫描输入
18.8.1Scanner分隔符
18.8.2使用正则表达式扫描
18.9StringTokenizer
18.10总结
第19章反射
19.1为什么需要反射
19.2Class对象
19.2.1类字面量
19.2.2泛型类的引用
19.2.3cast()方法
19.3转型前检查
19.3.1使用类字面量
19.3.2动态的instanceof
19.4注册工厂
19.5Instanceof与Class的等价性
19.6运行时的类信息
19.7动态代理
19.8使用Optional
19.8.1标签接口
19.8.2模拟对象和桩
19.9接口和类型信息
19.10总结
第20章泛型
20.1和C++的对比
20.2简单泛型
20.2.1元组库
20.2.2栈类
20.2.3RandomList
20.3泛型接口
20.4泛型方法
20.4.1可变参数和泛型方法
20.4.2通用Supplier
20.4.3简化元组的使用
20.4.4Set实用工具
20.5构建复杂模型
20.6类型擦除的奥秘
20.6.1C++的实现方法
20.6.2迁移的兼容性
20.6.3类型擦除存在的问题
20.6.4边界的行为
20.7对类型擦除的补偿
20.7.1创建类型实例
20.7.2泛型数组
20.8边界
20.9通配符
20.9.1编译器有多聪明?
20.9.2逆变性
20.9.3无界通配符
20.9.4捕获转换
20.10问题
20.10.1基本类型不可作为类型参数
20.10.2实现参数化接口
20.10.3类型转换和警告
20.10.4重载
20.10.5基类会劫持接口
20.11自限定类型
20.11.1奇异递归泛型
20.11.2自限定
20.11.3参数协变性
20.12动态类型安全
20.13异常
20.14混型
20.14.1C++中的混型
20.14.2与接口混合
20.14.3使用装饰器模式
20.14.4与动态代理混合
20.15潜在类型机制20.15.1Python中的潜在类型机制
20.15.2C++中的潜在类型机制
20.15.3Go中的潜在类型机制
20.15.4Java中的直接潜在类型机制
20.16对于缺少(直接的)潜在类型机制的补偿
20.16.1反射
20.16.2将方法应用于序列
20.17Java8中的辅助潜在类型机制
20.18总结:转型真的这么糟糕吗?
第21章数组
21.1数组为何特殊
21.2数组是一等对象
21.3返回数组
21.4多维数组
21.5数组和泛型
21.6Arrays.fill()
21.7Arrays.setAll()
21.8增量生成器
21.9随机数生成器
21.10泛型和基本类型数组
21.11修改已有的数组元素
21.12关于数组并行
21.12.1策略
21.12.2parallelSetAll()
21.13数组实用工具
21.14数组复制
21.15数组比较
21.16流和数组
21.17数组排序
21.17.1使用Arrays.sort()
21.17.2并行排序
21.18用Arrays.binarySearch()进行二分查找
21.19用parallelPrefix()进行累积计算
21.20总结/806
附录A补充内容
附录B积极看待C++与Java的遗产
······

最后修改:2024 年 10 月 23 日