首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将抽象类和接口分开的必要性是什么?

将抽象类和接口分开的必要性是什么?
EN

Stack Overflow用户
提问于 2015-04-26 12:37:10
回答 2查看 319关注 0票数 1

我对Java 8的接口的默认方法特性有疑问。这意味着在java8中,您可以在接口中为方法提供默认实现,这样就不再需要实现类来覆盖该方法。

现在,接口还可以包含抽象方法,以及与抽象类相同的具体方法。两者都有相同的行为方式。说到接口和抽象方法之间的区别,可以识别为- 1。一个类可以实现多个接口,但只能扩展一个类。2.所有接口字段都是public static final,而在抽象类的情况下,您可以控制字段和方法的访问修饰符。

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

EN

回答 2

Stack Overflow用户

发布于 2015-04-26 16:38:18

在java8中,abstract classinterface之间的差异变得更小了。但它们之间仍然存在差异。我将尝试指出这些差异。如果我错过了什么请告诉我。

  1. 您可以使用任何类型的封装(公共的、私有的或受保护的)创建属性,并使用抽象类创建状态(最终或非最终)。但interfaces.
  2. You中的属性必须是公共的和最终的。
  3. 您只能扩展一个抽象类,但实现多个接口可以在抽象类中创建构造函数,但不能在接口中创建构造函数。
  4. 您可以将状态与抽象类关联,其中接口是无状态情况下的首选接口。

你可以在这个主题上找到oracle doc here

interfaceVirtual extension methods/ Default Methods/Defender Methods是造成这种微小差异的主要原因。因此,我将尝试描述在Java 8中引入这些类型的方法的必要性。

在java 8中引入了lambda。为了充分利用lambda集合框架已经更新。在Iterable接口中添加了forEach方法。在不破坏实现的情况下更改接口是不可行的。默认方法用于在不中断实现的情况下添加功能。

代码语言:javascript
复制
@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的代码快照,以演示default method的可用性。因此,我认为您必须根据自己的需求在abstract classinterface之间做出选择。

票数 1
EN

Stack Overflow用户

发布于 2015-04-26 12:48:52

接口是完全抽象的类。Java需要这两者。你可以在这里找到一些有用的信息。Difference between an interface and an abstract class

你也可以看到这个问题。What is the difference between an interface and abstract class

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29873805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档