我对 Java 8 接口(interface)的默认方法功能有疑问。 意味着使用 java 8,您可以为接口(interface)中的方法提供默认实现,这样实现类就不再需要重写该方法。
现在接口(interface)也可以包含抽象方法以及与抽象类相同的具体方法。两者的行为方式相同。 谈论接口(interface)和抽象方法之间的区别可以这样识别: 1.一个类可以实现多个接口(interface),但只能扩展一个类。 2.所有接口(interface)字段都是public static final,而对于抽象类,您可以控制字段和方法的访问修饰符。
我的疑问是,到底区别在哪里,我们应该选择抽象类还是接口(interface)? 分别拥有抽象类和接口(interface)的实际目的是什么?
最佳答案
在 java 8 中,抽象类
和接口(interface)
之间的差异变得更加狭窄。但它们之间仍然存在差异。
我将尝试指出这些差异。如果我错过了什么,请告诉我。
- 您可以使用抽象类创建任何类型的封装(公共(public)、私有(private)或 protected )和状态(最终或非最终)的属性。但接口(interface)中的属性必须是公共(public)的和最终的。
- 您只能扩展一个抽象类,但可以实现多个接口(interface)。
- 您可以在抽象类中创建构造函数,但不能在接口(interface)中创建构造函数。
- 您可以将状态与抽象类相关联,其中接口(interface)对于无状态情况是首选。
可以找到oracle文档here关于这个话题。
接口(interface)
的虚拟扩展方法
/默认方法
/Defender方法
是造成这种微小差异的主要原因。因此我将尝试描述在 Java 8 中引入这些类型的方法的必要性。
在 java 8 中引入了 lambda。为了充分利用 lambda 集合框架,已更新。 Iterable 接口(interface)中添加了 forEach
方法。在不破坏实现的情况下更改接口(interface)是不可行的。默认方法用于在不破坏实现的情况下添加功能。
@FunctionalInterface
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
}
我已经添加了来自 here 的代码快照演示默认方法
的可用性。所以我认为你必须根据你的需要在抽象类
和接口(interface)
之间进行选择。
关于java - 分别有抽象类和接口(interface)的必要性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29873805/