在Java 8中使用默认方法和抽象类的接口?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (164)

因为Java 8允许在接口中默认实现默认方法,我搞不清楚抽象类

那么,何时应该使用与默认方法的接口,何时应该使用抽象类?

提问于
用户回答回答于

抽象类比默认的方法实现(比如私有状态)要多得多,但是在Java 8中,你应该选择接口中默认的方法。

对默认方法的约束是,它只能在调用其他接口方法的条件下实现,而不涉及特定的实现的状态。因此,主要的用例是更高层次,简洁的方法。

这个新特性的好处是,在你被迫使用一个抽象类的便利方法,从而限制单继承的实现。

用户回答回答于

Remi Forax 的规则是如果你用接口设计了你的程序,就不要再使用抽象类.不管你是什么版本的Java,不管语言是什么。

以后可以使用抽象类对代码进行分析。现在,使用Java 8,您可以直接在接口中完成它。

用户回答回答于

为什么我们必须使用抽象类:

  1. 抽象类可以有抽象方法和非抽象方法。
  2. 抽象类不支持多重继承。
  3. 抽象类可以有最终变量、非最终变量、静态变量和非静态变量.
  4. 抽象类可以有静态方法、主方法和构造函数。
  5. 抽象类可以提供接口的实现。
  6. 抽象关键字用于声明抽象类。

为什么我们必须使用接口:

  1. 界面是应用程序设计中最抽象的层次。
  2. 接口支持多重继承。
  3. 接口,仅用于描述子类的签名。
  4. 接口只有静态变量和最终变量。
  5. 使用默认方法只用于扩展一些接口,例如外部库。
用户回答回答于

Java接口中的默认方法启用接口...

给定一个现有的接口,如果您希望在不破坏与旧版本的接口的二进制兼容性的情况下添加一个方法,那么您有两种选择:添加默认值或静态方法。实际上,添加到接口的任何抽象方法都必须由实现该接口的类或接口进行填充。

静态方法是类特有的。默认方法是类实例的唯一方法。

如果向现有接口添加了默认方法,那么实现该接口的类和接口不需要实现它。他们可以

  • 实现默认方法,并在已实现的接口中重写实现。
  • 重新声明方法(没有实现),使其抽象。
  • 什么也不做(那么实现的接口中的默认方法就会被继承)。
用户回答回答于

Java 8中的抽象类与接口

在引入默认方法之后,接口和抽象类可以说是一样的。然而,在Java 8中它们仍然是不同的概念。

抽象类可以定义构造函数。它们的结构更加结构化,并且彼此之间有一定联系。相反,默认方法只能在调用其他接口方法的条件下实现。如何使用需联系上下文

用户回答回答于

关于你的问题

何时使用默认方法,何时使用接口?

抽象类与接口相比:

抽象类类似于接口。您不能实例化它们,而且它们可能包含有或没有实现声明的方法的混合。 但是,使用抽象类,您可以声明非静态和最终的字段,并定义公共、受保护和私有的具体方法。 对于接口,所有字段都是自动公共的、静态的和最终的,并且声明或定义的所有方法(作为默认方法)都是公共的。此外,您只能扩展一个类,不管它是否是抽象的,而您可以实现任意数量的接口。

下面的文章解释了每个用例:

接口和抽象类有什么区别?

用户回答回答于

每当我们在抽象类和接口之间进行选择时,我们总是倾向于默认(也称为denfender或虚拟扩展)方法。

  1. 默认方法已经结束了经典的接口模式,并成为了实现该接口中大多数或所有方法的配套类。一个例子是Collection and AbstractCollection现在我们应该实现接口本身中的方法,以提供默认功能。实现接口的类可以选择重写方法或继承默认实现。
  2. 默认方法的另一个重要用途是interface evolution.假设我有一个类:

public class Ball implements Collection { ... }

现在在Java 8中引入了一个新的特性流。我们可以使用stream方法添加到接口中。如果stream的所有实现都不是默认方法。Collection接口会中断,因为它们不会实现这个新方法。向接口添加非默认方法不是source-compatible...

但是假设我们不重新编译该类,并使用包含这个类的以前的jar文件。如果没有使用这个方法,则会正常运行,但是,如果程序在Ball的实例上调用流方法,我们将得到abstractmethodderror。

用户回答回答于

这两种完全不同的情况:

默认方法是添加外部功能到现有类且不更改现有类其状态。

抽象类是一种正常的继承类型。

用户回答回答于

下面是关于forEach的一些说法。

List<?> list = …
list.forEach(…);

foreach不是java.util.List也不是java.util.Collection的接口。可以将新方法添加到现有接口中,然后在JDK中提供实现。但是,一旦发布,就无法再向接口添加方法。 默认方法的好处是,可以向接口添加一个新的默认方法,而且不好会影响结果。

用户回答回答于

与Java 8接口相比抽象类和它有一些差异,抽象类可以完成更多任务:

  1. 抽象类可以有一个构造函数。
  2. 抽象类结构性更好。

从概念上讲,Defender方法的主要目的是在Java 8中引入新特性(作为lambda表达式)。

扫码关注云+社区

领取腾讯云代金券