重磅推荐
【产品特色】


【编辑推荐】

《Java官方入门教程(第9版·Java 17)》特色
•关键技能与概念 每章开头列出要介绍的技能和概念
•专家解答 以问答形式提供附加信息和实用提示
•练习 示范如何运用编程技能的紧贴实用的练习
•自测题 每章最后有一些测试题,以帮助读者扎实掌握Java技能
•语法注释 示例代码中的注释阐述所演示的编程技巧


【内容简介】

《Java官方入门教程(第9版·Java 17)》针对Java SE 17做了全面细致的更新,将引导你轻松学习最新的核心Java编程技能。《Java官方入门教程(第9版·Java 17)》由畅销编程书作者Herbert Schildt撰写,开篇讲述基础知识,内容涉及如何创建、编译和运行Java程序。此后浓墨重彩地描述构成Java语言核心的关键字、语法和结构。本书还涵盖Java的一些更高级特性,如多线程编程、泛型、lambda表达式、模块、记录、密封类和Swing。另外,还介绍了Java的交互式编程工具JShell。本书通俗易懂、简明扼要、详略得当,成为全球数百万读者的选择。


【作者简介】

Herbert Schildt是一位畅销书作家,在30多年的时间里,他撰写了大量编程图书。Herbert是Java语言领域的权威专家,被International Developer杂志评为“全球最著名的编程书籍创作者之一”“。他撰写的编程书籍在全球范围内销售了数百万册,已被翻译成所有主要的非英语语言。他撰写了大量Java方面的书籍,包括Java: The Complete Reference、Herb Schildt’s Java Programming Cookbook、Introducing JavaFX 8 Programming和 Swing: A Beginner’s Guide。还撰写了许多关于C、C 和C#的图书。Ed Burns在Secrets of the Rock Star Programmers: Riding the IT Crest一书中将Herbert列为明星程序员。尽管对计算机的所有方面都感兴趣,但Herbert主要关注计算机语言。Herbert拥有伊利诺伊大学的学士和硕士学位。


【目录】

第1章 Java基础 1
1.1 Java的历史和基本原则 2
1.1.1 Java的起源 3
1.1.2 Java与C和C 的关系 3
1.1.3 Java对Internet的贡献 4
1.1.4 Java的魔法:字节码 5
1.1.5 超越applet 6
1.1.6 更快速的发布时间表 7
1.1.7 Java的主要术语 8
1.2 面向对象程序设计 8
1.2.1 封装 9
1.2.2 多态性 9
1.2.3 继承 10
1.3 Java开发工具包 10
1.4 第一个简单的程序 11
1.4.1 输入程序 12
1.4.2 编译程序 12
1.4.3 逐行分析第一个程序 13
1.5 处理语法错误 15
1.6 第二个简单程序 15
1.7 另一种数据类型 17
1.8 两个控制语句 19
1.8.1 if语句 20
1.8.2 for循环语句 21
1.9 创建代码块 22
1.10 分号和定位 24
1.11 缩进原则 24
1.12 Java关键字 26
1.13 Java标识符 27
1.14 Java类库 27
1.15 自测题 27

