需要单独使用抽象类和接口是什么?

时间:2015-04-26 04:37:10

标签: java oop interface

我怀疑Java 8的接口默认方法功能。 使用java 8的方法可以为接口中的方法提供默认实现,这样就不再需要实现类来覆盖该方法。

现在接口也可以包含抽象方法以及与抽象类相同的具体方法。两者都以相同的方式表现。 谈论界面和抽象方法之间的差异可以像 - 1.可以为一个类实现多个接口,但只能扩展一个类。 2.所有接口字段都是public static final,而在抽象类的情况下,您可以控制字段和方法的访问修饰符。

我怀疑的是,我们是否应该选择抽象类或接口? 同时具有Abstract类和接口的实际目的是什么?

2 个答案:

答案 0 :(得分:1)

在java 8中,abstract classinterface之间的差异变得更加狭窄。但它们之间仍然存在差异。 我会试着指出这些差异。如果我遗漏了什么请告诉我。

  1. 您可以使用抽象类创建具有任何类型的封装(公共,私有或受保护)和状态(最终或非最终)的属性。但是界面中的属性必须是公共的和最终的。
  2. 您只能扩展一个抽象类,但只能实现多个接口。
  3. 您可以在抽象类中创建构造函数,但不能在接口中创建。
  4. 您可以将状态与抽象类相关联,其中接口是无状态情况的首选。
  5. 您可以在此主题上找到oracle doc here

    Virtual extension methods的{​​{1}} / Default Methods / Defender Methods是这种差异的主要原因。因此,我将尝试描述在Java 8中引入这些类型的方法的必要性。

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

    forEach

    我添加了here的代码快照,以展示@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); } } } 的可用性。因此,我认为您必须根据自己的需要在default methodabstract class之间进行选择。

答案 1 :(得分:0)

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

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