目 录
第1章 Java初窥 1
1.1 Java的起源 1
1.2 Java能做什么 1
1.3 相关概念 2
1.3.1 JDK 2
1.3.2 Java家族的三个成员 2
1.3.3 Java 1、Java 2和Java 5 3
1.3.4 JRE 3
1.4 安装JDK 3
1.4.1 下载JDK 11(Java SE 11) 4
1.4.2 安装JDK 5
1.4.3 下载帮助文档 6
1.5 Java的特性 6
1.5.1 简单 6
1.5.2 面向对象 7
1.5.3 健壮 7
1.5.4 安全 7
1.5.5 结构中立 7
1.5.6 可移植 7
1.5.7 高性能 8
1.5.8 解释执行 8
1.5.9 平台无关 8
1.5.10 多线程 8
1.5.11 动态 9
1.6 Java跨平台的原理 9
1.6.1 Java源文件的编译过程 9
1.6.2 Java解释器运行机制 9
1.6.3 Java字节码的执行方式 10
1.6.4 理解JVM 10
1.7 第一个程序 11
1.7.1 了解JDK 11
1.7.2 编写第一个Java程序 11
1.8 扫清Java征途中的两块绊脚石 15
1.8.1 有用的PATH 15
1.8.2 难缠的CLASSPATH 17
1.9 交互式编程环境JShell 19
1.10 为Java程序打包 20
1.10.1 JAR文件 20
1.10.2 将字节码文件打包到
JAR包中 20
1.10.3 将目录中所有文件打包到
JAR文件中 21
1.10.4 清单文件 21
1.11 总结 22
1.12 实战练习 22
第2章 初识Java语言 23
2.1 标识符 23
2.2 数据类型 23
2.2.1 整数类型 24
2.2.2 浮点类型 25
2.2.3 字符(char)型 25
2.2.4 布尔(boolean)型 26
2.2.5 String类型 26
2.3 变量和字面常量 26
2.3.1 变量 26
2.3.2 字面常量 27
2.4 类型转换的奥秘 30
2.5 运算符 32
2.5.1 赋值运算符 32
2.5.2 自增和自减运算符 32
2.5.3 算术运算符 33
2.5.4 关系运算符 34
2.5.5 布尔运算符 34
2.5.6 位运算符 35
2.5.7 移位运算符 37
2.5.8 一元和二元运算符 39
2.5.9 三元运算符 39
2.5.10 优先级 39
2.6 表达式与语句 40
2.7 程序结构 40
2.7.1 分支语句 41
2.7.2 循环语句 46
2.8 数组 54
2.8.1 数组类型与声明数组 54
2.8.2 创建数组 55
2.8.3 使用数组 56
2.8.4 匿名数组 57
2.8.5 多维数组 57
2.8.6 数组的初始值和越界 59
2.9 分隔符 60
2.10 注释 60
2.10.1 传统注释 60
2.10.2 JavaDoc注释 61
2.11 Java中的关键字 63
2.12 总结 63
2.13 实战练习 63
第3章 进入对象的世界 65
3.1 面向对象思想 65
3.2 对象的状态和行为 66
3.2.1 对象都有一组固定的行为 66
3.2.2 注意思维习惯 66
3.3 面向对象编程的难点 67
3.4 Java的类与对象 67
3.5 字段(field)与方法 68
3.5.1 字段 68
3.5.2 方法 68
3.5.3 方法的参数与返回值 69
3.6 构造方法与new关键字 71
3.7 方法重载 74
3.8 特殊变量this 75
3.9 关键字static 79
3.9.1 静态字段 79
3.9.2 静态方法 81
3.9.3 static语句块 82
3.10 常量 82
3.11 枚举(enum) 83
3.11.1 原始的枚举实现 83
3.11.2 枚举类型 84
3.11.3 枚举值的比较 86
3.11.4 自定义枚举值 86
3.12 总结 87
3.13 实战练习 87
第4章 高级面向对象编程 88
4.1 继承 88
4.2 方法的覆盖(override) 90
4.3 多态(polymorphism) 91
4.3.1 何为多态 91
4.3.2 多态的实际应用 92
4.3.3 Java编译器如何实现多态 94
4.3.4 类型转换 94
4.3.5 协变返回类型 96
4.3.6 在构造方法中调用被覆盖的
方法 97
4.4 特殊变量super 98
4.4.1 访问父类被子类覆盖的方法或
隐藏的变量 98
4.4.2 调用父类构造方法 100
4.5 封装与private 103
4.6 对外发布的接口——public 107
4.7 再谈final 109
4.7.1 final类 109
4.7.2 final方法 109
4.7.3 final参数 110
4.8 对象的销毁 110
4.9 面向对象的四个基本特性 111
4.10 总结 112
4.11 实战练习 112
第5章 包和访问控制 114
5.1 在包中的类 114
5.2 导入类 117
5.3 静态导入 119
5.4 静态导入枚举类型 120
5.5 访问控制 121
5.5.1 类的访问说明符 121
5.5.2 类成员的访问说明符 122
5.6 总结 126
5.7 实战练习 126
第6章 抽象类与接口 127
6.1 抽象方法和抽象类 127
6.2 接口 131
6.3 接口中的数据成员 133
6.4 接口的继承与实现 133
6.5 接口的应用 135
6.6 深入接口——通信双方的协议 137
6.7 接口的默认方法和静态方法 139
6.7.1 默认方法 139
6.7.2 静态方法 144
6.8 接口的私有方法 145
6.9 总结 146
6.10 实战练习 147
第7章 内部类(Inner Class) 149
7.1 创建内部类 149
7.2 访问外部类 150
7.3 内部类与接口 153
7.4 局部内部类 155
7.5 匿名内部类 157
7.5.1 创建匿名内部类 157
7.5.2 匿名内部类的构造方法 159
7.6 静态内部类 160
7.7 内部类的继承与覆盖 161
7.7.1 内部类的继承 161
7.7.2 内部类的覆盖 162
7.8 内部类规则总结 163
7.9 回调与事件机制 163
7.9.1 回调(callback) 163
7.9.2 事件(event) 167
7.10 总结 169
7.11 实战练习 169
第8章 异常处理 170
8.1 什么是异常 170
8.2 捕获异常 172
8.3 使用finally进行清理 175
8.4 抛出异常与声明异常 179
8.5 RuntimeException 182
8.6 创建自己的异常体系结构 184
8.7 try-with-resources 188
8.7.1 自动关闭资源 188
8.7.2 声明多个资源 189
8.7.3 catch多个异常 191
8.7.4 使用更具包容性的类型
检查重新抛出异常 192
8.8 总结 193
8.9 实战练习 193
第9章 深入字符串 194
9.1 String类 194
9.2 ==运算符与equals方法 194
9.3 compareTo方法 197
9.4 字符串拼接 198
9.5 操作字符串 198
9.5.1 获取字符串的长度 199
9.5.2 查找字符或字符串 199
9.5.3 判断字符串的开始与结尾 200
9.5.4 获取指定索引位置的字符 200
9.5.5 截取子字符串 201
9.5.6 分割字符串 201
9.5.7 替换字符或字符串 202
9.5.8 合并字符串 203
9.5.9 重复字符串 203
9.5.10 大小写转换 203
9.5.11 去除字符串首尾空白 204
9.5.12 判断字符串是否为空 204
9.5.13 提取字符串的行流 205
9.5.14 与字节数组相互转换 205
9.6 StringBuffer类和
StringBuilder类 206
9.7 格式化输出 207
9.7.1 格式说明符 208
9.7.2 参数索引 208
9.7.3 格式说明字符 208
9.7.4 宽度和精度 209
9.7.5 标志字符 210
9.7.6 生成格式化的String对象 211
9.8 正则表达式 211
9.8.1 正则表达式的优点 211
9.8.2 一切从模式开始 213
9.8.3 创建正则表达式 213
9.8.4 量词 216
9.8.5 String类的正则表达式方法 216
9.8.6 Pattern和Matcher 218
9.8.7 邮件地址验证 218
9.8.8 获取组匹配的内容 220
9.8.9 替换字符串 221
9.9 总结 221
9.10 实战练习 222
第10章 Java应用 223
10.1 再论引用类型 223
10.1.1 引用类型——数组 223
10.1.2 方法传参 225
10.2 操作数组 226
10.2.1 数组的复制 226
10.2.2 数组的排序 229
10.2.3 搜索数组中的元素 232
10.2.4 填充数组 233
10.3 基本数据类型与封装类 234
10.3.1 基本数据类型与封装类
对象的互相转换 235
10.3.2 封装类对象与字符串的
互相转换 236
10.3.3 基本数据类型与字符串的
互相转换 236
10.3.4 自动装箱与拆箱 236
10.4 对象的克隆 237
10.5 国际化与本地化 242
10.5.1 Locale 242
10.5.2 资源包 244
10.5.3 消息格式化 248
10.6 总结 249
10.7 实战练习 249
第11章 泛型 250
11.1 为什么需要泛型 250
11.2 泛型与基本数据类型 253
11.3 泛型类中的数组 254
11.4 元组 256
11.5 泛型接口 258
11.5.1 一个简单的泛型接口 258
11.5.2 匿名内部类实现泛型接口 259
11.5.3 map机制的实现 260
11.6 泛型方法 262
11.6.1 简单的泛型方法 262
11.6.2 完善映射机制的实现 263
11.7 通配符类型 264
11.7.1 通配符的子类型限定 266
11.7.2 通配符的超类型限定 267
11.8 类型参数的限定 269
11.9 深入泛型机制 270
11.10 泛型的一些问题 272
11.10.1 接口的二次实现 272
11.10.2 方法重载 273
11.10.3 泛型类型的实例化 273
11.10.4 异常 274
11.11 使用泛型的限制 275
11.12 类型参数的命名约定 275
11.13 总结 275
11.14 实战练习 276
第12章 Lambda表达式 277
12.1 理解Lambda表达式 277
12.2 Lambda表达式的语法 278
12.3 函数式接口 279
12.4 内置函数式接口 280
12.5 方法引用 281
12.6 构造方法引用 282
12.7 数组引用 284
12.8 总结 284
12.9 实战练习 284
第13章 集合类 285
13.1 集合框架中的接口与实现类 285
13.1.1 集合框架中的接口 286
13.1.2 集合框架中的实现类 286
13.1.3 Collection类型的集合 286
13.1.4 Map类1