提交 45801a96 编写于 作者: W wizardforcel

interface => 接口

上级 6b6b297a
...@@ -120,7 +120,7 @@ list = new JList(listModel); ...@@ -120,7 +120,7 @@ list = new JList(listModel);
``` ```
这个特殊程序使用`DefaultListModel`的实例,这是 Swing 提供的一个类。尽管有类名,但列表没有`DefaultListModel`,除非你的程序明确地这样做。如果`DefaultListModel`不符合您的需要,您可以编写自定义列表模型,该模型必须符合`ListModel`界面 这个特殊程序使用`DefaultListModel`的实例,这是 Swing 提供的一个类。尽管有类名,但列表没有`DefaultListModel`,除非你的程序明确地这样做。如果`DefaultListModel`不符合您的需要,您可以编写自定义列表模型,该模型必须符合`ListModel`接口
以下代码段显示了在 **Fire** 按钮上注册的动作监听器的`actionPerformed`方法。粗体代码行将删除列表中的选定项。如果列表现在为空,则方法中的其余行将禁用触发按钮,如果不是,则进行另一个选择。 以下代码段显示了在 **Fire** 按钮上注册的动作监听器的`actionPerformed`方法。粗体代码行将删除列表中的选定项。如果列表现在为空,则方法中的其余行将禁用触发按钮,如果不是,则进行另一个选择。
......
...@@ -770,7 +770,7 @@ sportColumn.setCellEditor(new DefaultCellEditor(comboBox)); ...@@ -770,7 +770,7 @@ sportColumn.setCellEditor(new DefaultCellEditor(comboBox));
[![Launches the TableRenderDemo example](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TableRenderDemoProject/TableRenderDemo.jnlp) [![Launches the TableRenderDemo example](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TableRenderDemoProject/TableRenderDemo.jnlp)
无论是为单个单元格列设置编辑器(使用`TableColumn` `setCellEditor`方法)还是为特定类型的数据设置(使用`JTable` `setDefaultEditor`方法),都可以使用参数指定编辑器坚持`TableCellEditor`界面。幸运的是,`DefaultCellEditor`类实现了这个接口并提供了构造器,让你可以指定一个`JTextField``JCheckBox``JComboBox`的编辑组件。通常,您不必将复选框显式指定为编辑器,因为具有`Boolean`数据的列会自动使用复选框渲染器和编辑器。 无论是为单个单元格列设置编辑器(使用`TableColumn` `setCellEditor`方法)还是为特定类型的数据设置(使用`JTable` `setDefaultEditor`方法),都可以使用参数指定编辑器坚持`TableCellEditor`接口。幸运的是,`DefaultCellEditor`类实现了这个接口并提供了构造器,让你可以指定一个`JTextField``JCheckBox``JComboBox`的编辑组件。通常,您不必将复选框显式指定为编辑器,因为具有`Boolean`数据的列会自动使用复选框渲染器和编辑器。
如果要指定除文本字段,复选框或组合框之外的编辑器,该怎么办?由于`DefaultCellEditor`不支持其他类型的组件,您必须做更多的工作。您需要创建一个实现 [`TableCellEditor`](https://docs.oracle.com/javase/8/docs/api/javax/swing/table/TableCellEditor.html) 接口的类。 [`AbstractCellEditor`](https://docs.oracle.com/javase/8/docs/api/javax/swing/AbstractCellEditor.html) 类是一个很好用的超类。它实现了`TableCellEditor`的超接口 [`CellEditor`](https://docs.oracle.com/javase/8/docs/api/javax/swing/CellEditor.html) ,省去了实现单元编辑器所需的事件触发代码的麻烦。 如果要指定除文本字段,复选框或组合框之外的编辑器,该怎么办?由于`DefaultCellEditor`不支持其他类型的组件,您必须做更多的工作。您需要创建一个实现 [`TableCellEditor`](https://docs.oracle.com/javase/8/docs/api/javax/swing/table/TableCellEditor.html) 接口的类。 [`AbstractCellEditor`](https://docs.oracle.com/javase/8/docs/api/javax/swing/AbstractCellEditor.html) 类是一个很好用的超类。它实现了`TableCellEditor`的超接口 [`CellEditor`](https://docs.oracle.com/javase/8/docs/api/javax/swing/CellEditor.html) ,省去了实现单元编辑器所需的事件触发代码的麻烦。
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/uiswing/components/icon.html](https://docs.oracle.com/javase/tutorial/uiswing/components/icon.html) > 原文: [https://docs.oracle.com/javase/tutorial/uiswing/components/icon.html](https://docs.oracle.com/javase/tutorial/uiswing/components/icon.html)
许多 Swing 组件,例如标签,按钮和标签窗格,都可以使用 _ 图标 _ 进行装饰 - 一个固定大小的图片。图标是符合 [`Icon`](https://docs.oracle.com/javase/8/docs/api/javax/swing/Icon.html) 界面的对象。 Swing 提供了`Icon`界面特别有用的实现: [`ImageIcon`](https://docs.oracle.com/javase/8/docs/api/javax/swing/ImageIcon.html) ,它从 GIF,JPEG 或 PNG 图像绘制图标。 许多 Swing 组件,例如标签,按钮和标签窗格,都可以使用 _ 图标 _ 进行装饰 - 一个固定大小的图片。图标是符合 [`Icon`](https://docs.oracle.com/javase/8/docs/api/javax/swing/Icon.html) 接口的对象。 Swing 提供了`Icon`接口特别有用的实现: [`ImageIcon`](https://docs.oracle.com/javase/8/docs/api/javax/swing/ImageIcon.html) ,它从 GIF,JPEG 或 PNG 图像绘制图标。
这是一个带有三个标签的应用程序的快照,其中两个用图标装饰: 这是一个带有三个标签的应用程序的快照,其中两个用图标装饰:
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
`SwingWorker`提供了许多通信和控制功能: `SwingWorker`提供了许多通信和控制功能:
* `SwingWorker`子类可以定义一个方法`done`,该方法在后台任务完成时在事件派发线程上自动调用。 * `SwingWorker`子类可以定义一个方法`done`,该方法在后台任务完成时在事件派发线程上自动调用。
* `SwingWorker`实现 [`java.util.concurrent.Future`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html) 。此接口允许后台任务为其他线程提供返回值。此界面中的其他方法允许取消后台任务并发现后台任务是否已完成或已取消。 * `SwingWorker`实现 [`java.util.concurrent.Future`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html) 。此接口允许后台任务为其他线程提供返回值。此接口中的其他方法允许取消后台任务并发现后台任务是否已完成或已取消。
* 后台任务可以通过调用`SwingWorker.publish`来提供中间结果,从而使事件调度线程调用`SwingWorker.process` * 后台任务可以通过调用`SwingWorker.publish`来提供中间结果,从而使事件调度线程调用`SwingWorker.process`
* 后台任务可以定义绑定属性。对这些属性的更改会触发事件,从而导致在事件派发线程上调用事件处理方法。 * 后台任务可以定义绑定属性。对这些属性的更改会触发事件,从而导致在事件派发线程上调用事件处理方法。
......
...@@ -374,7 +374,7 @@ class AccessibleRulerState extends AccessibleState { ...@@ -374,7 +374,7 @@ class AccessibleRulerState extends AccessibleState {
| [AccessibleAction](https://docs.oracle.com/javase/8/docs/api/javax/accessibility/AccessibleAction.html) | 表示对象可以执行操作。通过实现此接口,可访问上下文可以提供有关可访问对象可以执行的操作的信息,并可以告知可访问对象执行它们。 | | [AccessibleAction](https://docs.oracle.com/javase/8/docs/api/javax/accessibility/AccessibleAction.html) | 表示对象可以执行操作。通过实现此接口,可访问上下文可以提供有关可访问对象可以执行的操作的信息,并可以告知可访问对象执行它们。 |
| [AccessibleComponent](https://docs.oracle.com/javase/8/docs/api/javax/accessibility/AccessibleComponent.html) | 表示可访问对象具有屏幕存在。通过此接口,可访问对象可以提供有关其大小,位置,可见性等的信息。所有标准 Swing 组件的可访问上下文直接或间接地实现此接口。自定义组件的可访问上下文应该这样做。 `AccessibleExtendedComponent`方法是首选。 | | [AccessibleComponent](https://docs.oracle.com/javase/8/docs/api/javax/accessibility/AccessibleComponent.html) | 表示可访问对象具有屏幕存在。通过此接口,可访问对象可以提供有关其大小,位置,可见性等的信息。所有标准 Swing 组件的可访问上下文直接或间接地实现此接口。自定义组件的可访问上下文应该这样做。 `AccessibleExtendedComponent`方法是首选。 |
| [AccessibleEditableText](https://docs.oracle.com/javase/8/docs/api/javax/accessibility/AccessibleEditableText.html) | [AccessibleEditableText](https://docs.oracle.com/javase/8/docs/api/javax/accessibility/AccessibleEditableText.html)
| 表示可访问对象显示可编辑文本。除了可从其超界面`AccessibleText`获得的信息之外,还提供了用于剪切,粘贴,删除,选择和插入文本的方法。 | | 表示可访问对象显示可编辑文本。除了可从其超接口`AccessibleText`获得的信息之外,还提供了用于剪切,粘贴,删除,选择和插入文本的方法。 |
| [AccessibleExtendedComponent](https://docs.oracle.com/javase/8/docs/api/javax/accessibility/AccessibleExtendedComponent.html) | [AccessibleExtendedComponent](https://docs.oracle.com/javase/8/docs/api/javax/accessibility/AccessibleExtendedComponent.html)
| 除了可从其超接口`AccessibleComponent`获得的信息之外,还提供了用于获取键绑定,边框文本和工具提示文本的方法。 | | 除了可从其超接口`AccessibleComponent`获得的信息之外,还提供了用于获取键绑定,边框文本和工具提示文本的方法。 |
| [AccessibleExtendedTable](https://docs.oracle.com/javase/8/docs/api/javax/accessibility/AccessibleExtendedTable.html) | [AccessibleExtendedTable](https://docs.oracle.com/javase/8/docs/api/javax/accessibility/AccessibleExtendedTable.html)
......
...@@ -18,7 +18,7 @@ Java 基础类,Swing 和抽象窗口工具包(AWT),使开发人员能够 ...@@ -18,7 +18,7 @@ Java 基础类,Swing 和抽象窗口工具包(AWT),使开发人员能够
[`SplashScreen`](https://docs.oracle.com/javase/8/docs/api/java/awt/SplashScreen.html) 类用于关闭启动画面,更改启动画面图像,获取图像位置或大小,以及在启动画面中绘画。应用程序无法创建此类的实例。只能在此类中创建单个实例,并且可以使用`getSplashScreen()`静态方法获取此实例。如果应用程序在启动时未通过命令行或清单文件选项创建启动屏幕,则`getSplashScreen`方法返回 null。 [`SplashScreen`](https://docs.oracle.com/javase/8/docs/api/java/awt/SplashScreen.html) 类用于关闭启动画面,更改启动画面图像,获取图像位置或大小,以及在启动画面中绘画。应用程序无法创建此类的实例。只能在此类中创建单个实例,并且可以使用`getSplashScreen()`静态方法获取此实例。如果应用程序在启动时未通过命令行或清单文件选项创建启动屏幕,则`getSplashScreen`方法返回 null。
通常,开发人员希望将闪屏图像保留在屏幕上并在图像上显示某些内容。闪屏窗口具有带 alpha 通道的覆盖表面,可以使用传统的`Graphics2D`界面访问此表面。 通常,开发人员希望将闪屏图像保留在屏幕上并在图像上显示某些内容。闪屏窗口具有带 alpha 通道的覆盖表面,可以使用传统的`Graphics2D`接口访问此表面。
以下代码段显示如何获取`SplashScreen`对象,然后如何使用`createGraphics()`方法创建图形上下文: 以下代码段显示如何获取`SplashScreen`对象,然后如何使用`createGraphics()`方法创建图形上下文:
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
[![trail icon](img/0689397fa9cc4e369d63fc92b3bb6f38.jpg) **简介**](intro/index.html) 告诉您什么是收藏品,以及它们如何让您的工作更轻松,您的计划更好。您将了解构成集合框架的核心元素:_ 接口 _,_ 实现 _ 和 _ 算法 _。 [![trail icon](img/0689397fa9cc4e369d63fc92b3bb6f38.jpg) **简介**](intro/index.html) 告诉您什么是收藏品,以及它们如何让您的工作更轻松,您的计划更好。您将了解构成集合框架的核心元素:_ 接口 _,_ 实现 _ 和 _ 算法 _。
[![trail icon](img/0689397fa9cc4e369d63fc92b3bb6f38.jpg) **接口**](interfaces/index.html) 描述了 _ 核心集合接口 _,它们是 Java Collections Framework 的核心和灵魂。您将学习有效使用这些接口的一般准则,包括何时使用哪个接口。您还将学习每个界面的习惯用法,以帮助您充分利用界面 [![trail icon](img/0689397fa9cc4e369d63fc92b3bb6f38.jpg) **接口**](interfaces/index.html) 描述了 _ 核心集合接口 _,它们是 Java Collections Framework 的核心和灵魂。您将学习有效使用这些接口的一般准则,包括何时使用哪个接口。您还将学习每个接口的习惯用法,以帮助您充分利用接口
[![trail icon](img/0689397fa9cc4e369d63fc92b3bb6f38.jpg) **聚合操作**](streams/index.html) 代表您迭代集合,这使您能够编写更简洁有效的代码来处理存储在集合中的元素。 [![trail icon](img/0689397fa9cc4e369d63fc92b3bb6f38.jpg) **聚合操作**](streams/index.html) 代表您迭代集合,这使您能够编写更简洁有效的代码来处理存储在集合中的元素。
......
...@@ -21,14 +21,14 @@ public interface Collection<E>... ...@@ -21,14 +21,14 @@ public interface Collection<E>...
`&lt;E&gt;`语法告诉您接口是通用的。当您声明`Collection`实例时,您可以 _ 并且 _ 应该指定集合中包含的对象类型。指定类型允许编译器验证(在编译时)您放入集合的对象类型是否正确,从而减少运行时的错误。有关泛型类型的信息,请参阅[泛型(更新)](../../java/generics/index.html)课程。 `&lt;E&gt;`语法告诉您接口是通用的。当您声明`Collection`实例时,您可以 _ 并且 _ 应该指定集合中包含的对象类型。指定类型允许编译器验证(在编译时)您放入集合的对象类型是否正确,从而减少运行时的错误。有关泛型类型的信息,请参阅[泛型(更新)](../../java/generics/index.html)课程。
当您了解如何使用这些接口时,您将了解有关 Java Collections Framework 的大部分知识。本章讨论有效使用接口的一般准则,包括何时使用哪个接口。您还将学习每个界面的编程习惯用语,以帮助您充分利用它。 当您了解如何使用这些接口时,您将了解有关 Java Collections Framework 的大部分知识。本章讨论有效使用接口的一般准则,包括何时使用哪个接口。您还将学习每个接口的编程习惯用语,以帮助您充分利用它。
为了保持核心集合接口的数量可管理,Java 平台不为每个集合类型的每个变体提供单独的接口。 (这些变体可能包括不可变,固定大小和仅附加。)而是,每个接口中的修改操作被指定为 _ 可选 _ - 给定的实现可以选择不支持所有操作。如果调用了不支持的操作,则集合将抛出 [`UnsupportedOperationException`](https://docs.oracle.com/javase/8/docs/api/java/lang/UnsupportedOperationException.html) 。实现负责记录它们支持哪些可选操作。所有 Java 平台的通用实现都支持所有可选操作。 为了保持核心集合接口的数量可管理,Java 平台不为每个集合类型的每个变体提供单独的接口。 (这些变体可能包括不可变,固定大小和仅附加。)而是,每个接口中的修改操作被指定为 _ 可选 _ - 给定的实现可以选择不支持所有操作。如果调用了不支持的操作,则集合将抛出 [`UnsupportedOperationException`](https://docs.oracle.com/javase/8/docs/api/java/lang/UnsupportedOperationException.html) 。实现负责记录它们支持哪些可选操作。所有 Java 平台的通用实现都支持所有可选操作。
以下列表描述了核心集合接口: 以下列表描述了核心集合接口:
* `Collection` - 集合层次结构的根。集合表示一组称为 _ 元素 _ 的对象。 `Collection`接口是所有集合实现的最小公分母,用于传递集合并在需要最大通用性时对其进行操作。某些类型的集合允许重复元素,而其他集合则不允许。有些是订购的,有些则是无序的。 Java 平台不提供此接口的任何直接实现,但提供更具体的子接口的实现,例如`Set``List`。另见[`collection`接口](collection.html)部分。 * `Collection` - 集合层次结构的根。集合表示一组称为 _ 元素 _ 的对象。 `Collection`接口是所有集合实现的最小公分母,用于传递集合并在需要最大通用性时对其进行操作。某些类型的集合允许重复元素,而其他集合则不允许。有些是订购的,有些则是无序的。 Java 平台不提供此接口的任何直接实现,但提供更具体的子接口的实现,例如`Set``List`。另见[`collection`接口](collection.html)部分。
* `Set` - 不能包含重复元素的集合。该界面对数学集抽象进行建模,并用于表示集合,例如包含扑克牌的牌,构成学生日程的课程或在机器上运行的过程。另请参见[设置接口](set.html)部分。 * `Set` - 不能包含重复元素的集合。该接口对数学集抽象进行建模,并用于表示集合,例如包含扑克牌的牌,构成学生日程的课程或在机器上运行的过程。另请参见[设置接口](set.html)部分。
* `List` - 有序集合(有时称为 _ 序列 _)。 `List`可以包含重复元素。 `List`的用户通常精确控制列表中每个元素的插入位置,并且可以通过整数索引(位置)访问元素。如果你使用过`Vector`,你就会熟悉`List`的一般风味。另见[列表接口](list.html)部分。 * `List` - 有序集合(有时称为 _ 序列 _)。 `List`可以包含重复元素。 `List`的用户通常精确控制列表中每个元素的插入位置,并且可以通过整数索引(位置)访问元素。如果你使用过`Vector`,你就会熟悉`List`的一般风味。另见[列表接口](list.html)部分。
* `Queue` — a collection used to hold multiple elements prior to processing. Besides basic `Collection` operations, a `Queue` provides additional insertion, extraction, and inspection operations. * `Queue` — a collection used to hold multiple elements prior to processing. Besides basic `Collection` operations, a `Queue` provides additional insertion, extraction, and inspection operations.
......
...@@ -104,7 +104,7 @@ java FindDups i came i saw i left ...@@ -104,7 +104,7 @@ java FindDups i came i saw i left
请注意,代码始终通过其接口类型(`Set`)而不是其实现类型引用`Collection`。这是 _ 强烈 _ 推荐的编程实践,因为它使您可以灵活地仅通过更改构造器来更改实现。如果用于存储集合的变量或用于传递它的参数被声明为`Collection`的实现类型而不是其接口类型,_ 所有 _ 这样的变量和参数必须是已更改以更改其实现类型。 请注意,代码始终通过其接口类型(`Set`)而不是其实现类型引用`Collection`。这是 _ 强烈 _ 推荐的编程实践,因为它使您可以灵活地仅通过更改构造器来更改实现。如果用于存储集合的变量或用于传递它的参数被声明为`Collection`的实现类型而不是其接口类型,_ 所有 _ 这样的变量和参数必须是已更改以更改其实现类型。
此外,无法保证生成的程序能够正常运行。如果程序使用原始实现类型中存在但未在新实现类型中存在的任何非标准操作,则程序将失败。仅通过其界面引用集合可防止您使用任何非标准操作。 此外,无法保证生成的程序能够正常运行。如果程序使用原始实现类型中存在但未在新实现类型中存在的任何非标准操作,则程序将失败。仅通过其接口引用集合可防止您使用任何非标准操作。
前面例子中`Set`的实现类型是`HashSet`,它不能保证`Set`中元素的顺序。如果您希望程序按字母顺序打印单词列表,只需将`Set`的实现类型从`HashSet`更改为`TreeSet`。进行这个简单的单行更改会导致前一个示例中的命令行生成以下输出。 前面例子中`Set`的实现类型是`HashSet`,它不能保证`Set`中元素的顺序。如果您希望程序按字母顺序打印单词列表,只需将`Set`的实现类型从`HashSet`更改为`TreeSet`。进行这个简单的单行更改会导致前一个示例中的命令行生成以下输出。
......
...@@ -9,7 +9,7 @@ Collections.sort(l); ...@@ -9,7 +9,7 @@ Collections.sort(l);
``` ```
如果`List``String`元素组成,它将按字母顺序排序。如果它由`Date`元素组成,它将按时间顺序排序。这是怎么发生的? `String``Date`均实现 `[可比较](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html)` 界面`Comparable`实现为类提供 _ 自然排序 _,允许该类的对象自动排序。 下表总结了一些实现`Comparable`的更重要的 Java 平台类。 如果`List``String`元素组成,它将按字母顺序排序。如果它由`Date`元素组成,它将按时间顺序排序。这是怎么发生的? `String``Date`均实现 [`Comparable`](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html) 接口`Comparable`实现为类提供 _ 自然排序 _,允许该类的对象自动排序。 下表总结了一些实现`Comparable`的更重要的 Java 平台类。
**Classes Implementing Comparable** **Classes Implementing Comparable**
| 类 | 自然排序 | | 类 | 自然排序 |
......
...@@ -33,4 +33,4 @@ protected boolean removeEldestEntry(Map.Entry eldest) { ...@@ -33,4 +33,4 @@ protected boolean removeEldestEntry(Map.Entry eldest) {
[`java.util.concurrent`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html) 包含 [`ConcurrentMap`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html) 接口,用原子`putIfAbsent``remove``replace`方法扩展`Map`[`ConcurrentHashMap`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html) 实现该接口。 [`java.util.concurrent`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html) 包含 [`ConcurrentMap`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html) 接口,用原子`putIfAbsent``remove``replace`方法扩展`Map`[`ConcurrentHashMap`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html) 实现该接口。
`ConcurrentHashMap`是一个由哈希表备份的高度并发,高性能的实现。执行检索时,此实现永远不会阻塞,并允许客户端选择更新的并发级别。它旨在作为`Hashtable`的直接替代:除了实现`ConcurrentMap`之外,它还支持`Hashtable`特有的所有遗留方法。同样,如果您不需要遗留操作,请小心使用`ConcurrentMap`界面对其进行操作。 `ConcurrentHashMap`是一个由哈希表备份的高度并发,高性能的实现。执行检索时,此实现永远不会阻塞,并允许客户端选择更新的并发级别。它旨在作为`Hashtable`的直接替代:除了实现`ConcurrentMap`之外,它还支持`Hashtable`特有的所有遗留方法。同样,如果您不需要遗留操作,请小心使用`ConcurrentMap`接口对其进行操作。
\ No newline at end of file \ No newline at end of file
...@@ -10,7 +10,7 @@ API 中的方法定义明确,其行为清晰且预期。例如,使用 `null` ...@@ -10,7 +10,7 @@ API 中的方法定义明确,其行为清晰且预期。例如,使用 `null`
## 流利 ## 流利
Date-Time API 提供了流畅的界面,使代码易于阅读。因为大多数方法不允许具有 `null` 值的参数并且不返回 `null` 值,所以可以将方法调用链接在一起并且可以快速理解所得到的代码。例如: Date-Time API 提供了流畅的接口,使代码易于阅读。因为大多数方法不允许具有 `null` 值的参数并且不返回 `null` 值,所以可以将方法调用链接在一起并且可以快速理解所得到的代码。例如:
``` ```
LocalDate today = LocalDate.now(); LocalDate today = LocalDate.now();
......
...@@ -14,7 +14,7 @@ LocalDate nextWed = date.with(TemporalAdjusters.next(DayOfWeek.WEDNESDAY)); ...@@ -14,7 +14,7 @@ LocalDate nextWed = date.with(TemporalAdjusters.next(DayOfWeek.WEDNESDAY));
``` ```
有关 `TemporalAdjuster` 界面的更多信息,请参阅[时间调整器](adjusters.html) 有关 `TemporalAdjuster` 接口的更多信息,请参阅[时间调整器](adjusters.html)
除了通常的方法之外, `LocalDate` 类提供了获取有关给定日期的信息的 getter 方法。 [`getDayOfWeek` ](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#getDayOfWeek--)方法返回特定日期所在的星期几。例如,以下代码行返回“MONDAY”: 除了通常的方法之外, `LocalDate` 类提供了获取有关给定日期的信息的 getter 方法。 [`getDayOfWeek` ](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#getDayOfWeek--)方法返回特定日期所在的星期几。例如,以下代码行返回“MONDAY”:
......
...@@ -8,13 +8,13 @@ ...@@ -8,13 +8,13 @@
## 时间和时间访问者 ## 时间和时间访问者
[`Temporal` ](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/Temporal.html)接口提供了一个访问基于时间的对象的框架,并由基于时间的类实现,例如 `Instant``LocalDateTime``ZonedDateTime` 。此接口提供了添加或减去时间单位的方法,使基于时间的算术在各种日期和时间类中变得容易和一致。 [`TemporalAccessor` ](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAccessor.html)界面提供 `Temporal` 界面的只读版本。 [`Temporal` ](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/Temporal.html)接口提供了一个访问基于时间的对象的框架,并由基于时间的类实现,例如 `Instant``LocalDateTime``ZonedDateTime` 。此接口提供了添加或减去时间单位的方法,使基于时间的算术在各种日期和时间类中变得容易和一致。 [`TemporalAccessor` ](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAccessor.html)接口提供 `Temporal` 接口的只读版本。
`Temporal``TemporalAccessor` 对象都是根据字段定义的,如 [`TemporalField`](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalField.html)接口中所述。 [`ChronoField` ](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoField.html)枚举是 `TemporalField` 接口的具体实现,提供了一组丰富的定义常量,如 `DAY_OF_WEEK``] MINUTE_OF_HOUR``MONTH_OF_YEAR` `Temporal``TemporalAccessor` 对象都是根据字段定义的,如 [`TemporalField`](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalField.html)接口中所述。 [`ChronoField` ](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoField.html)枚举是 `TemporalField` 接口的具体实现,提供了一组丰富的定义常量,如 `DAY_OF_WEEK``] MINUTE_OF_HOUR``MONTH_OF_YEAR`
这些字段的单位由 [`TemporalUnit`](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalUnit.html)接口指定。 `ChronoUnit` 枚举实现了 `TemporalUnit` 接口。字段 `ChronoField.DAY_OF_WEEK``ChronoUnit.DAYS``ChronoUnit.WEEKS` 的组合。 `ChronoField``ChronoUnit` 枚举将在以下章节中讨论。 这些字段的单位由 [`TemporalUnit`](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalUnit.html)接口指定。 `ChronoUnit` 枚举实现了 `TemporalUnit` 接口。字段 `ChronoField.DAY_OF_WEEK``ChronoUnit.DAYS``ChronoUnit.WEEKS` 的组合。 `ChronoField``ChronoUnit` 枚举将在以下章节中讨论。
`Temporal` 界面中基于算法的方法需要根据 [`TemporalAmount`](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAmount.html)值定义的参数。 `周期``持续时间`类(在[周期和持续时间](period.html)中讨论)实现 `TemporalAmount` 接口。 `Temporal` 接口中基于算法的方法需要根据 [`TemporalAmount`](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAmount.html)值定义的参数。 `周期``持续时间`类(在[周期和持续时间](period.html)中讨论)实现 `TemporalAmount` 接口。
## ChronoField 和 IsoFields ## ChronoField 和 IsoFields
......
...@@ -27,7 +27,7 @@ ResourceBundle getBundle( ...@@ -27,7 +27,7 @@ ResourceBundle getBundle(
要使用 SPI,首先要实现像`ResourceBundleControlProvider`这样的 SPI 来创建服务提供者。实现 SPI 时,指定它将如何提供服务。 `ResourceBundleControlProvider` SPI 提供的服务是在应用程序调用方法`ResourceBundle.getBundle(String baseName, Locale targetLocale)`时获取适当的`ResourceBundle.Control`实例。使用 [Java 扩展机制](../../ext/index.html)将服务供应器打包为已安装的扩展。运行应用程序时,不要在类路径中命名扩展名;运行时环境查找并加载这些扩展。 要使用 SPI,首先要实现像`ResourceBundleControlProvider`这样的 SPI 来创建服务提供者。实现 SPI 时,指定它将如何提供服务。 `ResourceBundleControlProvider` SPI 提供的服务是在应用程序调用方法`ResourceBundle.getBundle(String baseName, Locale targetLocale)`时获取适当的`ResourceBundle.Control`实例。使用 [Java 扩展机制](../../ext/index.html)将服务供应器打包为已安装的扩展。运行应用程序时,不要在类路径中命名扩展名;运行时环境查找并加载这些扩展。
已安装的`ResourceBundleControlProvider` SPI 实现取代了默认的`ResourceBundle.Control`类(定义了默认的 bundle 加载过程)。因此,`ResourceBundleControlProvider`接口使您可以使用任何自定义`ResourceBundle.Control`类,而无需对应用程序的源代码进行任何其他更改。此外,此界面使您无需引用任何自定义`ResourceBundle.Control`类即可编写应用程序。 已安装的`ResourceBundleControlProvider` SPI 实现取代了默认的`ResourceBundle.Control`类(定义了默认的 bundle 加载过程)。因此,`ResourceBundleControlProvider`接口使您可以使用任何自定义`ResourceBundle.Control`类,而无需对应用程序的源代码进行任何其他更改。此外,此接口使您无需引用任何自定义`ResourceBundle.Control`类即可编写应用程序。
[``RBCPTest.java`` ](examples/rbcpsample/src/RBCPTest.java)示例显示了如何实现`ResourceBundleControlProvider`接口以及如何将其打包为已安装的扩展。此样本包装在 zip 文件 `[RBCPTest.zip](examples/rbcpsample/RBCPTest.zip)`中,由以下文件组成: [``RBCPTest.java`` ](examples/rbcpsample/src/RBCPTest.java)示例显示了如何实现`ResourceBundleControlProvider`接口以及如何将其打包为已安装的扩展。此样本包装在 zip 文件 `[RBCPTest.zip](examples/rbcpsample/RBCPTest.zip)`中,由以下文件组成:
...@@ -118,7 +118,7 @@ type = XML ...@@ -118,7 +118,7 @@ type = XML
该接口包含一种方法, [`ResourceBundle.Control getControl(String baseName)`](https://docs.oracle.com/javase/8/docs/api/java/util/spi/ResourceBundleControlProvider.html#getControl-java.lang.String-) 方法。参数`baseName`是资源包的名称。在`getBundle`的方法定义中,指定在给定资源包名称的情况下应返回的`ResourceBundle.Control`实例。 该接口包含一种方法, [`ResourceBundle.Control getControl(String baseName)`](https://docs.oracle.com/javase/8/docs/api/java/util/spi/ResourceBundleControlProvider.html#getControl-java.lang.String-) 方法。参数`baseName`是资源包的名称。在`getBundle`的方法定义中,指定在给定资源包名称的情况下应返回的`ResourceBundle.Control`实例。
`RBCPTest`样品包含`ResourceBundleControlProvider`界面的两种实现方式, [``PropertiesResourceBundleControlProvider.java``](examples/rbcpsample/src/rbcp/PropertiesResourceBundleControlProvider.java)[``XMLResourceBundleControlProvider.java``](examples/rbcpsample/src/rbcp/XMLResourceBundleControlProvider.java)。如果资源包的基本名称以`resources.RBControl`开头,则`PropertiesResourceBundleControlProvider.getBundle`方法返回`PropertiesResourceBundleControl`的实例(在此示例中,所有资源文件都包含在包`resources`中): `RBCPTest`样品包含`ResourceBundleControlProvider`接口的两种实现方式, [``PropertiesResourceBundleControlProvider.java``](examples/rbcpsample/src/rbcp/PropertiesResourceBundleControlProvider.java)[``XMLResourceBundleControlProvider.java``](examples/rbcpsample/src/rbcp/XMLResourceBundleControlProvider.java)。如果资源包的基本名称以`resources.RBControl`开头,则`PropertiesResourceBundleControlProvider.getBundle`方法返回`PropertiesResourceBundleControl`的实例(在此示例中,所有资源文件都包含在包`resources`中):
``` ```
package rbcp; package rbcp;
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
Java 2D API 提供了一组有用的标准形状,如点,线,矩形,圆弧,椭圆和曲线。定义常见几何图元的最重要的包是`java.awt.geom`包。任意形状可以由直的几何图元的组合来表示。 Java 2D API 提供了一组有用的标准形状,如点,线,矩形,圆弧,椭圆和曲线。定义常见几何图元的最重要的包是`java.awt.geom`包。任意形状可以由直的几何图元的组合来表示。
`Shape`界面表示几何形状,具有轮廓和内部。该界面提供了一组通用的方法,用于描述和检查二维几何对象,并支持曲线段和多个子形状。 [`Graphics`](https://docs.oracle.com/javase/8/docs/api/java/awt/Graphics.html) 类仅支持直线段。 [`Shape`](https://docs.oracle.com/javase/8/docs/api/java/awt/Shape.html) 界面可以支持曲线段。 `Shape`接口表示几何形状,具有轮廓和内部。该接口提供了一组通用的方法,用于描述和检查二维几何对象,并支持曲线段和多个子形状。 [`Graphics`](https://docs.oracle.com/javase/8/docs/api/java/awt/Graphics.html) 类仅支持直线段。 [`Shape`](https://docs.oracle.com/javase/8/docs/api/java/awt/Shape.html) 接口可以支持曲线段。
有关如何绘制和填充形状的更多详细信息,请参阅[使用几何](../geometry/index.html)课程。 有关如何绘制和填充形状的更多详细信息,请参阅[使用几何](../geometry/index.html)课程。
......
...@@ -180,7 +180,7 @@ printPersons( ...@@ -180,7 +180,7 @@ printPersons(
您可以使用标准函数式接口代替接口`CheckPerson`,这可以进一步减少所需的代码量。 您可以使用标准函数式接口代替接口`CheckPerson`,这可以进一步减少所需的代码量。
重新考虑`CheckPerson`界面 重新考虑`CheckPerson`接口
``` ```
interface CheckPerson { interface CheckPerson {
...@@ -188,7 +188,7 @@ interface CheckPerson { ...@@ -188,7 +188,7 @@ interface CheckPerson {
} }
``` ```
这是一个非常简单的界面。它是一个功能界面,因为它只包含一个抽象方法。此方法接受一个参数并返回`boolean`值。该方法非常简单,在您的应用程序中定义一个方法可能不值得。因此,JDK 定义了几个标准函数式接口,您可以在包`java.util.function`中找到它们。 这是一个非常简单的接口。它是一个功能接口,因为它只包含一个抽象方法。此方法接受一个参数并返回`boolean`值。该方法非常简单,在您的应用程序中定义一个方法可能不值得。因此,JDK 定义了几个标准函数式接口,您可以在包`java.util.function`中找到它们。
例如,您可以使用`Predicate&lt;T&gt;`接口代替`CheckPerson`。该接口包含方法`boolean test(T t)` 例如,您可以使用`Predicate&lt;T&gt;`接口代替`CheckPerson`。该接口包含方法`boolean test(T t)`
......
...@@ -12,7 +12,7 @@ Java 2D 打印 API 不限于打印图形。它还允许您打印应用程序用 ...@@ -12,7 +12,7 @@ Java 2D 打印 API 不限于打印图形。它还允许您打印应用程序用
基本打印操作在以下部分中表示: 基本打印操作在以下部分中表示:
* [基本打印程序](../printing/printable.html) - 本节介绍`Printable`界面并显示基本打印程序。 * [基本打印程序](../printing/printable.html) - 本节介绍`Printable`接口并显示基本打印程序。
* [使用打印设置对话框](../printing/dialog.html) - 本节介绍如何显示打印设置对话框。 * [使用打印设置对话框](../printing/dialog.html) - 本节介绍如何显示打印设置对话框。
* [打印多页文档](../printing/set.html) - 本节介绍如何使用分页打印多页文档。 * [打印多页文档](../printing/set.html) - 本节介绍如何使用分页打印多页文档。
* [使用打印服务和属性](../printing/services.html) ndash;本节将向您介绍打印服务,如何指定打印数据格式以及如何使用`javax.print`包创建打印作业。 * [使用打印服务和属性](../printing/services.html) ndash;本节将向您介绍打印服务,如何指定打印数据格式以及如何使用`javax.print`包创建打印作业。
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/2d/printing/set.html](https://docs.oracle.com/javase/tutorial/2d/printing/set.html) > 原文: [https://docs.oracle.com/javase/tutorial/2d/printing/set.html](https://docs.oracle.com/javase/tutorial/2d/printing/set.html)
您已经学习了如何使用 [`Printable`](https://docs.oracle.com/javase/8/docs/api/java/awt/print/Printable.html) 界面打印单页文档。但是,文档的长度通常不止一个。 _ 分页 _ 是识别文档中相应分页和打印的位置的过程。 您已经学习了如何使用 [`Printable`](https://docs.oracle.com/javase/8/docs/api/java/awt/print/Printable.html) 接口打印单页文档。但是,文档的长度通常不止一个。 _ 分页 _ 是识别文档中相应分页和打印的位置的过程。
如果打印多个图形图像,每页一个,使用页面索引来遍历这些页面并在每个页面上打印一个。例如,如果以下数组中表示了多个图像: 如果打印多个图形图像,每页一个,使用页面索引来遍历这些页面并在每个页面上打印一个。例如,如果以下数组中表示了多个图像:
......
...@@ -39,7 +39,7 @@ StreamPrintServiceFactory[] psfactories = ...@@ -39,7 +39,7 @@ StreamPrintServiceFactory[] psfactories =
[`javax.print.attribute`](https://docs.oracle.com/javase/8/docs/api/javax/print/attribute/package-frame.html)[`javax.print.attribute.standard`](https://docs.oracle.com/javase/8/docs/api/javax/print/attribute/standard/package-frame.html) 包定义打印属性,这些属性描述打印服务的功能,指定打印作业的要求以及跟踪打印作业的进度。 [`javax.print.attribute`](https://docs.oracle.com/javase/8/docs/api/javax/print/attribute/package-frame.html)[`javax.print.attribute.standard`](https://docs.oracle.com/javase/8/docs/api/javax/print/attribute/standard/package-frame.html) 包定义打印属性,这些属性描述打印服务的功能,指定打印作业的要求以及跟踪打印作业的进度。
例如,如果您想使用 A4 纸张格式并打印文档的三个副本,则必须创建一组实现`PrintRequestAttributeSet`界面的以下属性: 例如,如果您想使用 A4 纸张格式并打印文档的三个副本,则必须创建一组实现`PrintRequestAttributeSet`接口的以下属性:
``` ```
PrintRequestAttributeSet attr_set = PrintRequestAttributeSet attr_set =
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* Use a `Clip` when you have non-real-time sound data that can be preloaded into memory. * Use a `Clip` when you have non-real-time sound data that can be preloaded into memory.
例如,您可能会将一个简短的声音文件读入剪辑。如果您希望声音不止一次播放,`Clip`比`SourceDataLine`更方便,特别是如果您希望播放循环(重复循环播放全部或部分声音)。如果您需要在声音中的任意位置开始播放,`Clip`界面提供了一种方法来轻松完成。最后,从`Clip`播放通常比`SourceDataLine`的缓冲播放具有更少的延迟。换句话说,因为声音被预加载到剪辑中,所以可以立即开始播放,而不必等待缓冲区被填充。 例如,您可能会将一个简短的声音文件读入剪辑。如果您希望声音不止一次播放,`Clip`比`SourceDataLine`更方便,特别是如果您希望播放循环(重复循环播放全部或部分声音)。如果您需要在声音中的任意位置开始播放,`Clip`接口提供了一种方法来轻松完成。最后,从`Clip`播放通常比`SourceDataLine`的缓冲播放具有更少的延迟。换句话说,因为声音被预加载到剪辑中,所以可以立即开始播放,而不必等待缓冲区被填充。
* Use a `SourceDataLine` for streaming data, such as a long sound file that won't all fit in memory at once, or a sound whose data can't be known in advance of playback. * Use a `SourceDataLine` for streaming data, such as a long sound file that won't all fit in memory at once, or a sound whose data can't be known in advance of playback.
......
...@@ -71,7 +71,7 @@ Java Sound API 以三部分层次结构组织 MIDI 数据: ...@@ -71,7 +71,7 @@ Java Sound API 以三部分层次结构组织 MIDI 数据:
上一节介绍了如何在 Java Sound API 中表示 MIDI 消息。但是,MIDI 消息不存在于真空中。它们通常从一个设备发送到另一个设备。使用 Java Sound API 的程序可以从头开始生成 MIDI 消息,但更常见的是消息由软件设备(如音序器)创建,或者通过 MIDI 输入端口从计算机外部接收。这种设备通常将这些消息发送到另一个设备,例如合成器或 MIDI 输出端口。 上一节介绍了如何在 Java Sound API 中表示 MIDI 消息。但是,MIDI 消息不存在于真空中。它们通常从一个设备发送到另一个设备。使用 Java Sound API 的程序可以从头开始生成 MIDI 消息,但更常见的是消息由软件设备(如音序器)创建,或者通过 MIDI 输入端口从计算机外部接收。这种设备通常将这些消息发送到另一个设备,例如合成器或 MIDI 输出端口。
### MidiDevice 界面 ### MidiDevice 接口
在外部 MIDI 硬件设备的世界中,许多设备可以将 MIDI 信息传输到其他设备,也可以从其他设备接收信息。类似地,在 Java Sound API 中,实现 [`MidiDevice`](https://docs.oracle.com/javase/8/docs/api/javax/sound/midi/MidiDevice.html) 接口的软件对象可以发送和接收消息。这样的对象可以纯粹用软件实现,或者它可以用作硬件的接口,例如声卡的 MIDI 功能。基本`MidiDevice`接口提供 MIDI 输入或输出端口通常所需的所有功能。然而,合成器和测序仪分别进一步实现`MidiDevice`[`Synthesizer`](https://docs.oracle.com/javase/8/docs/api/javax/sound/midi/Synthesizer.html)[`Sequencer`](https://docs.oracle.com/javase/8/docs/api/javax/sound/midi/Sequencer.html) 的子接口之一。 在外部 MIDI 硬件设备的世界中,许多设备可以将 MIDI 信息传输到其他设备,也可以从其他设备接收信息。类似地,在 Java Sound API 中,实现 [`MidiDevice`](https://docs.oracle.com/javase/8/docs/api/javax/sound/midi/MidiDevice.html) 接口的软件对象可以发送和接收消息。这样的对象可以纯粹用软件实现,或者它可以用作硬件的接口,例如声卡的 MIDI 功能。基本`MidiDevice`接口提供 MIDI 输入或输出端口通常所需的所有功能。然而,合成器和测序仪分别进一步实现`MidiDevice`[`Synthesizer`](https://docs.oracle.com/javase/8/docs/api/javax/sound/midi/Synthesizer.html)[`Sequencer`](https://docs.oracle.com/javase/8/docs/api/javax/sound/midi/Sequencer.html) 的子接口之一。
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
## 获取序列发生器 ## 获取序列发生器
应用程序不实例化`Sequencer`;毕竟,`Sequencer`只是一个界面。相反,与 Java Sound API 的 MIDI 包中的所有设备一样,通过静态`MidiSystem`对象访问`Sequencer`。如前面[访问 MIDI 系统资源](accessing-MIDI.html)中所述,以下`MidiSystem`方法可用于获取默认`Sequencer` 应用程序不实例化`Sequencer`;毕竟,`Sequencer`只是一个接口。相反,与 Java Sound API 的 MIDI 包中的所有设备一样,通过静态`MidiSystem`对象访问`Sequencer`。如前面[访问 MIDI 系统资源](accessing-MIDI.html)中所述,以下`MidiSystem`方法可用于获取默认`Sequencer`
``` ```
static Sequencer getSequencer() static Sequencer getSequencer()
......
...@@ -166,9 +166,9 @@ boolean isTargetEncodingSupported( ...@@ -166,9 +166,9 @@ boolean isTargetEncodingSupported(
## 提供新型混合器 ## 提供新型混合器
顾名思义,`MixerProvider`提供混音器实例。每个具体的`MixerProvider`子类充当应用程序使用的`Mixer`对象的工厂。当然,如果还定义了`Mixer`接口的一个或多个新实现,则定义新的`MixerProvider`才有意义。与上面的`FormatConversionProvider`示例一样,我们的`getAudioInputStream`方法返回执行转换的`AudioInputStream`的子类,我们的新类`AcmeMixerProvider`有一个方法`getMixer`,它返回另一个实现该类的新类的实例。 `Mixer`界面。我们称之为后一类`AcmeMixer`。特别是如果混合器以硬件实现,则提供者可能仅支持所请求设备的一个静态实例。如果是这样,它应该返回此静态实例以响应`getMixer`的每次调用。 顾名思义,`MixerProvider`提供混音器实例。每个具体的`MixerProvider`子类充当应用程序使用的`Mixer`对象的工厂。当然,如果还定义了`Mixer`接口的一个或多个新实现,则定义新的`MixerProvider`才有意义。与上面的`FormatConversionProvider`示例一样,我们的`getAudioInputStream`方法返回执行转换的`AudioInputStream`的子类,我们的新类`AcmeMixerProvider`有一个方法`getMixer`,它返回另一个实现该类的新类的实例。 `Mixer`接口。我们称之为后一类`AcmeMixer`。特别是如果混合器以硬件实现,则提供者可能仅支持所请求设备的一个静态实例。如果是这样,它应该返回此静态实例以响应`getMixer`的每次调用。
由于`AcmeMixer`支持`Mixer`接口,因此应用程序不需要任何其他信息即可访问其基本功能。但是,如果`AcmeMixer`支持`Mixer`界面中未定义的功能,并且供应商希望使应用程序可以访问此扩展功能,那么混音器当然应该被定义为公共类,其中包含额外的,记录良好的公共方法,以便希望使用此扩展功能的程序可以导入`AcmeMixer`并将`getMixer`返回的对象转换为此类型。 由于`AcmeMixer`支持`Mixer`接口,因此应用程序不需要任何其他信息即可访问其基本功能。但是,如果`AcmeMixer`支持`Mixer`接口中未定义的功能,并且供应商希望使应用程序可以访问此扩展功能,那么混音器当然应该被定义为公共类,其中包含额外的,记录良好的公共方法,以便希望使用此扩展功能的程序可以导入`AcmeMixer`并将`getMixer`返回的对象转换为此类型。
`MixerProvider`的另外两种方法是: `MixerProvider`的另外两种方法是:
......
...@@ -28,7 +28,7 @@ Java Object Serialization API 自动将 Serializable 对象的大多数字段序 ...@@ -28,7 +28,7 @@ Java Object Serialization API 自动将 Serializable 对象的大多数字段序
## 默认序列化:可序列化接口 ## 默认序列化:可序列化接口
`Serializable`接口通过使用 Java 对象序列化工具提供自动序列化。 `Serializable`宣布没有方法;它充当标记,告诉对象序列化工具您的 bean 类是可序列化的。标记您的类`Serializable`意味着您告诉 Java 虚拟机(JVM)您已确保您的类将使用默认序列化。以下是使用`Serializable`界面的一些重要观点: `Serializable`接口通过使用 Java 对象序列化工具提供自动序列化。 `Serializable`宣布没有方法;它充当标记,告诉对象序列化工具您的 bean 类是可序列化的。标记您的类`Serializable`意味着您告诉 Java 虚拟机(JVM)您已确保您的类将使用默认序列化。以下是使用`Serializable`接口的一些重要观点:
* 实现`Serializable`的类必须能够访问超类型的 _ 无参数构造器 _。当从`.ser`文件“重构”对象时,将调用此构造器。 * 实现`Serializable`的类必须能够访问超类型的 _ 无参数构造器 _。当从`.ser`文件“重构”对象时,将调用此构造器。
* 如果已经在超类中实现了,则不需要在类中实现`Serializable` * 如果已经在超类中实现了,则不需要在类中实现`Serializable`
......
...@@ -284,6 +284,6 @@ public class UpdateCar { ...@@ -284,6 +284,6 @@ public class UpdateCar {
### 元数据 ### 元数据
数据库存储用户数据,它们还存储有关数据库本身的信息。大多数 DBMS 都有一组系统表,它们列出数据库中的表,每个表中的列名,主键,外键,存储过程等。每个 DBMS 都有自己的函数来获取有关表格布局和数据库功能的信息。 JDBC 提供了接口`DatabaseMetaData`,驱动程序编写者必须实现该接口,以便其方法返回有关为其编写驱动程序的驱动程序和/或 DBMS 的信息。例如,大量方法返回驱动程序是否支持特定功能。此界面为用户和工具提供了获取元数据的标准方法。 数据库存储用户数据,它们还存储有关数据库本身的信息。大多数 DBMS 都有一组系统表,它们列出数据库中的表,每个表中的列名,主键,外键,存储过程等。每个 DBMS 都有自己的函数来获取有关表格布局和数据库功能的信息。 JDBC 提供了接口`DatabaseMetaData`,驱动程序编写者必须实现该接口,以便其方法返回有关为其编写驱动程序的驱动程序和/或 DBMS 的信息。例如,大量方法返回驱动程序是否支持特定功能。此接口为用户和工具提供了获取元数据的标准方法。
通常,编写工具和驱动程序的开发人员最有可能关注元数据。 通常,编写工具和驱动程序的开发人员最有可能关注元数据。
\ No newline at end of file
...@@ -160,4 +160,4 @@ SQL 命令分为几类,两个主要是数据操作语言(DML)命令和数 ...@@ -160,4 +160,4 @@ SQL 命令分为几类,两个主要是数据操作语言(DML)命令和数
存储过程是一组可以按名称调用的 SQL 语句。换句话说,它是可执行代码,一个迷你程序,执行一个特定的任务,可以调用一个可以调用函数或方法的方式。传统上,存储过程是用 DBMS 特定的编程语言编写的。最新一代的数据库产品允许使用 Java 编程语言和 JDBC API 编写存储过程。用 Java 编程语言编写的存储过程在 DBMS 之间是可移植的字节码。一旦编写了存储过程,就可以使用它并重用它,因为支持存储过程的 DBMS 将顾名思义将其存储在数据库中。有关编写存储过程的信息,请参见[使用存储过程](../basics/storedprocedures.html) 存储过程是一组可以按名称调用的 SQL 语句。换句话说,它是可执行代码,一个迷你程序,执行一个特定的任务,可以调用一个可以调用函数或方法的方式。传统上,存储过程是用 DBMS 特定的编程语言编写的。最新一代的数据库产品允许使用 Java 编程语言和 JDBC API 编写存储过程。用 Java 编程语言编写的存储过程在 DBMS 之间是可移植的字节码。一旦编写了存储过程,就可以使用它并重用它,因为支持存储过程的 DBMS 将顾名思义将其存储在数据库中。有关编写存储过程的信息,请参见[使用存储过程](../basics/storedprocedures.html)
数据库存储用户数据,它们还存储有关数据库本身的信息。大多数 DBMS 都有一组系统表,它们列出数据库中的表,每个表中的列名,主键,外键,存储过程等。每个 DBMS 都有自己的函数来获取有关表格布局和数据库功能的信息。 JDBC 提供了接口`DatabaseMetaData`,驱动程序编写者必须实现该接口,以便其方法返回有关为其编写驱动程序的驱动程序和/或 DBMS 的信息。例如,大量方法返回驱动程序是否支持特定功能。此界面为用户和工具提供了获取元数据的标准方法。通常,编写工具和驱动程序的开发人员最有可能关注元数据。 数据库存储用户数据,它们还存储有关数据库本身的信息。大多数 DBMS 都有一组系统表,它们列出数据库中的表,每个表中的列名,主键,外键,存储过程等。每个 DBMS 都有自己的函数来获取有关表格布局和数据库功能的信息。 JDBC 提供了接口`DatabaseMetaData`,驱动程序编写者必须实现该接口,以便其方法返回有关为其编写驱动程序的驱动程序和/或 DBMS 的信息。例如,大量方法返回驱动程序是否支持特定功能。此接口为用户和工具提供了获取元数据的标准方法。通常,编写工具和驱动程序的开发人员最有可能关注元数据。
\ No newline at end of file \ No newline at end of file
...@@ -71,8 +71,8 @@ public static void viewTable(Connection con, String dbName) ...@@ -71,8 +71,8 @@ public static void viewTable(Connection con, String dbName)
有两个并发级别: 有两个并发级别:
* `CONCUR_READ_ONLY`:无法使用`ResultSet`界面更新`ResultSet`对象。 * `CONCUR_READ_ONLY`:无法使用`ResultSet`接口更新`ResultSet`对象。
* `CONCUR_UPDATABLE`:可以使用`ResultSet`界面更新`ResultSet`对象。 * `CONCUR_UPDATABLE`:可以使用`ResultSet`接口更新`ResultSet`对象。
默认`ResultSet`并发是`CONCUR_READ_ONLY` 默认`ResultSet`并发是`CONCUR_READ_ONLY`
......
...@@ -189,7 +189,7 @@ jdbcRs.execute(); ...@@ -189,7 +189,7 @@ jdbcRs.execute();
* [插入行](#inserting-row) * [插入行](#inserting-row)
* [删除行](#deleting-row) * [删除行](#deleting-row)
不可滚动的`ResultSet`对象只能使用`next`方法向前移动光标,并且只能将光标从第一行向前移动到最后一行。但是,默认的`JdbcRowSet`对象可以使用`ResultSet`界面中定义的所有光标移动方法。 不可滚动的`ResultSet`对象只能使用`next`方法向前移动光标,并且只能将光标从第一行向前移动到最后一行。但是,默认的`JdbcRowSet`对象可以使用`ResultSet`接口中定义的所有光标移动方法。
`JdbcRowSet`对象可以调用方法`next`,它也可以调用任何其他`ResultSet`光标移动方法。例如,以下代码行将光标移动到`jdbcRs`对象中的第四行,然后返回到第三行: `JdbcRowSet`对象可以调用方法`next`,它也可以调用任何其他`ResultSet`光标移动方法。例如,以下代码行将光标移动到`jdbcRs`对象中的第四行,然后返回到第三行:
......
...@@ -41,7 +41,7 @@ CachedRowSet crs = new CachedRowSetImpl(); ...@@ -41,7 +41,7 @@ CachedRowSet crs = new CachedRowSetImpl();
对象`crs`具有与`JdbcRowSet`对象首次创建时的属性相同的默认值。此外,它已被分配了默认`SyncProvider`实现的实例,`RIOptimisticProvider` 对象`crs`具有与`JdbcRowSet`对象首次创建时的属性相同的默认值。此外,它已被分配了默认`SyncProvider`实现的实例,`RIOptimisticProvider`
`SyncProvider`对象提供`RowSetReader`对象(_ 读取器 _)和`RowSetWriter`对象(_ 写入器 _),断开的`RowSet`对象需要这些对象才能读取来自其数据源的数据或将数据写回其数据源。读者和作者的作用将在后面的[部分](#reader)[什么作者](#writer)中解释。要记住的一件事是读者和作者完全在后台工作,所以解释他们的工作方式仅仅是为了您的信息。在读者和作者身上有一些背景知识可以帮助你理解`CachedRowSet`界面中定义的一些方法在后台做什么。 `SyncProvider`对象提供`RowSetReader`对象(_ 读取器 _)和`RowSetWriter`对象(_ 写入器 _),断开的`RowSet`对象需要这些对象才能读取来自其数据源的数据或将数据写回其数据源。读者和作者的作用将在后面的[部分](#reader)[什么作者](#writer)中解释。要记住的一件事是读者和作者完全在后台工作,所以解释他们的工作方式仅仅是为了您的信息。在读者和作者身上有一些背景知识可以帮助你理解`CachedRowSet`接口中定义的一些方法在后台做什么。
通常,属性的默认值可以正常,但您可以通过调用适当的 setter 方法来更改属性的值。有些属性没有默认值,您必须自己设置。 通常,属性的默认值可以正常,但您可以通过调用适当的 setter 方法来更改属性的值。有些属性没有默认值,您必须自己设置。
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
本课介绍了 JMX API 的基本概念,即托管 bean 或 _MBeans_ 。 本课介绍了 JMX API 的基本概念,即托管 bean 或 _MBeans_ 。
MBean 是一个托管 Java 对象,类似于 JavaBeans 组件,它遵循 JMX 规范中提出的设计模式。 MBean 可以表示设备,应用程序或需要管理的任何资源。 MBean 公开了一个由以下内容组成的管理界面 MBean 是一个托管 Java 对象,类似于 JavaBeans 组件,它遵循 JMX 规范中提出的设计模式。 MBean 可以表示设备,应用程序或需要管理的任何资源。 MBean 公开了一个由以下内容组成的管理接口
* 一组可读或可写属性,或两者兼而有之。 * 一组可读或可写属性,或两者兼而有之。
* 一组可调用的操作。 * 一组可调用的操作。
......
...@@ -14,7 +14,7 @@ MXBeans 背后的主要思想是在 MXBean 接口中引用的 [`java.lang.manage ...@@ -14,7 +14,7 @@ MXBeans 背后的主要思想是在 MXBean 接口中引用的 [`java.lang.manage
MXBean 示例包含以下文件,可在 [`jmx_examples.zip`](../examples/jmx_examples.zip) 中找到: MXBean 示例包含以下文件,可在 [`jmx_examples.zip`](../examples/jmx_examples.zip) 中找到:
* `QueueSamplerMXBean`界面 * `QueueSamplerMXBean`接口
* 实现 MXBean 接口的`QueueSampler` * 实现 MXBean 接口的`QueueSampler`
* `QueueSample` MXBean 接口中`getQueueSample()`方法返回的 Java 类型 * `QueueSample` MXBean 接口中`getQueueSample()`方法返回的 Java 类型
* `Main`,设置并运行示例的程序 * `Main`,设置并运行示例的程序
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
您使用 `javax.xml.parsers.DocumentBuilderFactory` 类来获取 `DocumentBuilder` 实例,并使用该实例生成符合 DOM 的 `Document` 对象规格。实际上,您获得的构建器由系统属性 `javax.xml.parsers.DocumentBuilderFactory` 确定,该属性选择用于生成构建器的工厂实现。 (可以从命令行覆盖平台的默认值。) 您使用 `javax.xml.parsers.DocumentBuilderFactory` 类来获取 `DocumentBuilder` 实例,并使用该实例生成符合 DOM 的 `Document` 对象规格。实际上,您获得的构建器由系统属性 `javax.xml.parsers.DocumentBuilderFactory` 确定,该属性选择用于生成构建器的工厂实现。 (可以从命令行覆盖平台的默认值。)
您还可以使用 `DocumentBuilder` `newDocument()`方法创建一个空`文档`,实现 `org.w3c.dom.Document` 界面。或者,您可以使用构建器的解析方法之一从现有 XML 数据创建 `Document` 。结果是一个 DOM 树,如上面的[](#gceza)所示。 您还可以使用 `DocumentBuilder` `newDocument()`方法创建一个空`文档`,实现 `org.w3c.dom.Document` 接口。或者,您可以使用构建器的解析方法之一从现有 XML 数据创建 `Document` 。结果是一个 DOM 树,如上面的[](#gceza)所示。
* * * * * *
......
...@@ -609,7 +609,7 @@ private void echo(Node n) { ...@@ -609,7 +609,7 @@ private void echo(Node n) {
### 创建节点 ### 创建节点
您可以使用 `Document` 界面的方法创建不同类型的节点。例如, `createElement``createComment``createCDATAsection``createTextNode` 等等。 [`org.w3c.dom.Document`](https://docs.oracle.com/javase/8/docs/api/org/w3c/dom/Document.html) 的 API 文档中提供了创建不同节点的完整方法列表。 您可以使用 `Document` 接口的方法创建不同类型的节点。例如, `createElement``createComment``createCDATAsection``createTextNode` 等等。 [`org.w3c.dom.Document`](https://docs.oracle.com/javase/8/docs/api/org/w3c/dom/Document.html) 的 API 文档中提供了创建不同节点的完整方法列表。
### 遍历节点 ### 遍历节点
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
## 问题 ## 问题
1. 以下界面有什么问题? 1. 以下接口有什么问题?
``` ```
public interface House { public interface House {
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
``` ```
如果编译此程序,编译器会生成警告,因为`open`已弃用(在界面中)。你能做些什么来摆脱那个警告? 如果编译此程序,编译器会生成警告,因为`open`已弃用(在接口中)。你能做些什么来摆脱那个警告?
3. 以下代码是否会编译而不会出错?为什么或者为什么不? 3. 以下代码是否会编译而不会出错?为什么或者为什么不?
......
...@@ -62,7 +62,7 @@ StAX 规范处理资源解析,属性和命名空间以及错误和异常,如 ...@@ -62,7 +62,7 @@ StAX 规范处理资源解析,属性和命名空间以及错误和异常,如
### 属性和命名空间 ### 属性和命名空间
属性由 StAX 处理器使用游标界面中的查找方法和字符串以及迭代器接口中的`属性``命名空间`事件进行报告。请注意,命名空间被视为属性,尽管命名空间与游标和迭代器 API 中的属性分开报告。另请注意,对于 StAX 处理器,名称空间处理是可选的。有关命名空间绑定和可选命名空间处理的完整信息,请参阅 StAX 规范。 属性由 StAX 处理器使用游标接口中的查找方法和字符串以及迭代器接口中的`属性``命名空间`事件进行报告。请注意,命名空间被视为属性,尽管命名空间与游标和迭代器 API 中的属性分开报告。另请注意,对于 StAX 处理器,名称空间处理是可选的。有关命名空间绑定和可选命名空间处理的完整信息,请参阅 StAX 规范。
### 错误报告和异常处理 ### 错误报告和异常处理
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
例如,想象一个未来主义社会,计算机控制的机器人汽车在没有人工运算符的情况下将乘客运送到城市街道。汽车制造商编写操作汽车的软件(当然是 Java) - 停止,启动,加速,左转等等。另一个工业集团,电子制导仪器制造商,使计算机系统接收 GPS(全球定位系统)位置数据和无线传输交通状况并利用该信息来驾驶汽车。 例如,想象一个未来主义社会,计算机控制的机器人汽车在没有人工运算符的情况下将乘客运送到城市街道。汽车制造商编写操作汽车的软件(当然是 Java) - 停止,启动,加速,左转等等。另一个工业集团,电子制导仪器制造商,使计算机系统接收 GPS(全球定位系统)位置数据和无线传输交通状况并利用该信息来驾驶汽车。
汽车制造商必须发布一个行业标准的界面,详细说明可以调用什么方法来使汽车移动(任何汽车,来自任何制造商)。然后,指导制造商可以编写调用界面中描述的方法的软件来命令汽车。工业集团都不需要知道如何实现其他集团的软件。事实上,每个小组都认为其软件具有高度专有性,并保留随时修改它的权利,只要它继续遵守已发布的界面即可。 汽车制造商必须发布一个行业标准的接口,详细说明可以调用什么方法来使汽车移动(任何汽车,来自任何制造商)。然后,指导制造商可以编写调用接口中描述的方法的软件来命令汽车。工业集团都不需要知道如何实现其他集团的软件。事实上,每个小组都认为其软件具有高度专有性,并保留随时修改它的权利,只要它继续遵守已发布的接口即可。
## Java 中的接口 ## Java 中的接口
...@@ -63,8 +63,8 @@ public class OperateBMW760i implements OperateCar { ...@@ -63,8 +63,8 @@ public class OperateBMW760i implements OperateCar {
``` ```
在上面的机器人汽车示例中,汽车制造商将实现该界面。当然,雪佛兰的实现将与丰田的实现大不相同,但两家制造商都将遵循相同的界面。作为界面客户的指导制造商将构建使用汽车位置上的 GPS 数据,数字街道地图和交通数据来驱动汽车的系统。这样,引导系统将调用界面方法:转弯,改变车道,制动,加速等。 在上面的机器人汽车示例中,汽车制造商将实现该接口。当然,雪佛兰的实现将与丰田的实现大不相同,但两家制造商都将遵循相同的接口。作为接口客户的指导制造商将构建使用汽车位置上的 GPS 数据,数字街道地图和交通数据来驱动汽车的系统。这样,引导系统将调用接口方法:转弯,改变车道,制动,加速等。
## 接口作为 API ## 接口作为 API
机器人汽车示例显示了用作行业标准的接口 _ 应用程序编程接口(API)_。 API 在商业软件产品中也很常见。通常,公司销售的软件包包含另一家公司希望在其自己的软件产品中使用的复杂方法。一个例子是销售给制作最终用户图形程序的公司的数字图像处理方法包。图像处理公司编写其类以实现接口,并将其公开给客户。然后,图形公司使用界面中定义的签名和返回类型调用图像处理方法。虽然图像处理公司的 API 是公开的(对其客户),但它的 API 实现仍然是一个严密保密的秘密 - 实际上,它可以在以后修改实现,只要它继续实现原始接口它的客户所依赖的。 机器人汽车示例显示了用作行业标准的接口 _ 应用程序编程接口(API)_。 API 在商业软件产品中也很常见。通常,公司销售的软件包包含另一家公司希望在其自己的软件产品中使用的复杂方法。一个例子是销售给制作最终用户图形程序的公司的数字图像处理方法包。图像处理公司编写其类以实现接口,并将其公开给客户。然后,图形公司使用接口中定义的签名和返回类型调用图像处理方法。虽然图像处理公司的 API 是公开的(对其客户),但它的 API 实现仍然是一个严密保密的秘密 - 实际上,它可以在以后修改实现,只要它继续实现原始接口它的客户所依赖的。
\ No newline at end of file \ No newline at end of file
...@@ -23,8 +23,8 @@ public interface GroupedInterface extends Interface1, Interface2, Interface3 { ...@@ -23,8 +23,8 @@ public interface GroupedInterface extends Interface1, Interface2, Interface3 {
接口可以扩展其他接口,就像类子类或扩展另一个类一样。但是,虽然类只能扩展另一个类,但接口可以扩展任意数量的接口。接口声明包括它扩展的所有接口的逗号分隔列表。 接口可以扩展其他接口,就像类子类或扩展另一个类一样。但是,虽然类只能扩展另一个类,但接口可以扩展任意数量的接口。接口声明包括它扩展的所有接口的逗号分隔列表。
## 界面 ## 接口主
界面体可以包含[抽象方法](../../java/IandI/abstract.html)[默认方法](../../java/IandI/defaultmethods.html)[静态方法](../../java/IandI/defaultmethods.html#static)。接口中的抽象方法后跟分号,但没有大括号(抽象方法不包含实现)。默认方法使用`default`修饰符定义,静态方法使用`static`关键字定义。接口中的所有抽象,默认和静态方法都是隐式`public`,因此您可以省略`public`修饰符。 接口主体可以包含[抽象方法](../../java/IandI/abstract.html)[默认方法](../../java/IandI/defaultmethods.html)[静态方法](../../java/IandI/defaultmethods.html#static)。接口中的抽象方法后跟分号,但没有大括号(抽象方法不包含实现)。默认方法使用`default`修饰符定义,静态方法使用`static`关键字定义。接口中的所有抽象,默认和静态方法都是隐式`public`,因此您可以省略`public`修饰符。
此外,接口可以包含常量声明。接口中定义的所有常量值都隐含`public``static``final`。再一次,您可以省略这些修饰符。 此外,接口可以包含常量声明。接口中定义的所有常量值都隐含`public``static``final`。再一次,您可以省略这些修饰符。
\ No newline at end of file
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性。 默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性。
考虑以下界面[`TimeClient`](examples/TimeClient.java) ,如[问题与练习答案:接口](../../java/IandI/QandE/interfaces-answers.html)中所述: 考虑以下接口[`TimeClient`](examples/TimeClient.java) ,如[问题与练习答案:接口](../../java/IandI/QandE/interfaces-answers.html)中所述:
``` ```
import java.time.*; import java.time.*;
...@@ -73,7 +73,7 @@ public class SimpleTimeClient implements TimeClient { ...@@ -73,7 +73,7 @@ public class SimpleTimeClient implements TimeClient {
``` ```
假设您要为`TimeClient`界面添加新功能,例如通过 [`ZonedDateTime`](https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html) 对象(类似于 [`LocalDateTime`](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html) 指定时区的功能)对象,除了它存储时区信息): 假设您要为`TimeClient`接口添加新功能,例如通过 [`ZonedDateTime`](https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html) 对象(类似于 [`LocalDateTime`](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html) 指定时区的功能)对象,除了它存储时区信息):
``` ```
public interface TimeClient { public interface TimeClient {
...@@ -264,7 +264,7 @@ public interface Card extends Comparable<Card> { ...@@ -264,7 +264,7 @@ public interface Card extends Comparable<Card> {
``` ```
`Deck`界面包含操作卡片中卡片的各种方法: `Deck`接口包含操作卡片中卡片的各种方法:
``` ```
package defaultmethods; package defaultmethods;
...@@ -368,7 +368,7 @@ myDeck.sort(new SortByRankThenSuit()); ...@@ -368,7 +368,7 @@ myDeck.sort(new SortByRankThenSuit());
``` ```
但是,这种方法过于冗长;如果你能指定 _ 你想要排序的 _,而不是 _ 你想要排序的 _ 会更好。假设您是编写`Comparator`接口的开发人员。您可以向`Comparator`界面添加哪些默认或静态方法,以使其他开发人员能够更轻松地指定排序条件? 但是,这种方法过于冗长;如果你能指定 _ 你想要排序的 _,而不是 _ 你想要排序的 _ 会更好。假设您是编写`Comparator`接口的开发人员。您可以向`Comparator`接口添加哪些默认或静态方法,以使其他开发人员能够更轻松地指定排序条件?
首先,假设您想按等级对扑克牌进行排序,而不管是否适合。您可以按如下方式调用`StandardDeck.sort`方法: 首先,假设您想按等级对扑克牌进行排序,而不管是否适合。您可以按如下方式调用`StandardDeck.sort`方法:
...@@ -384,7 +384,7 @@ myDeck.sort( ...@@ -384,7 +384,7 @@ myDeck.sort(
因为接口`Comparator`[函数式接口](../../java/javaOO/lambdaexpressions.html#approach6),所以可以使用 lambda 表达式作为`sort`方法的参数。在此示例中,lambda 表达式比较两个整数值。 因为接口`Comparator`[函数式接口](../../java/javaOO/lambdaexpressions.html#approach6),所以可以使用 lambda 表达式作为`sort`方法的参数。在此示例中,lambda 表达式比较两个整数值。
如果他们可以通过仅调用方法`Card.getRank`来创建`Comparator`实例,那么对于您的开发人员来说会更简单。特别是,如果您的开发人员可以创建一个`Comparator`实例来比较任何可以从`getValue``hashCode`等方法返回数值的对象,那将会很有帮助。 `Comparator`界面已通过静态方法 [`comparing`](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparing-java.util.function.Function-java.util.Comparator-) 增强了此功能: 如果他们可以通过仅调用方法`Card.getRank`来创建`Comparator`实例,那么对于您的开发人员来说会更简单。特别是,如果您的开发人员可以创建一个`Comparator`实例来比较任何可以从`getValue``hashCode`等方法返回数值的对象,那将会很有帮助。 `Comparator`接口已通过静态方法 [`comparing`](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparing-java.util.function.Function-java.util.Comparator-) 增强了此功能:
``` ```
myDeck.sort(Comparator.comparing((card) -> card.getRank())); myDeck.sort(Comparator.comparing((card) -> card.getRank()));
...@@ -420,7 +420,7 @@ myDeck.sort( ...@@ -420,7 +420,7 @@ myDeck.sort(
``` ```
如果他们可以从一系列`Comparator`实例构建`Comparator`实例,那么对于您的开发人员来说会更简单。 `Comparator`界面已通过默认方法 [`thenComparing`](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#thenComparing-java.util.Comparator-) 增强了此功能: 如果他们可以从一系列`Comparator`实例构建`Comparator`实例,那么对于您的开发人员来说会更简单。 `Comparator`接口已通过默认方法 [`thenComparing`](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#thenComparing-java.util.Comparator-) 增强了此功能:
``` ```
myDeck.sort( myDeck.sort(
...@@ -432,7 +432,7 @@ myDeck.sort( ...@@ -432,7 +432,7 @@ myDeck.sort(
`Comparator`接口已通过其他版本的默认方法`thenComparing`(例如 [`thenComparingDouble`](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#thenComparingDouble-java.util.function.ToDoubleFunction-)[`thenComparingLong`](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#thenComparingLong-java.util.function.ToLongFunction-) )进行了增强,可以构建`Comparator`实例比较其他数据类型。 `Comparator`接口已通过其他版本的默认方法`thenComparing`(例如 [`thenComparingDouble`](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#thenComparingDouble-java.util.function.ToDoubleFunction-)[`thenComparingLong`](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#thenComparingLong-java.util.function.ToLongFunction-) )进行了增强,可以构建`Comparator`实例比较其他数据类型。
假设您的开发人员想要创建一个`Comparator`实例,使他们能够以相反的顺序对对象集合进行排序。例如,你如何按照等级的降序排序扑克牌组,从 Ace 到 2(而不是从 2 到 Ace)?和以前一样,您可以指定另一个 lambda 表达式。但是,如果您的开发人员可以通过调用方法来反转现有的`Comparator`,则会更简单。 `Comparator`界面已通过默认方法 [`reversed`](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#reversed--) 增强了此功能: 假设您的开发人员想要创建一个`Comparator`实例,使他们能够以相反的顺序对对象集合进行排序。例如,你如何按照等级的降序排序扑克牌组,从 Ace 到 2(而不是从 2 到 Ace)?和以前一样,您可以指定另一个 lambda 表达式。但是,如果您的开发人员可以通过调用方法来反转现有的`Comparator`,则会更简单。 `Comparator`接口已通过默认方法 [`reversed`](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#reversed--) 增强了此功能:
``` ```
myDeck.sort( myDeck.sort(
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
## 问题 ## 问题
1. 实现`java.lang.CharSequence`接口的类必须实现哪些方法? 1. 实现`java.lang.CharSequence`接口的类必须实现哪些方法?
2. 以下界面有什么问题? 2. 以下接口有什么问题?
``` ```
public interface SomethingIsWrong { public interface SomethingIsWrong {
...@@ -16,8 +16,8 @@ ...@@ -16,8 +16,8 @@
``` ```
3. 修复问题 2 中的界面 3. 修复问题 2 中的接口
4. 以下界面是否有效? 4. 以下接口是否有效?
``` ```
public interface Marker { public interface Marker {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/reflect/class/index.html](https://docs.oracle.com/javase/tutorial/reflect/class/index.html) > 原文: [https://docs.oracle.com/javase/tutorial/reflect/class/index.html](https://docs.oracle.com/javase/tutorial/reflect/class/index.html)
每种类型都是引用或基元。类,枚举和数组(均来自 [`java.lang.Object`](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html) )以及接口都是引用类型。参考类型的例子包括 [`java.lang.String`](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) ,原始类型的所有包装类,如 [`java.lang.Double`](https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html)界面 [`java.io.Serializable`](https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html) 和枚举 [`javax.swing.SortOrder`](https://docs.oracle.com/javase/8/docs/api/javax/swing/SortOrder.html) 。有一组固定的原始类型:`boolean``byte``short``int``long``char``float``double` 每种类型都是引用或基元。类,枚举和数组(均来自 [`java.lang.Object`](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html) )以及接口都是引用类型。参考类型的例子包括 [`java.lang.String`](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) ,原始类型的所有包装类,如 [`java.lang.Double`](https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html)接口 [`java.io.Serializable`](https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html) 和枚举 [`javax.swing.SortOrder`](https://docs.oracle.com/javase/8/docs/api/javax/swing/SortOrder.html) 。有一组固定的原始类型:`boolean``byte``short``int``long``char``float``double`
对于每种类型的对象,Java 虚拟机都实例化 [`java.lang.Class`](https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html) 的不可变实例,该实例提供检查对象的运行时属性的方法,包括其成员和类型信息。 [`Class`](https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html) 还提供了创建新类和对象的功能。最重要的是,它是所有 Reflection API 的入口点。本课程介绍了最常用的涉及类的反射操作: 对于每种类型的对象,Java 虚拟机都实例化 [`java.lang.Class`](https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html) 的不可变实例,该实例提供检查对象的运行时属性的方法,包括其成员和类型信息。 [`Class`](https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html) 还提供了创建新类和对象的功能。最重要的是,它是所有 Reflection API 的入口点。本课程介绍了最常用的涉及类的反射操作:
......
...@@ -110,7 +110,7 @@ public class ClassSpy { ...@@ -110,7 +110,7 @@ public class ClassSpy {
``` ```
这个例子比较紧凑;然而,由于 [`java.lang.reflect.Member`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Member.html) 界面自最早的反射实现以来已经存在,因此`printMembers()`方法略显尴尬,并且当泛型时它无法修改为包含更有用的`getGenericString()`方法介绍了。唯一的选择是如图所示进行测试和铸造,用`printConstructors()``printFields()``printMethods()`代替该方法,或者对 [`Member.getName()`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Member.html#getName--) 的相对备用结果感到满意。 这个例子比较紧凑;然而,由于 [`java.lang.reflect.Member`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Member.html) 接口自最早的反射实现以来已经存在,因此`printMembers()`方法略显尴尬,并且当泛型时它无法修改为包含更有用的`getGenericString()`方法介绍了。唯一的选择是如图所示进行测试和铸造,用`printConstructors()``printFields()``printMethods()`代替该方法,或者对 [`Member.getName()`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Member.html#getName--) 的相对备用结果感到满意。
输出样本及其解释如下。用户输入以斜体显示。 输出样本及其解释如下。用户输入以斜体显示。
...@@ -147,7 +147,7 @@ Methods: ...@@ -147,7 +147,7 @@ Methods:
``` ```
界面 [`java.nio.channels.ReadableByteChannel`](https://docs.oracle.com/javase/8/docs/api/java/nio/channels/ReadableByteChannel.html) 定义 [`read()`](https://docs.oracle.com/javase/8/docs/api/java/nio/channels/ReadableByteChannel.html#read-java.nio.ByteBuffer-) 。其余方法继承自超级接口。通过将`get*s()`替换为`getDeclared*s()`,可以很容易地修改此代码以仅列出实际在类中声明的那些方法。 接口 [`java.nio.channels.ReadableByteChannel`](https://docs.oracle.com/javase/8/docs/api/java/nio/channels/ReadableByteChannel.html) 定义 [`read()`](https://docs.oracle.com/javase/8/docs/api/java/nio/channels/ReadableByteChannel.html#read-java.nio.ByteBuffer-) 。其余方法继承自超级接口。通过将`get*s()`替换为`getDeclared*s()`,可以很容易地修改此代码以仅列出实际在类中声明的那些方法。
``` ```
$ java ClassSpy ClassMember FIELD METHOD $ java ClassSpy ClassMember FIELD METHOD
......
...@@ -134,6 +134,6 @@ public int compareTo(String anotherString); ...@@ -134,6 +134,6 @@ public int compareTo(String anotherString);
``` ```
和第二 _ 合成 _ 或编译器生成的 _ 桥 _ 方法。发生这种情况是因为 [`String`](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) 实现了参数化界面 [`Comparable`](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html) 。在类型擦除期间,继承方法 [`Comparable.compareTo()`](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#compareTo-T-) 的参数类型从`java.lang.Object`更改为`java.lang.String`。由于`Comparable``String``compareTo`方法的参数类型在擦除后不再匹配,因此不会发生覆盖。在所有其他情况下,这将产生编译时错误,因为未实现接口。增加桥接方法可以避免这个问题。 和第二 _ 合成 _ 或编译器生成的 _ 桥 _ 方法。发生这种情况是因为 [`String`](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) 实现了参数化接口 [`Comparable`](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html) 。在类型擦除期间,继承方法 [`Comparable.compareTo()`](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#compareTo-T-) 的参数类型从`java.lang.Object`更改为`java.lang.String`。由于`Comparable``String``compareTo`方法的参数类型在擦除后不再匹配,因此不会发生覆盖。在所有其他情况下,这将产生编译时错误,因为未实现接口。增加桥接方法可以避免这个问题。
[`Method`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html) 实现 [`java.lang.reflect.AnnotatedElement`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html) 。因此,可以检索具有 [`java.lang.annotation.RetentionPolicy.RUNTIME`](https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/RetentionPolicy.html#RUNTIME) 的任何运行时注释。有关获取注释的示例,请参见[检查类修饰符和类型](../class/classModifiers.html)部分。 [`Method`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html) 实现 [`java.lang.reflect.AnnotatedElement`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html) 。因此,可以检索具有 [`java.lang.annotation.RetentionPolicy.RUNTIME`](https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/RetentionPolicy.html#RUNTIME) 的任何运行时注释。有关获取注释的示例,请参见[检查类修饰符和类型](../class/classModifiers.html)部分。
\ No newline at end of file
...@@ -22,4 +22,4 @@ ...@@ -22,4 +22,4 @@
## [网络接口参数](parameters.html) ## [网络接口参数](parameters.html)
此页面显示如何确定网络接口是否正在运行,或者网络接口是环回接口,点对点接口还是虚拟接口。您还可以了解如何确定界面是否支持多播。 此页面显示如何确定网络接口是否正在运行,或者网络接口是环回接口,点对点接口还是虚拟接口。您还可以了解如何确定接口是否支持多播。
\ No newline at end of file \ No newline at end of file
...@@ -95,7 +95,7 @@ ...@@ -95,7 +95,7 @@
* [查找文件](../../essential/io/find.html) * [查找文件](../../essential/io/find.html)
* [走文件树](../../essential/io/walk.html) * [走文件树](../../essential/io/walk.html)
**项目 5:**使用 `WatchService` 界面观察目录中的更改 **项目 5:**使用 `WatchService` 接口观察目录中的更改
* [观看目录变更](../../essential/io/notification.html) * [观看目录变更](../../essential/io/notification.html)
......
...@@ -28,7 +28,7 @@ Attribute Identifier : Attribute Value ...@@ -28,7 +28,7 @@ Attribute Identifier : Attribute Value
## 目录和目录服务 ## 目录和目录服务
_ 目录 _ 是一组连接的目录对象。 _ 目录服务 _ 是一种服务,它提供用于创建,添加,删除和修改与目录中的对象相关联的属性的操作。该服务通过自己的界面访问。 _ 目录 _ 是一组连接的目录对象。 _ 目录服务 _ 是一种服务,它提供用于创建,添加,删除和修改与目录中的对象相关联的属性的操作。该服务通过自己的接口访问。
许多目录服务的例子都是可能的。 许多目录服务的例子都是可能的。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册