Java中的多重inheritance与否?

据说,Java语言只支持单inheritance。 但是,如何同时从Object和任何其他类inheritance? 这不是一个多重inheritance。

其次,我们需要inheritance所有11个Object方法? 我很难想象为什么我在I / O中需要它们,例如

最后,JDK 8将在接口中为我们提供默认方法实现,如果这可能会导致Java中的多重inheritance。

如果接口A为方法a()提供了默认实现,接口B也提供了另一个默认实现的a()方法,我们的自定义类C实现了两个接口并依赖于默认实现 – 那不是Diamond of Death吗?

但是,如何同时从Object和任何其他类inheritance? 这不是一个多重inheritance。

不,这不是发生的事情。 并非所有类都直接从Object类扩展。 但只有顶级inheritance层次结构中的类从Object类扩展( 隐式 )。 层次结构中较低的其余类从Object类扩展到超类 。 而且,这就是我们所说的多级inheritance

因此,请考虑以下层次结构: –

 class A { } class B extends A { } 

在上面的例子中, class A class A extends Object相当于class A extends Object

其次,我们需要inheritance所有11个Object方法? 我很难想象为什么我在I / O中需要它们

当你说inheritance时,我怀疑你的意思是覆盖 。 您不需要覆盖Object类的任何方法。 这只是你的要求,是否覆盖任何方法。 例如: – 您经常要覆盖equals()方法,以便为您的实例编写自定义相等性测试。 在这种情况下,您还应该覆盖hashCode()方法,以维护equals()hashCode()的契约。

最后,JDK 8将在接口中为我们提供默认方法实现,如果这可能会导致Java中的多重inheritance。

如果接口A为方法a()提供了默认实现,接口B也提供了另一个默认实现的a()方法,我们的自定义类C实现了两个接口并依赖于默认实现 – 那不是Diamond of Death吗?

我不能评论这个概念,因为我还没有读过这个东西。 也许,我会在稍后更新答案。

但是,如何同时从Object和任何其他类inheritance? 这不是一个多重inheritance。

除非另有说明,否则类扩展Object 。 就是这样:

 class A { ... } 

相当于:

 class A extends Object { ... } 

其次,我们需要inheritance所有11个Object方法? 我很难想象为什么我在I / O中需要它们,例如

  • equals()hashCode()用于比较和哈希表。
  • notify()wait()构成了跨线程通信的低级基础。
  • getClass()是所有reflection代码的起点。

通过将它们放在Object ,可以在JVM中的每个对象上使用它们。 您可以获取哈希代码和任何对象的类,您可以检查任何两个对象之间的相等性,您可以监视并通知任何对象。

如果接口A为方法a()提供了默认实现,接口B也提供了另一个默认实现的a()方法,我们的自定义类C实现了两个接口并依赖于默认实现 – 那不是Diamond of Death吗?

正如另一个关于SO的问题所解释的那样(实际上只是搜索“jdk8默认方法”):

要解决多重inheritance问题,实现两个接口的类必须提供该方法的实现,该接口为同一方法名称和签名提供默认实现。

因此,该类必须提供自己的实现,可能委托给其中一个默认方法。

你对“死亡钻石”是正确的,但……

这是D实现接口C和B并且两者都实现A的情况。此外,在这些接口中的两个或更多接口中定义了默认方法。

在此处输入图像描述

在Java 8中,他们定义了一种排序两种默认方法定义的方法。

我记得,如果A和B都定义了默认方法,那么D使用B的版本,因为它在类层次结构中较低。

如果B和C都定义了相同的默认方法,则存在冲突,D需要实现方法本身,尽管它可以通过回调B或C中实现的版本来实现(或者它可以有条件和使用两种情况都不同)。

 interface A { } interface B implements A { void m() default {println("In A");} } interface C implements A { void m() default {println("In B");} } } class D implements B, C { public void m() { println("In D"); B.super.m(); } } 

但是您可以访问Oracle关于Java 8中新function的页面并阅读所有相关内容。 我通过Googling“Java 8新function”到达那里。 在http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf找到了我的想法

您从一个inheritance自object的类inheritance。 Java不允许您从两个不同的类链inheritance。 但是,解决这个问题的方法是使用接口。

但是,如何同时从Object和任何其他类inheritance?

你不能这样做,你听错了。

其次,我们需要inheritance所有11个Object方法? 我很难想象为什么我在I / O中需要它们,例如

不知道你在这里谈论什么。

如果接口A为方法a()提供了默认实现,接口B也提供了另一个默认实现的a()方法,我们的自定义类C实现了两个接口并依赖于默认实现 – 那不是Diamond of Death吗?

什么都不知道JDK8,但是你已经可以在两个接口中实现一个具有相同名称/类型签名的方法,这可能是不合逻辑的,但Java允许它。

首先,所有东西都是Java中的Object或原语,所以这里没有问题。 对象是层次结构顶部的类。

目前您可以将多个接口应用于Java – 然后您编写实现。 我想在Java 8中 – 如果你定义了你的界面,那么你就有了实现。 如果不是 – 那么使用一些默认值。 如果定义了多个默认值(或者该方法由多个接口声明) – 则不使用默认值。 它可以很简单。