提交 509fd8e1 编写于 作者: W wizardforcel

2021-10-11 21:50:56

上级 3aff8550
# 前言
# 零、前言
本书的目的是让读者对 Java 基础知识有一个坚实的理解,引导他们完成从基础到实际编程的一系列实践步骤。讨论和示例旨在激发专业直觉,使用经过验证的编程原则和实践。
......
# 计算机上的 Java 虚拟机(JVM)
# 一、计算机上的 Java 虚拟机(JVM)
这本书将是您获得中级 Java 编程技能的指南。编程不仅仅是了解语言语法。它还涉及编写、编译和执行程序或运行整个软件系统所需的工具和信息源。这条路的第一步是学习 Java 的重要组件,包括**Java 开发工具包****JDK**)和**Java 虚拟机****JVM**)。
......
# Java 语言基础
# 二、Java 语言基础
现在,您已经对 Java 及其相关术语和工具有了大致的了解,我们将开始讨论 Java 作为一种编程语言。
......
# 您的开发环境设置
# 三、您的开发环境设置
到目前为止,您可能已经对如何在计算机上编译和执行 Java 程序有了相当好的了解。现在,是学习如何编写程序的时候了。这一章是你做这件事之前的最后一步。因为您需要首先设置开发环境,所以本章将解释什么是开发环境,以及为什么需要它。然后,它将指导您完成配置和调优,包括类路径的设置。在此过程中,将提供流行编辑的概述和 IntelliJ IDEA 的具体建议。
......
# 您的第一个 Java 项目
# 四、您的第一个 Java 项目
在前几章中,您学习了很多关于 Java 的知识,包括它的基本方面和主要工具。现在,我们将应用所获得的知识来完成并向创建 Java 项目的实际程序迈出第一步。我们将向您展示如何编写应用程序代码,如何测试它,以及如何执行主代码及其测试。
......
# Java 语言元素和类型
# 五、Java 语言元素和类型
本章首先系统地介绍 Java,并定义语言元素标识符、变量、文本、关键字、分隔符和注释。它还描述了 Java 类型、基本类型和引用类型。特别注意的是`String`类、`enum`类型和数组。
......
# 接口、类和对象构造
# 六、接口、类和对象构造
本章向读者解释 Java 编程最重要的方面:**应用程序编程接口****API**)、对象工厂、方法重写、隐藏和重载。下面将解释聚合(相对于继承)的设计优势,开始讨论软件系统设计。本章最后概述了 Java 数据结构。
......
# 软件包和可访问性(可见性)
# 七、包和可访问性(可见性)
到现在为止,您已经非常熟悉软件包了。在本章中,我们将完成其描述,然后讨论类和类成员的不同可访问性级别(也称为可见性)——方法和字段。所有这些都将归结为面向对象编程的关键概念——封装——并为我们讨论面向对象的设计原则奠定了基础。
到现在为止,您已经非常熟悉包了。在本章中,我们将完成其描述,然后讨论类和类成员的不同可访问性级别(也称为可见性)——方法和字段。所有这些都将归结为面向对象编程的关键概念——封装——并为我们讨论面向对象的设计原则奠定了基础。
在本章中,我们将介绍以下主题:
......
# 面向对象设计(OOD)原则
# 八、面向对象设计(OOD)原则
在本章中,我们将回到编程的高级视图,特别是 Java 编程。我们将展示设计在软件系统过程中的作用,从最早的可行性阶段开始,经过高层设计、详细设计,最后是编码和测试。我们将讨论良好设计的标准,并为经过充分验证的 OOD 原则提供指南。讨论将通过演示主要 OOD 原则应用的代码示例进行说明。
......@@ -53,7 +53,7 @@
高级设计最明显的特点是,它关注子系统层次上的系统结构以及子系统之间的接口。如果产品必须与外部系统交互,那么这种交互的接口和协议也是高级设计的一部分。体系结构也被确定并验证为能够支持设计。
对于典型的中型软件系统,高级设计可以用软件包列表及其公共接口表示。如果系统有图形用户界面,其原型和线框通常就足够了。
对于典型的中型软件系统,高级设计可以用包列表及其公共接口表示。如果系统有图形用户界面,其原型和线框通常就足够了。
# 详细设计
......
# 运算符、表达式和语句
# 九、运算符、表达式和语句
在本章中,将详细定义和解释 Java 编程运算符、表达式和语句的三个核心元素。讨论将以具体例子加以支持,说明这些要素的关键方面。
......
# 控制流语句
# 十、控制流语句
本章描述一种特殊的 Java 语句,称为控制语句,它允许根据所实现算法的逻辑构建程序流,包括选择语句、迭代语句、分支语句和异常处理语句。
......@@ -537,7 +537,7 @@ for (String s: list){
但是,当不必访问数组或集合的所有元素时,可能更适合使用其他形式的迭代语句。
另外,请注意,由于 Java8,许多数据结构可以生成流,从而允许编写更紧凑的代码,并避免使用 for 语句。我们将在[第 18 章](18.html)*流和管道*中向您展示如何进行。
另外,请注意,由于 Java8,许多数据结构可以生成流,从而允许编写更紧凑的代码,并避免使用 for 语句。我们将在[第 18 章](18.html)*流和管道*中向您展示如何进行。
# 对于具有多个初始值设定项和表达式的
......
# JVM 进程和垃圾收集
# 十一、JVM 进程和垃圾收集
本章允许读者深入了解 JVM,并了解其流程。JVM 的结构和行为比仅仅根据编码逻辑执行一系列指令更复杂。JVM 发现并将应用程序请求的`.class`文件加载到内存中,验证它们,解释字节码(将它们转换为特定于平台的二进制代码),并将生成的机器代码传递给中央处理器(或多个处理器)执行,除应用程序线程外,还使用多个服务线程。其中一个称为垃圾收集的服务线程执行从未使用对象释放内存的重要任务。
......
# Java 标准和外部库
# 十二、Java 标准和外部库
甚至我们在本书中编写的第一个程序也使用了 JDK 中包含的一个库,称为标准库。如果不使用标准库,就不可能编写一个非常重要的程序。这就是为什么对这些库的熟悉与对语言本身的了解一样对成功编程至关重要的原因。
还有一些非标准库,它们被称为外部库或第三方库,因为它们不包括在 JDK 发行版中,但它们的使用频率几乎相同。他们早已成为任何程序员工具包的永久成员。同时,跟踪这些库中可用的所有功能并不像跟上 Java 本身那么容易。这是因为 IDE 为您提供了关于语言可能性的提示,但它不能建议尚未导入的包的功能。唯一一个自动导入且不需要导入的软件包是`java.lang`,这将是我们在本章中的第一个概述。
还有一些非标准库,它们被称为外部库或第三方库,因为它们不包括在 JDK 发行版中,但它们的使用频率几乎相同。他们早已成为任何程序员工具包的永久成员。同时,跟踪这些库中可用的所有功能并不像跟上 Java 本身那么容易。这是因为 IDE 为您提供了关于语言可能性的提示,但它不能建议尚未导入的包的功能。唯一一个自动导入且不需要导入的包是`java.lang`,这将是我们在本章中的第一个概述。
本章讨论的主题包括:
......@@ -36,7 +36,7 @@
如果您在 internet 上搜索“JavaAPI”,您将发现 JDK 中包含的所有包的在线描述。一些包名称以`java`开头。它们传统上被称为核心 Java 包,而那些以`javax`开头的被称为扩展。这样做可能是因为扩展被认为是可选的,甚至可能独立于 JDK 发布。也有人试图将以前的扩展库提升为核心包,但这需要将包的名称从 Java 更改为 Javax,这将破坏现有的应用程序。因此,这个想法被抛弃了,扩展成为 JDK 的标准部分,成为核心,核心和扩展之间的区别逐渐消失。
这就是为什么如果您查看 Oracle 网站上的官方 Java API,您将看到不仅有`java``javax`软件包被列为标准,还有`jdk``com.sun``org.xml`和其他一些软件包也被列为标准。这些额外的包主要由工具或其他专用应用程序使用。在本书中,我们将主要关注主流 Java 编程,只讨论`java``javax`包。
这就是为什么如果您查看 Oracle 网站上的官方 Java API,您将看到不仅有`java``javax`包被列为标准,还有`jdk``com.sun``org.xml`和其他一些包也被列为标准。这些额外的包主要由工具或其他专用应用程序使用。在本书中,我们将主要关注主流 Java 编程,只讨论`java``javax`包。
# java.lang
......@@ -143,7 +143,7 @@
1997,Sun MetaSnices 和 Netscape 通信公司引入 java 基础类,后来称为 Swing,并放入包 Tyt0.使用 Swing 构建的 GUI 组件可以模拟一些本机平台的外观,但也允许用户插入不依赖于其运行平台的外观。它通过添加选项卡式面板、滚动窗格、表格和列表扩展了 GUI 可能拥有的小部件列表。Swing 组件被称为轻量级组件,因为它们不依赖于本机代码,并且完全用 Java 实现。
2007 年,Sun Microsystems 发布了 JavaFX,它最终成为一个软件平台,用于在许多不同的设备上创建和交付桌面应用程序,以取代 Swing 作为 JavaSE 的标准 GUI 库。它位于以`javafx`开头的软件包中,支持所有主要的桌面操作系统和多个移动操作系统,包括 Symbian 操作系统、Windows mobile 和一些专有的实时操作系统。
2007 年,Sun Microsystems 发布了 JavaFX,它最终成为一个软件平台,用于在许多不同的设备上创建和交付桌面应用程序,以取代 Swing 作为 JavaSE 的标准 GUI 库。它位于以`javafx`开头的包中,支持所有主要的桌面操作系统和多个移动操作系统,包括 Symbian 操作系统、Windows mobile 和一些专有的实时操作系统。
JavaFX 为 GUI 开发人员增加了对平滑动画、web 视图、音频和视频播放以及基于**级联样式表****CSS**的样式的支持。然而,Swing 有更多的组件和第三方库,因此使用 JavaFX 可能需要创建在 Swing 中很久以前就已经实现的自定义组件和管道。这就是为什么根据 Oracle 网站([上的官方回复,尽管 JavaFX 被推荐为桌面 GUI 实现的首选,但 Swing 在可预见的未来仍将是 Java 的一部分 http://www.oracle.com/technetwork/java/javafx/overview/faq-1446554.html#6](http://www.oracle.com/technetwork/java/javafx/overview/faq-1446554.html#6) )。因此,可以继续使用 Swing,但如果可能,最好切换到 JavaFX。
......@@ -202,7 +202,7 @@ Apache Commons 项目包括三个部分:
* **Commons 休眠**:当前处于非活动状态的组件的存储库;您可以在那里使用代码,但必须自己构建组件,因为这些组件可能不会在不久的将来发布
* **Commons 本体**:可重用 Java 组件,组成实际库`org.apache.commons`
在以下小节中,我们将只讨论 Commons Prime 最流行的四个软件包:
在以下小节中,我们将只讨论 Commons Prime 最流行的四个包:
* `org.apache.commons.io`
* `org.apache.commons.lang`
......
# Java 集合
# 十三、Java 集合
本章将帮助读者更加熟悉最常用的 Java 集合。代码示例演示了它们的功能,并允许进行实验,强调不同集合类型及其实现之间的差异。
......@@ -1200,7 +1200,7 @@ set.forEach(System.out::println);
`next()``hasNext()`方法由`for`幕后陈述使用。
还可以使用可通过方法`stream()``parallelStream()`获得的`Stream`类的对象对集合元素进行迭代。我们将在[第 18 章](18.html)*流和管道中向您展示如何做到这一点。*
还可以使用可通过方法`stream()``parallelStream()`获得的`Stream`类的对象对集合元素进行迭代。我们将在[第 18 章](18.html)*流和管道中向您展示如何做到这一点。*
# 使用泛型添加
......
# 管理集合和数组
# 十四、管理集合和数组
我们将在本章中讨论的类允许我们创建、初始化和修改 Java 集合和数组的对象。它们还允许创建不可修改和不可变的集合。其中一些类属于 Java 标准库,另一些属于流行的 Apache Commons 库。了解这些类并熟悉它们的方法对于任何 Java 程序员来说都是必不可少的。
......@@ -334,7 +334,7 @@ System.out.println(map3); //prints: {1=, 2=s2}
好消息是,一段时间后,您将习惯它,流和函数式编程对您来说将开始变得简单。与传统的面向对象代码相比,您甚至更喜欢它,因为使用函数和流可以使代码更紧凑、更强大、更干净,尤其是在必须高效处理大量数据(大数据)的情况下,这似乎是当前的趋势,并延伸到遥远的未来。
我们将在[第 17 章](17.html)*Lambda 表达式和函数编程中对此进行详细介绍;[第 18 章](18.html)中的**流和管道*;在[第 19 章](19.html)*反应系统*
我们将在[第 17 章](17.html)*Lambda 表达式和函数编程中对此进行详细介绍;[第 18 章](18.html)中的**流和管道*;在[第 19 章](19.html)*反应系统*
# 不变集合
......@@ -406,7 +406,7 @@ source[0]="s0";
System.out.println(iList2); //prints: [s1, s2]
```
看起来我们这里有`source`对原始值的引用。但是,流不维护值与其源之间的引用。它在处理每个值之前复制它们,从而断开该值与其源的连接。这就是为什么我们试图通过改变`source`数组的一个元素来改变`iList2`的元素没有成功。我们将在[第 18 章](18.html)*溪流和管道*中详细介绍溪流。
看起来我们这里有`source`对原始值的引用。但是,流不维护值与其源之间的引用。它在处理每个值之前复制它们,从而断开该值与其源的连接。这就是为什么我们试图通过改变`source`数组的一个元素来改变`iList2`的元素没有成功。我们将在[第 18 章](18.html)*流和管道*中详细介绍流。
对不可变集合的需求源于在将集合对象作为参数传递到方法中时保护其不被修改的努力。正如我们已经提到的,这样的修改将是一个副作用,可能会引入意外和难以跟踪的缺陷。
......@@ -1247,7 +1247,7 @@ Set<String> set2 = new HashSet<>(Set.of("s0", "s1"));
* `fill()``setAll()``parallelPrefix()``parallelSetAll()`:设置数组中每个元素的值(固定值或由提供的函数生成)或索引范围指定的值
* `sort()``parallelSort()`:对数组的元素进行排序或仅对数组的一部分进行排序(由索引范围指定)
* `splititerator()`:返回一个`Splititerator`对象,用于并行处理数组或数组的一部分(由索引范围指定)
* `stream()`:生成数组元素流或部分数组元素流(由索引范围指定);参见[第 18 章](18.html)*流及管道*
* `stream()`:生成数组元素流或部分数组元素流(由索引范围指定);参见[第 18 章](18.html)*流及管道*
所有这些方法都很有帮助,但我们想让您注意到`equals(a1, a2)``deepEquals(a1, a2)`方法。它们对于数组比较特别有用,因为数组对象不允许实现自定义方法`equals(a)`,因此总是使用只比较引用的类`Object`的实现。
......
# 管理对象、字符串、时间和随机数
# 十五、管理对象、字符串、时间和随机数
我们将在本章中讨论的类与前几章中讨论的 Java 集合和数组一起属于一组类(主要是 Java 标准库和 Apache Commons 中的实用程序),每个程序员都必须掌握这些类才能成为有效的编码者。它们还说明了各种具有指导意义的软件设计和解决方案,可以作为最佳编码实践的模式。
......@@ -1308,7 +1308,7 @@ String result = random.ints(3, 0, 101)
```
此代码返回从 0(含)到 100(含)的三个整数值。我们将在[第 18 章](18.html)*溪流和管道*中进一步讨论溪流。
此代码返回从 0(含)到 100(含)的三个整数值。我们将在[第 18 章](18.html)*流和管道*中进一步讨论流。
# 练习–Objects.equals()结果
......
# 数据库编程
# 十六、数据库编程
本章介绍如何编写 Java 代码,以操作数据库中的插入、读取、更新和删除数据。本文还简要介绍了 SQL 语言和基本数据库操作。
......
# Lambda 表达式与函数式编程
# 十七、Lambda 表达式与函数式编程
本章解释函数式编程的概念。它概述了 JDK 附带的函数接口,解释了如何在 lambda 表达式中使用它们,以及如何以最简洁的风格编写 lambda 表达式。
......
# 流和管道
# 十八、流和管道
上一章中描述和演示的 lambda 表达式以及函数接口为 Java 添加了强大的函数编程功能。它允许将行为(函数)作为参数传递给为数据处理性能而优化的库。通过这种方式,应用程序程序员可以专注于开发系统的业务方面,将性能方面留给专家:库的作者。这种库的一个例子是`java.util.stream`包,这将是本章的重点。
......@@ -10,7 +10,7 @@
* 创建流
* 中间业务
* 终端操作
* 流管道
* 流管道
* 并行处理
* 练习–将所有流元素相乘
......
# 反应系统
# 十六、反应式系统
在本书的最后一章中,我们将打破相关叙述的流程,更接近现实生活中的专业编程。随着处理的数据越来越多,服务越来越复杂,对更具适应性、高度可扩展性和分布式应用程序的需求呈指数级增长。这就是我们将在本章中讨论的,这样一个软件系统在实践中的外观。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册