java - 分别有抽象类和接口(interface)的必要性是什么?

标签 java oop interface

我对 Java 8 接口(interface)的默认方法功能有疑问。 意味着使用 java 8,您可以为接口(interface)中的方法提供默认实现,这样实现类就不再需要重写该方法。

现在接口(interface)也可以包含抽象方法以及与抽象类相同的具体方法。两者的行为方式相同。 谈论接口(interface)和抽象方法之间的区别可以这样识别: 1.一个类可以实现多个接口(interface),但只能扩展一个类。 2.所有接口(interface)字段都是public static final,而对于抽象类,您可以控制字段和方法的访问修饰符。

我的疑问是,到底区别在哪里,我们应该选择抽象类还是接口(interface)? 分别拥有抽象类和接口(interface)的实际目的是什么?

最佳答案

在 java 8 中,抽象类接口(interface) 之间的差异变得更加狭窄。但它们之间仍然存在差异。 我将尝试指出这些差异。如果我错过了什么,请告诉我。

  1. 您可以使用抽象类创建任何类型的封装(公共(public)、私有(private)或 protected )和状态(最终或非最终)的属性。但接口(interface)中的属性必须是公共(public)的和最终的。
  2. 您只能扩展一个抽象类,但可以实现多个接口(interface)。
  3. 您可以在抽象类中创建构造函数,但不能在接口(interface)中创建构造函数。
  4. 您可以将状态与抽象类相关联,其中接口(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/

相关文章:

c# - 如何比较具有相似属性的两个截然不同的对象

c# - 在 C++ 中实现接口(interface)?

JAVA ODFDOM : How to get integer values from ODF sheet

java - Map<String, ?> 的 getOrDefault

Java:如何避免 display() 和 write(pdf) 之间的代码重复

java - 如何在实现 Filterable 接口(interface)的 AutocompleteTextView 中获取建议之前等待用户停止输入?

Java 通用接口(interface) List<T> 不接受对象类型

java - 使用 Jest 使用自定义分析器创建索引时遇到问题

java - 简单的二十一点

PHP 类 : Need help to inherit two classes