第2章 数据类型与运算符 29
2.1 数据类型为什么重要 30
2.2 Java的基本类型 30
2.2.1 整数类型 31
2.2.2 浮点型 32
2.2.3 字符型 33
2.2.4 布尔类型 34
2.3 字面值 36
2.3.1 十六进制、八进制和二进制字面值 36
2.3.2 字符转义序列 37
2.3.3 字符串字面值 37
2.4 变量详解 38
2.4.1 初始化变量 38
2.4.2 动态初始化 39
2.5 变量的作用域和生命期 39
2.6 运算符 41
2.7 算术运算符 42
2.8 关系运算符和逻辑运算符 43
2.9 短路逻辑运算符 45
2.10 赋值运算符 46
2.11 速记赋值 46
2.12 赋值中的类型转换 48
2.13 不兼容类型的强制转换 49
2.14 运算符的优先级 50
2.15 表达式 52
2.15.1 表达式中的类型转换 52
2.15.2 间距和圆括号 54
2.16 自测题 54
第3章 程序控制语句 55
3.1 从键盘输入字符 56
3.2 if语句 57
3.2.1 嵌套if语句 58
3.2.2 if-else-if阶梯状结构 59
3.3 switch语句 60
3.4 for循环 66
3.4.1 for循环的一些变体 67
3.4.2 缺失部分要素的for循环 68
3.4.3 无限循环 69
3.4.4 没有循环体的循环 69
3.4.5 在for循环内部声明循环控制变量 70
3.4.6 增强型for循环 70
3.5 while循环 71
3.6 do-while循环 72
3.7 使用break语句退出循环 77
3.8 将break语句作为一种goto
语句使用 78
3.9 使用continue语句 82
3.10 嵌套循环 86
3.11 自测题 87
第4章 类、对象和方法 89
4.1 类的基础知识 90
4.1.1 类的基本形式 90
4.1.2 定义类 91
4.2 如何创建对象 94
4.3 引用变量和赋值 94
4.4 方法 95
4.5 从方法返回值 97
4.6 返回值 98
4.7 使用形参 100
4.8 构造函数 107
4.9 带形参的构造函数 109
4.10 深入介绍new运算符 110
4.11 垃圾回收 111
4.12 this关键字 111
4.13 自测题 113
第5章 其他数据类型与运算符 115
5.1 数组 116
5.2 多维数组 121
5.2.1 二维数组 121
5.2.2 不规则数组 122
5.2.3 三维或更多维的数组 123
5.2.4 初始化多维数组 123
5.3 另一种声明数组的语法 124
5.4 数组引用赋值 125
5.5 使用length成员 126
5.6 for-each形式的循环 131
5.6.1 迭代多维数组 134
5.6.2 应用增强型for循环 135
5.7 字符串 135
5.7.1 构造字符串 136
5.7.2 操作字符串 136
5.7.3 字符串数组 138
5.7.4 字符串是不可变的 139
5.7.5 使用String控制switch语句 140
5.8 使用命令行实参 142
5.9 使用局部变量的类型推断功能 143
5.9.1 引用类型的局部变量类型推断 145
5.9.2 在for循环中使用局部变量类型推断 146
5.9.3 var的一些限制 147
5.10 位运算符 147
5.10.1 位运算符的与、或、异或和非 148
5.10.2 移位运算符 151
5.10.3 位运算符的赋值速记符 153
5.11 ?运算符 156
5.12 自测题 157
第6章 方法和类详解 159
6.1 控制对类成员的访问 160
6.2 向方法传递对象 165
6.3 返回对象 168
6.4 方法重载 170
6.5 重载构造函数 175
6.6 递归 179
6.7 理解static关键字 181
6.8 嵌套类和内部类 187
6.9 varargs:可变长度的实参 190
6.9.1 varargs基础 190
6.9.2 重载varargs方法 193
6.9.3 varargs和歧义 194
6.10 自测题 195
第7章 继承 197
7.1 继承的基础知识 198
7.2 成员访问与继承 201
7.3 构造函数和继承 203
7.4 使用super调用超类构造函数 205
7.5 使用super访问超类成员 208
7.6 创建多级层次结构 212
7.7 何时执行构造函数 215
7.8 超类引用和子类对象 216
7.9 方法重写 220
7.10 重写的方法支持多态性 222
7.11 为何使用重写方法 224
7.12 使用抽象类 227
7.13 使用final 231
7.13.1 使用final防止重写 231
7.13.2 使用final防止继承 232
7.13.3 对数据成员使用final 232
7.14 Object类 233
7.15 自测题 234
第8章 包和接口 237
8.1 包 238
8.1.1 定义包 239
8.1.2 寻找包和CLASSPATH 239
8.1.3 一个简短的包示例 240
8.2 包和成员访问 241
8.3 理解被保护的成员 243
8.4 导入包 245
8.5 Java的类库位于包中 246
8.6 接口 247
8.7 实现接口 248
8.8 使用接口引用 251
8.9 接口中的变量 258
8.10 接口能够扩展 258
8.11 默认接口方法 259
8.11.1 默认方法的基础知识 260
8.11.2 默认方法的实际应用 261
8.11.3 多继承问题 262
8.12 在接口中使用静态方法 263
8.13 私有接口方法 264
8.14 有关包和接口的最后思考 265
8.15 自测题 265
第9章 异常处理 267
9.1 异常的层次结构 268
9.2 异常处理基础 269
9.2.1 使用关键字try和catch 269
9.2.2 一个简单的异常示例 270
9.3 未捕获异常的后果 272
9.4 使用多个catch语句 274
9.5 捕获子类异常 275
9.6 try代码块可以嵌套 276
9.7 抛出异常 277
9.8 Throwable详解 279
9.9 使用finally 280
9.10 使用throws语句 282
9.11 另外3种异常功能 283
9.12 Java的内置异常 284
9.13 创建异常子类 286
9.14 自测题 291
第10章 使用I/O 293
10.1 基于流的Java I/O 294
10.2 字节流和字符流 294
10.3 字节流类 295
10.4 字符流类 295
10.5 预定义流 296
10.6 使用字节流 296
10.6.1 读取控制台输入 297
10.6.2 写入控制台输出 298
10.7 使用字节流读写文件 299
10.7.1 从文件输入 299
10.7.2 写入文件 303
10.8 自动关闭文件 304
10.9 读写二进制数据 307
10.10 随机访问文件 311
10.11 使用Java字符流 313
10.11.1 使用字符流的控制台输入 314
10.11.2 使用字符流的控制台输出 317
10.12 使用字符流的文件I/O 318
10.12.1 使用FileWriter 318
10.12.2 使用FileReader 319
10.13 使用Java的类型封装器转换数值字符串 320
10.14 自测题 328
第11章 多线程程序设计 331
11.1 多线程的基础知识 332
11.2 Thread类和Runnable接口 333
11.3 创建一个线程 333
11.4 创建多个线程 342
11.5 确定线程何时结束 345
11.6 线程的优先级 348
11.7 同步 350
11.8 使用同步方法 351
11.9 同步语句 354
11.10 使用notify( )、wait( )和notifyAll( )的线程通信 356
11.11 线程的挂起、继续执行和停止 361
11.12 自测题 366
第12章 枚举、自动装箱、注解和其他特性 367
12.1 枚举 368
12.2 Java语言中的枚举是类类型 370
12.3 values( )和valueOf( )方法 371
12.4 构造函数、方法、实例变量和枚举 372
12.5 枚举继承enum 374
12.6 自动装箱 380
12.7 类型封装器 380
12.8 自动装箱的基础知识 382
12.9 自动装箱和方法 383
12.10 发生在表达式中的自动装箱/
自动拆箱 384
12.11 静态导入 386
12.12 注解(元数据) 388
12.13 instanceof运算符 390
12.14 自测题 392
第13章 泛型 395
13.1 泛型的基础知识 396
13.2 简单的泛型示例 397
13.2.1 泛型只能用于引用类型 400
13.2.2 泛型类型根据其类型参数而不同 400
13.2.3 带有两个类型形参的泛型类 400
13.2.4 泛型类的一般形式 402
13.3 受限类型 402
13.4 使用通配符实参 405
13.5 受限通配符 408
13.6 泛型方法 410
13.7 泛型构造函数 412
13.8 泛型接口 413
13.9 原类型和遗留代码 419
13.10 使用菱形运算符进行类型推断 421
13.11 局部变量类型推断和泛型 422
13.12 擦除特性 423
13.13 歧义错误 423
13.14 一些泛型限制 424
13.14.1 类型形参不能被实例化 424
13.14.2 对静态成员的限制 424
13.14.3 泛型数组限制 425
13.14.4 泛型异常限制 426
13.15 继续学习泛型 426
13.16 自测题 426
第14章 lambda表达式和方法引用 429
14.1 lambda表达式简介 430
14.1.1 lambda表达式的基础知识 431
14.1.2 函数式接口 432
14.1.3 几个lambda表达式示例 433
14.2 块lambda表达式 438
14.3 泛型函数式接口 439
14.4 lambda表达式和变量捕获 444
14.5 从 lambda表达式中抛出异常 446
14.6 方法引用 447
14.6.1 静态方法的方法引用 447
14.6.2 实例方法的方法引用 449
14.7 构造函数引用 452
14.8 预定义的函数式接口 455
14.9 自测题 456
第15章 模块 459
15.1 模块基础 460
15.1.1 简单的模块示例 461
15.1.2 编译、运行第一个模块示例 465
15.1.3 详述requires和exports 466
15.2 java.base和平台模块 466
15.3 旧代码和未命名的模块 467
15.4 导出到特定的模块 468
15.5 使用requires transitive 469
15.6 使用服务 473
15.6.1 服务和服务提供程序的基础知识 473
15.6.2 基于服务的关键字 474
15.6.3 基于模块的服务示例 474
15.7 其他模块功能 480
15.7.1 open模块 480
15.7.2 opens语句 481
15.7.3 requires static 481
15.8 继续学习模块 481
15.9 自测题 482
第16章 switch表达式、记录以及其他新近添加的特性 483
16.1 switch的增强 484
16.1.2 switch表达式和yield语句简介 486
16.1.3 case语句中的箭头 488
16.1.4 深入介绍箭头case 489
16.2 记录 495
16.2.1 记录的基础知识 495
16.2.2 创建记录构造函数 497
16.2.3 深入介绍记录的getter方法 501
16.3 instanceof的模式匹配 502
16.4 密封类和密封接口 503
16.4.1 密封类 504
16.4.2 密封接口 506
16.5 未来的发展方向 507
16.6 自测题 507
第17章 Swing介绍 509
17.1 Swing的起源和设计原则 510
17.2 组件和容器 512
17.2.1 组件 512
17.2.2 容器 513
17.2.3 顶级容器窗格 513
17.3 布局管理器 513
17.4 第一个简单的Swing程序 514
17.5 Swing事件处理 518
17.5.1 事件 518
17.5.2 事件源 519
17.5.3 事件监听器 519
17.5.4 事件类和监听器接口 519
17.6 使用JButton 520
17.7 使用JTextField 523
17.8 创建JCheckBox 526
17.9 使用JList 529
17.10 使用匿名内部类或lambda表达式来处理事件 538
17.11 自测题 539
—以下内容通过扫描封底二维码获取—
附录A 自测题答案 541
附录B 使用Java的文档注释 579
附录C 编译和运行简单的单文件程序 589
附录D JShell简介 591
附录E 更多Java关键字 601


