Java中的多重继承与否?

时间:2013-02-04 17:54:23

标签: java class inheritance multiple-inheritance

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

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

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

如果接口A为方法a()提供了默认实现,接口B也提供了带有另一个默认实现的a()方法,并且我们的自定义类C实现了两个接口并依赖于默认实现,那么该怎么办呢{{3> }?

6 个答案:

答案 0 :(得分:8)

  

但是如何继承Object和其他任何东西   同时上课?这不是一个多重继承。

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

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

class A { }

class B extends A { }

在上述情况下,class A相当于class A extends Object

  

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

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

  

最后JDK 8将为我们提供默认方法实现   接口以及可能导致多重继承的接口   Java的。

     

如果接口A提供带有默认实现的方法a(),该怎么办?   接口B还提供了另一个默认实现的a()方法   我们的自定义类C实现了两个接口并依赖于默认值   实现 - 那不是钻石死亡吗?

我不能对这个概念发表评论,因为我还没有读过这个东西。可能会在稍后的某个时候更新答案。

答案 1 :(得分:3)

  

但是如何继承Object和其他任何东西   同时上课?这不是一个多重继承。

除非另有说明,否则课程会延伸Object。就是这样:

class A { ... }

相当于:

class A extends Object { ... }
  

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

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

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

  

如果接口A提供带有默认实现的方法a(),该怎么办?   接口B还提供了另一个默认实现的a()方法   我们的自定义类C实现了两个接口并依赖于默认值   实现 - 那不是钻石死亡吗?

正如another question here on SO中解释的那样(实际上只是搜索“jdk8默认方法”):

  

要解决多重继承,请执行一个实现两个的类   接口提供相同方法名称的默认实现   和签名必须提供该方法的实现。

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

答案 2 :(得分:1)

你对“死亡之钻”是正确的,但是......

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

enter image description here

在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中新功能的页面并阅读所有相关内容。我通过Googling“Java 8新功能”到达那里。在http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf

找到了我的想法

答案 3 :(得分:0)

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

答案 4 :(得分:0)

  

但是如何继承Object和其他任何东西   同时上课?

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

  

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

不确定你在这里谈论什么。

  

如果接口A提供带有默认实现的方法a(),该怎么办?   接口B还提供了另一个默认实现的a()方法   我们的自定义类C实现了两个接口并依赖于默认值   实现 - 那不是钻石死亡吗?

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

答案 5 :(得分:0)

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

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