7

现在,我们知道 Java 8 在接口中引入了默认方法和静态方法。
最初在 Java 中引入接口是为了避免在 C++ 中出现的多继承中 的菱形问题。

但是随着 Java 8 在接口中引入默认方法,现在 Java 也引入了菱形问题,在之前的版本中它避免了这个问题。

默认方法不是强制需要被覆盖的。
但是当使用接口出现菱形问题时,实现这些接口的类必须覆盖默认方法。

所以现在,我的脑海里有三个问题:

  1. 为什么需要有默认方法?
  2. 难道我们不能通过类本身进行多重继承,而不是在接口中使用默认方法吗?
  3. 如果他们必须在 Java 8 中引入它,那么在以前的版本中需要避免钻石问题吗?

任何好的解释或解释的任何链接?

PS我没有在互联网上找到任何包含任何好文章的链接。
他们只是说抽象类给了你更多的具体性。
如,抽象类可以有构造函数,但接口不能。

再说一次,我想知道,如果抽象类更具体,并且可以有构造函数,
而且无论如何Java已经引入了菱形问题,为什么我们现在应该有接口?抽象类作为独立的多重继承难道不够好吗?

4

3 回答 3

16

不,它没有重新引入菱形问题,因为接口仍然不能有任何状态,并且默认方法可能不是最终的。

因此,当您选择实现两个接口时,您仍然拥有想要实现默认方法的所有自由,可以选择提供的默认实现之一,也可以提供您自己的实现。但是你永远不会遇到从两个接口继承冲突状态的问题,或者继承两个不同的最终方法并且无法解决冲突的问题。

因此,以下是您的问题的答案:

  1. 为了能够在现有接口中引入新方法而不破坏向后兼容性:现有实现将自动实现这些方法,因为它们的实现在基本接口中。
  2. 不,因为那会引入钻石问题。
  3. 无关紧要
于 2014-06-23T12:01:58.070 回答
2

关于第 1 点:

为了支持所有集合类的 lambda 表达式,比如forEach方法,有必要添加一些具有向后兼容性的东西。

有关详细信息,请参阅此视频 Lambda Peak Under the hood

于 2014-06-23T12:05:59.570 回答
0
  1. 默认方法可以增强现有接口,同时为现有用户提供与旧版本接口的二进制兼容性。

在此处查看更多信息https://docs.oracle.com/javase/tutorial/java/IandI/nogrow.html

于 2015-06-25T12:03:31.437 回答