【前言】

本书旨在帮助你学习Java程序设计的基础知识,采用循序渐进的教学方法,安排了许多示例、自测题和编程练习。本书不需要读者具备编程经验,是从最基础的知识,如何编译和运行Java程序开始讲起。然后讨论构成Java语言核心的关键字、特性和结构。还介绍Java的一些最重要的高级特性,如多线程编程、泛型、lambda表达式、记录和模块。此外,本书还介绍Swing基础。学完本书后,读者将能牢固掌握Java编程的精髓。
值得说明的是,本书只是学习Java的起点。Java不仅是一些定义语言的元素,还包括扩展的库和工具来帮助开发程序。要想成为顶尖的Java程序员,就必须掌握这些知识。读者在学完本书后,就有了足够的知识来继续学习Java的其他知识。
0.1 Java的发展历程
只有少数几种编程语言对程序设计带来过根本性影响。其中,Java的影响由于迅速和广泛而格外突出。可以毫不夸张地说,1995年Sun Microsystems公司发布的Java 1.0给计算机程序设计领域带来了一场变革。这场变革迅速将Web转变成一个高度交互的环境,也给计算机语言的设计设置了一个新标准。
多年来,Java不断发展、演化和修订。和其他语言加入新特性的动作迟缓不同,Java一直站在计算机程序设计语言的前沿,部分原因是其不断变革的文化,部分原因是它所面对的变化。Java已经做过或大或小的多次升级。
第一次主要升级是Java 1.1版,这次升级比较大,加入了很多新的库元素,修订了处理事件的方式,重新配置了1.0版本的库中的许多特性。

