【问题标题】:Does interface provide full abstraction? How?接口是否提供完整的抽象?如何?
【发布时间】:2018-10-10 18:14:17
【问题描述】:

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

【问题讨论】:

  • 你回答了自己的问题
  • 现在没有。
  • 嗯,在实践中,没有什么比你准确描述的更多了。不过,我不确定您所说的 “完全提供抽象” 是什么意思,而且我认为 SO 问题不适合您的审讯格式。
  • 有具体的方法并不意味着你必须使用具体的方法。因此,如果接口在添加之前提供了完整的抽象,那么显然它是在添加之后提供的。
  • 这正是我的问题 :) 在许多资料和书籍中,我发现接口提供了完整的抽象。但是后来我开始了解 java 8 中的默认方法。然后我的脑海中出现了一个问题,如果我错过了其他任何事情。 @ShanuGupta

标签: java oop interface abstraction default-method


【解决方案1】:

有没有,随着Java8的引入,你基本上可以在接口中使用具体的方法了。

类似的东西。

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

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

重要:

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

您也不能将此方法设置为final。

不能这样做:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    实际上,设计良好的默认方法并不会带来很多具体(依赖于实现)的东西。看看java.util.Comparator。我不会说thenComparingnaturalOrder 之类的方法破坏了 Java 1.2 版本引入的抽象级别。

    【讨论】:

      猜你喜欢
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      相关资源
      最近更新 更多