接口是否提供完全抽象?怎么样?

时间:2018-04-30 15:56:01

标签: java oop interface abstraction default-method

我知道界面提供了完全抽象,因为它不具备抽象类等具体方法。但是从java 8开始,接口可以使用default关键字具有具体方法,实现接口的类可以覆盖这些具体方法。 那么,界面真的提供完全抽象吗?

2 个答案:

答案 0 :(得分:2)

通过不编写默认方法,您仍然可以使接口提供完全抽象。

稍后,可能需要向此接口添加新功能并确保二进制兼容性。您将使用默认方法作为抽象和灵活性之间的权衡。

实际上,精心设计的默认方法不会带来许多特定的(依赖于实现的)事物。看看java.util.Comparator。我不会说像thenComparingnaturalOrder这样的方法会破坏Java 1.2版本引入的抽象级别。

答案 1 :(得分:1)

有没有,有了Java8的介绍,你基本上可以在接口中使用具体的方法。

像这样。

public interface IHelloWorld {
  public default void print() {
    System.out.println("Hello World");
  }
}

现在你可以实现一个实现这个接口的类或一个匿名类,并使用print(),就像你在一个抽象类中编写这个方法一样。

重要提示:

首先,您无法在界面中创建直接变量。你可以通过引入getter和setter来克服这个问题,但那将是不好的做法。

此外,您无法将此方法设置为最终。

不能这样做:

public final default void print() {
    System.out.println("Hello World");
}

这似乎是一个小问题,但在现实世界中,这可能是一个问题。有时你真的需要一个最终的方法来完全不被孩子改变。

在使用Java8的结论中,你也可以在接口中实现默认值,但是你不能将它们设置为final,而且更重要的是你不能创建类变量,因为它显然不是一个类。