第二个主要版本是Java 2,它代表Java的第二代,标志着Java“现代化”的到来。Java 2第一个发布的版本号是1.2。Java 2在第一次发布时使用1.2版本号看上去有些奇怪。原因在于,该号码最初指Java库的内部版本号,后来就泛指整个版本号了。Java 2被Sun重新包装为J2SE(Java 2 Platform Standard Edition),并且开始把版本号应用于该产品。
Java的下一次升级是J2SE 1.3,它是Java 2版本首次较大的升级。它增强了已有的功能,精简了开发环境。J2SE 1.4进一步增强了Java。该版本包括一些重要的新功能,如链式异常、基于通道的I/O和assert关键字。
Java的下一版本是J2SE 5,它是Java的第二次变革。以前的几次Java升级提供的改进虽然重要,但都是增量式的,而J2SE 5却从该语言的作用域、功能和范围等方面提供了根本性的改进。为帮助理解J2SE 5的修改程度,下面列出了J2SE 5中的一些主要新功能:
● 泛型
● 自动装箱/自动拆箱
● 枚举
● 增强型for循环(for-each)
● 可变长度实参(varargs)
● 静态导入
● 注解(annotation)
这些功能都是升级后的重要结果,每个功能都代表了Java语言的一处重要改进。其中,泛型、增强型for循环和可变长度实参引入了新的语法元素;自动装箱和自动拆箱修改了语法规则;注解增加了一种全新的编程注释方法。
这些新功能的重要性反映在使用的版本号“5”上。从版本号的变化方式看,这一版本的Java应该是1.5。由于新功能和变革如此之多,常规的版本号升级(从1.4到1.5)已无法标识变化的幅度,因此Sun决定使用版本号5,以强调发生了重要改进。因此将这个版本称为J2SE 5,将开发工具包称为JDK 5。但是,为了保持和以前的一致性,Sun决定使用1.5作为内部版本号,也称为开发版本号。J2SE 5中的“5”称为产品版本号。
之后发布的Java版本是Java SE 6,Sun再次决定修改Java平台的名称,把“2”从版本号中删除了。Java平台现在的名称是Java SE,官方产品名称是Java Platform,Standard Edition 6,对应的Java开发工具包称为JDK 6。和J2SE 5一样,Java SE 6中的“6”是指产品的版本号,内部的开发版本号是1.6。
Java SE 6 建立在J2SE 5的基础之上,做了进一步的增强和改进。Java SE 6并没有对Java语言本身添加较重要的功能,而是增强了API库,添加了多个新包,改进了运行时环境。它在漫长的生命周期(Java术语)内经历了一些更新,添加了一些升级功能。总之,Java SE 6进一步巩固了J2SE 5建立的领先地位。
接下来的版本是Java SE 7,对应的Java开发工具包称为JDK 7,内部版本号是1.7。Java SE 7是Oracle收购Sun Microsystems之后发布的第一个主版本。Java SE 7包含许多新功能,对语言和API库做了许多增强。Java SE 7添加的最重要功能是在Project Coin中开发的那些功能。Project Coin的目的是确保把对Java语言所做的很多小改动包含到JDK 7中,其中包括:
● String可以控制switch语句。
● 二进制整型字面值。
● 在数值字面值中使用下画线。
● 新增一种称为try-with-resources的可扩展的try语句,支持自动资源管理。
● 构造泛型实例时,通过菱形运算符使用类型推断。
● 增强了异常处理,可以使用单个catch捕获两个或更多个异常(多重捕获),并且可以对重新抛出的异常进行更好的类型检查。
可以看到,虽然Project Coin中的功能被视为小改动,但是“小”这个词实在不能体现它们所带来的好处。特别是,try-with-resources语句会对大量代码的编写方式产生深远影响。
此后的版本是Java SE 8,对应的开发工具包是JDK 8,内部的开发版本号是1.8。JDK 8表示这是对Java语言的一次重大升级,因为本次升级包含了一种意义深远的新语言功能:lambda表达式。lambda表达式不但改变了概念化的编程方式,而且改变了Java代码的编写方式。使用lambda表达式,可以简化并减少创建某个结构所需的源代码量。另外,使用lambda表达式还可将新的运算符-> 和一种新的语法元素引入Java语言中。除了lambda表达式,JDK 8中还新增了其他一些重要功能。例如,从JDK 8开始,通过接口可为指定的方法定义默认实现。总之,Java SE 8扩展了Java语言的功能,并且改变了Java代码的编写方式,带来的影响足够深远。
再后的Java版本是Java SE 9,对应的开发工具包是JDK 9。JDK 9表示这是对Java语言的一次重大升级,合并了对Java语言及其库的重大改进。主要的新功能是模块,它允许指定构成应用程序的代码之间的关系和依赖。模块还给Java的访问控制功能添加了另一种方式。包括模块导致一个新的语法元素、几个新的关键字和各种工具改进被添加到Java中。模块还对API库具有深远影响,因为从JDK 9开始,库包现在被组织为模块。
除了模块,JDK 9还包括几个新功能。其中一个特别有趣的是JShell,它是一个支持交互式程序体验和学习的工具(有关JShell的简介,见附录D)。另一个有趣的升级是支持私有接口方法。包含它们进一步增强了JDK 8对接口中默认方法的支持。JDK 9给javadoc工具添加了搜索功能,还添加了一个新的标记@index来支持它。与以前的版本一样,JDK 9包含对Java API库的许多更新和增强。
作为一般规则,在任何Java版本中,都有令人瞩目的新功能。但JDK 9废弃了Java高度配置的一个方面:applet。从JDK 9开始,applet不再推荐在新项目中使用。如第1章所述,因为applet需要浏览器支持以及其他一些因素,JDK 9废弃了整个applet API。
Java的下一个版本是Java SE 10 (JDK 10)。然而,在发布它之前,Java发布计划发生了重大变化。过去,主要发行版通常间隔两年或更长时间。然而,从JDK 10开始,发行版之间的时间明显缩短了。现在预计发布将严格按照基于时间的计划表进行,主要发布版本(现在称为功能发布版本)之间的预期时间只有6个月。因此,JDK 10于2018年3月发布,也就是JDK 9发布6个月之后。这种更快的发布节奏使Java程序员能快速获得新特性和改进。当一个新特性准备好时,它将成为下一个预定发行版的一部分,而不是等待两年或更长时间。
Java发布计划的另一个变化在于长期支持(long-term support,LTS)版本。该版本预计每隔3年会发布一次。LTS版本的支持时间超过6个月,在这段时间内一直有效。JDK 11是第一个LTS版本,JDK 17是第二个LTS版本,本书针对后面这个版本进行了更新。因为LTS版本非常稳定,所以这种版本的功能集很可能成为之后几年的功能基准。关于长期支持以及LTS版本的发布计划表的最新信息,请查阅Oracle的相关文档。
JDK 10增加的主要新语言特性是支持局部变量类型推断。有了局部变量类型推断,现在可在初始化器的类型中推断局部变量的类型,而不是显式指定其类型。为了支持这个新功能,将上下文敏感的标识符var添加到Java中,作为保留类型名。类型推断可以简化代码,因为如果可以从初始化器中推断变量的类型,就不需要指定多余的变量类型。在难以识别类型或无法显式指定类型的情况下,它还可以简化声明。局部变量类型推断已成为当代编程环境的一个常见部分。它包含在Java中,帮助Java跟上语言设计不断发展的趋势。除了其他一些更改,JDK 10还重新定义了Java版本字符串,更改了版本号的含义,以便更好地与新的基于时间的发布计划保持一致。
Java的下一个版本是Java SE 11 (JDK 11)。它于2018年9月发布,比JDK 10晚了6个月。JDK 11中主要的新语言特性是支持在lambda表达式中使用var。此外,还向Java启动程序添加了另一种执行模式,使其能够直接执行简单的单文件程序。JDK 11还删除了一些特性。也许最有趣的是取消了对applet的支持,这是因为applet的历史意义所致。回顾一下,applet最初是由JDK 9弃用的。随着JDK 11的发布,对applet的支持已经被移除。JDK 11还删除了对另一种与部署相关的技术Java Web Start的支持。JDK 11中还有一个引人注目的删除:JavaFX;这个GUI框架不再是JDK的一部分,而是成为一个独立的开源项目。因为JDK已经删除了这些特性,所以本书不讨论它们。
JDK 11 LTS 和下一个 LTS 版本 (JDK 17) 之间有5个功能版本: JDK 12到 JDK 16。JDK 12和 JDK 13 没有添加任何新的语言功能。JDK 14添加了对switch表达式的支持,可以通过该switch表达式求值。另外,JDK 14还添加了对switch的其他增强。JDK 15中新增了文本块,文本块本质上是一些可以跨行的字符串字面值。JDK 16中通过模式匹配增强了instanceof,并且添加了一种新类型的类(称为记录)和一个新的、上下文敏感的record关键字。记录提供了一种方便的聚合数据的方法。JDK 16还提供了新的应用程序打包工具jpackage。
在撰写本书时,Java的最新版本是Java SE 17 (JDK 17)。如前所述,JDK 17是第二个 LTS Java 版本,因此它特别重要,其主要新特性在于能够密封(seal)类和接口。JDK 17的这种密封功能可以让你控制类的继承以及接口的继承和实现。为此,JDK 17还添加了上下文敏感的关键字sealed、permits和non-sealed(第一个带连字符的Java关键字)。JDK 17将applet API标记为将被删除。如前所述,Java早在几年前就不再提供对applet的支持。不过,只是不再推荐使用applet API,但依赖于该API的残留代码仍然可通过编译。随着JDK 17的发布,applet API将被未来的版本删除。
关于Java演化的另一要点是:从2006年开始,Java的开源过程就开始了。如今,JDK的开源实现是可用的。开源进一步促进了Java开发的动态性。Java的创新是安全的。Java仍然是编程界所期待的充满活力和灵活性的语言。
本书中的内容已通过JDK 11更新。然而,如前所述,Java编程的历史是以动态变化为标志的。随着对Java的学习不断深入,用户将希望查看后续Java发行版的每个新特性。简单地说:Java的演进还在继续!
0.2 本书的组织结构
本书采用教程式的组织结构,每一章都建立在前面章节的基础之上。本书共分17章,每一章讨论Java的一个方面。本书的特色就在于包含许多便于读者学习的特色内容。
● 关键技能与概念:每章首先介绍一些该章中要介绍的重要技能。
● 自测题:每章都有自测题,测试读者学习到的知识。答案在附录A中提供。
● 专家解答:每章中都穿插一些“专家解答”,以一问一答的形式介绍补充知识和要点。
● 编程练习:每章中都包含一两道编程练习,以帮助读者将学到的知识应用到实践中。很多这样的练习都是实际示例,读者可将其用作自己程序的起点。
0.3 本书不需要读者具有编程经验
本书假定读者没有任何编程经验。如果读者没有编程经验,阅读本书是正确的选择。如果读者有一些编程经验,在阅读本书时可以加快速度。但要记住,Java在几个重要的地方与其他一些流行的计算机语言不同,所以不要急于下结论。因此,即使读者是经验丰富的程序员,也仍然建议仔细阅读本书。
0.4 本书需要的软件环境
要编译和运行本书提供的所有程序,需要获得最新版本的Java Development Kit (JDK)。在撰写本书时,最新版本为JDK 17,这是Java SE 17使用的JDK版本。本书第1章介绍了如何获得Java JDK。
如果读者使用早期版本的Java,也仍然可以阅读本书,只是无法编译和运行使用了Java新功能的程序。
0.5 不要忘记Web上的代码
本书所有示例和编程项目的源代码都可以扫描封底二维码下载。
0.6 特别感谢
特别感谢本书的技术编辑Danny Coward。Danny编辑过我写的多本书籍,他的见解和建议总是很有价值,也很受读者赞赏。
0.7 进一步学习
本书是引导读者进入Herbert Schildt系列编程图书的大门,下面的一些书你也会感兴趣:
Java: The Complete Reference
Herb Schildt’s Java Programming Cookbook
The Art of Java
Swing: a Beginner’s Guide
Introducing JavaFX 8 Programming


返回顶部