提交 f9539d27 编写于 作者: W wizardforcel

2020-05-22 22:24:09

上级 875d24f8
......@@ -130,7 +130,7 @@ class SubClass extends SuperClass {
```
5)另请注意,**覆盖方法不能缩小覆盖方法**的访问范围。 简而言之,如果父类中的覆盖方法受到保护,则子类中的覆盖方法不能为私有。 它必须是受保护的(相同的访问权限)或公共的(更广泛的访问权限)。
5)另请注意,**覆盖方法不能缩小被覆盖方法**的访问范围。 简而言之,如果父类中的被覆盖方法受到保护,则子类中的覆盖方法不能为私有。 它必须是受保护的(相同的访问权限)或公共的(更广泛的访问权限)。
```java
public class SuperClass {
......
......@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册