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中 – 如果你定义了你的界面,那么你就有了实现。 如果不是 – 那么使用一些默认值。 如果定义了多个默认值(或者该方法由多个接口声明) – 则不使用默认值。 它可以很简单。