diff --git a/docs/java/109.md b/docs/java/109.md index 2ed061130871054a6f29d35d1ea3ed13e5c6b98d..4c1d1ff6907dbfc5490152baea94a425277dfefd 100644 --- a/docs/java/109.md +++ b/docs/java/109.md @@ -130,7 +130,7 @@ class SubClass extends SuperClass { ``` -5)另请注意,**覆盖方法不能缩小覆盖方法**的访问范围。 简而言之,如果父类中的覆盖方法受到保护,则子类中的覆盖方法不能为私有。 它必须是受保护的(相同的访问权限)或公共的(更广泛的访问权限)。 +5)另请注意,**覆盖方法不能缩小被覆盖方法**的访问范围。 简而言之,如果父类中的被覆盖方法受到保护,则子类中的覆盖方法不能为私有。 它必须是受保护的(相同的访问权限)或公共的(更广泛的访问权限)。 ```java public class SuperClass { diff --git a/docs/java/110.md b/docs/java/110.md index 9f99e2465f2da8ec6a171aa485a466edb7b55f09..3bdcfadfe57175661361fb4f6fd9d2baf5b69525 100644 --- a/docs/java/110.md +++ b/docs/java/110.md @@ -14,11 +14,11 @@ Table of Contents 5\. Java 8 default methods in interfaces ``` -I will recommend you to read about [abstraction](//howtodoinjava.com/object-oriented/understanding-abstraction-in-java/ "Understanding abstraction in java") first, because it the main force behind abstract classes and interfaces. +我将建议您先阅读[抽象](//howtodoinjava.com/object-oriented/understanding-abstraction-in-java/),因为它是抽象类和接口背后的主要力量。 ## 1\. Java 中的抽象类 -用最简单的话来说,**是一个抽象类,它使用关键字`abstract`** 声明为抽象。 它可能包含也可能不包含任何抽象方法。 JVM 将抽象类标识为**不完整类**,该类尚未定义其完整行为。 声明一个类`abstract`仅能执行一件事:您无法创建该类的实例,仅此而已。 +用最简单的话来说,抽象类使用关键字`abstract`声明为抽象。 它可能包含也可能不包含任何抽象方法。 JVM 将抽象类标识为**不完整类**,该类尚未定义其完整行为。 声明一个类`abstract`仅能执行一件事:您无法创建该类的实例,仅此而已。 那么,为什么还要费心创建一个根本无法实例化的类呢? 答案在于解决某些关键设计问题的方法。 我们将在本文后面介绍这一部分。 @@ -50,7 +50,7 @@ abstract class TestAbstractClass > 接口定义契约,实现类需要遵守这些契约。 -这些契约本质上是未实现的方法。 Java 已经有一个未实现方法的关键字,即 *abstract* 。 Java 提供了任何类都可以实现任何接口的规定,因此接口中声明的所有方法只需公开。 +这些契约本质上是未实现的方法。 Java 已经有一个未实现方法的关键字,即 `abstract`。 Java 提供了任何类都可以实现任何接口的规定,因此接口中声明的所有方法只需公开。 #### 2.1 接口语法 @@ -93,49 +93,49 @@ public class TestMain implements TestInterface 让我们记下**抽象类和接口**之间的区别以便快速查看: -1. Interfaces have all methods inherently ***public* and *abstract***. You can not override this behavior by trying to reduce accessibility of methods. You can not even declare the static methods. Only public and abstract. +1. 接口的固有的所有方法是*公共*和*抽象*的。 您不能通过尝试减少方法的可访问性来覆盖此行为。 您甚至不能声明静态方法。 仅公开和抽象。 另一方面,抽象类可以灵活地声明方法。 您还可以定义受保护的可访问性的抽象方法。 此外,还可以定义静态方法,只要它们不是抽象的即可。 允许使用非抽象静态方法。 -2. Interfaces can’t have fully defined methods. By definition, interfaces are meant to provide the only contract. +2. 接口不能具有完全定义的方法。 根据定义,接口旨在提供唯一的契约。 抽象类可以具有非抽象方法,没有任何限制。 您可以将任何关键字与非抽象方法一起使用,就像在其他任何类中一样。 -3. Any class which want to use abstract class can extend abstract class using keyword `extends`, whereas for implementing interfaces keyword used is `implements`. +3. 任何想使用抽象类的类都可以使用关键字`extends`来扩展抽象类,而对于实现接口的关键字,则使用`implements`。 一个类只能扩展一个类,但可以实现任何数量的接口。 在 Java 中,此属性通常称为**多继承**的模拟。 -4. 接口绝对是`abstract`,不能实例化; Java 抽象类也无法实例化,但是可以在存在 main()的情况下调用。 +4. 接口绝对是`abstract`,不能实例化; Java 抽象类也无法实例化,但是可以在存在` main()`的情况下调用。 接下来,如果我们既有抽象方法又有主类,可能会出现一个问题,我们可以尝试从`main()`调用抽象方法。 但是,此尝试将失败,因为`main()`方法始终是静态的,而抽象方法永远不能是静态的,因此您永远无法访问静态方法内的任何非静态方法。 ## 4\. 何时使用抽象类以及何时使用接口 -始终记住,在接口或抽象类之间选择**既不是/也不是方案,在这种情况下选择未经适当分析的任何人都会产生相同的结果。 了解当前问题后,必须非常明智地做出选择。 让我们尝试在这里添加一些智慧。** +始终记住,在接口或抽象类之间选择是二选一场景,在这种情况下选择未经适当分析的任何人都会产生相同的结果。 了解当前问题后,必须非常明智地做出选择。 让我们尝试在这里添加一些智慧。 #### 4.1 抽象类的部分行为 抽象类使您可以定义一些行为。 它使它们成为应用程序框架内的优秀候选人。 -让我们以 [HttpServlet](https://docs.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServlet.html "HTTP servlet") 为例。 如果要使用 Servlets 技术开发 Web 应用程序,则必须继承该类。 众所周知,每个 Servlet 都有明确的生命周期阶段,即初始化,服务和销毁。 如果我们创建了每个 servlet,我们必须一次又一次地编写关于初始化和销毁​​的同一段代码。 当然,这将是一个很大的痛苦。 +让我们以[`HttpServlet`](https://docs.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServlet.html "HTTP servlet")为例。 如果要使用 Servlets 技术开发 Web 应用程序,则必须继承该类。 众所周知,每个 Servlet 都有明确的生命周期阶段,即初始化,服务和销毁。 如果我们创建了每个 servlet,我们必须一次又一次地编写关于初始化和销毁​​的同一段代码。 当然,这将是一个很大的痛苦。 JDK 设计人员通过制作`HttpServlet`抽象类来解决此问题。 它具有为初始化 Servlet 和销毁 Servlet 而编写的所有基本代码。 您只需要覆盖某些方法即可在其中编写与应用程序处理相关的代码。 有道理吧! 可以使用接口添加上述功能吗? 不,即使可以,对于大多数无辜的程序员来说,设计也将是一个地狱。 -#### 4.2 合约专用介面 +#### 4.2 契约专用接口 -现在,让我们看看接口的用法。 **接口仅提供契约,实现类的责任是实现提供给它的每个契约。** +现在,让我们看看接口的用法。 接口仅提供契约,实现类的责任是实现提供给它的每个契约。 如果您只想**定义类**的特征,并且要强制所有实现实体实现这些特征,则该接口是最合适的。 -#### 4.3 例 +#### 4.3 示例 我想以集合框架中的`Map`接口为例。 它仅提供规则,以及映射在实践中应如何表现。 例如它应该存储键-值对,应该可以使用键等访问该值。这些规则在接口中采用抽象方法的形式。 -所有实现类(例如 [HashMap](//howtodoinjava.com/java/collections/how-hashmap-works-in-java/ "How hashmap works in java") ,HashTable,TreeMap 或 [WeakHashMap](https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html "WeakHashMap") )都不同地实现了所有方法,因此与其他方法相比具有不同的功能。 +所有实现类(例如[`HashMap`](//howtodoinjava.com/java/collections/how-hashmap-works-in-java/ "How hashmap works in java"),`HashTable`,`TreeMap`或[`WeakHashMap`](https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html "WeakHashMap"))都不同地实现了所有方法,因此与其他方法相比具有不同的功能。 -同样,接口可用于定义职责分离。 例如,`HashMap`实现 3 个接口:`Map`,[可序列化的](//howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/)和[可克隆的](//howtodoinjava.com/java/cloning/cloneable-interface-is-broken-in-java/)。 每个接口定义了各自的职责,因此实现类选择要实现的对象,因此将提供有限的功能。 +同样,接口可用于定义职责分离。 例如,`HashMap`实现 3 个接口:`Map`,[`Serializable`](//howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/)和[`Clonable`](//howtodoinjava.com/java/cloning/cloneable-interface-is-broken-in-java/)。 每个接口定义了各自的职责,因此实现类选择要实现的对象,因此将提供有限的功能。 ## 5\. 接口中的 Java 8 默认方法 @@ -187,6 +187,6 @@ public class Animal implements Moveable{ 现在,只有一个大的区别是**您不能扩展多个类,而可以实现多个接口**。 除了这种区别之外,您还可以通过接口实现任何可能的功能,这些接口可以使抽象类成为可能,反之亦然。 -希望您在 Java 中找到了有关**接口和抽象类的足够信息。** +希望您在 Java 中找到了有关**接口和抽象类的足够信息**。 学习愉快! \ No newline at end of file