首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中是否存在多重继承?

Java中是否存在多重继承?
EN

Stack Overflow用户
提问于 2013-02-05 01:54:23
回答 6查看 1K关注 0票数 0

据说,Java语言只支持单继承。然而,如何能够同时从Object和任何其他类继承呢?这不是多重继承吗。

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

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

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-02-05 01:56:30

然而,如何能够同时从Object和任何其他类继承呢?这不是多重继承吗。

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

因此,请考虑下面的层次结构:

代码语言:javascript
运行
复制
class A { }

class B extends A { }

在上面的例子中,class A等同于class A extends Object

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

我猜你说继承的时候指的是覆盖。您不需要重写Object类的任何方法。这只是你的需求,是否覆盖任何方法。例如:-你可能经常想要覆盖equals()方法,以便为你的实例编写自定义的相等性测试。在这种情况下,您还应该覆盖hashCode()方法,以维护equals()hashCode()之间的协定。

最后,JDK8将在接口中为我们提供默认的方法实现,这可能会导致

中的多重继承。

如果接口A为方法a()提供了默认实现,接口B也提供了另一个默认实现的()方法,而我们的自定义类C实现了这两个接口并依赖于默认实现-那不是死亡之钻吗?

我不能评论这个概念,因为我还没有读过关于这个东西的文章。也许,我会在以后的某个时候更新答案。

票数 8
EN

Stack Overflow用户

发布于 2013-02-05 02:02:46

然而,如何能够同时从Object和任何其他类继承呢?这不是多重继承吗。

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

代码语言:javascript
运行
复制
class A { ... }

等同于:

代码语言:javascript
运行
复制
class A extends Object { ... }

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

跨线程communication.

  • getClass()的底层基础是
  • equals()wait(),它们是所有反射代码的起点。

通过将它们放在Object上,可以在JVM中的每个对象上使用它们。你可以得到任何对象的散列代码和类,你可以检查任何两个对象之间的相等性,你可以监视和通知任何对象。

如果接口A提供了方法a()的默认实现,接口B也提供了另一个默认实现的()方法,而我们的自定义类C实现了这两个接口并依赖于默认实现-那不是死亡之钻吗?

正如another question here on SO中所解释的(从字面上看,只需搜索"jdk8 default methods“即可):

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-02-05 02:04:54

你说的“死亡之钻”是对的但是..。

这就是D实现接口C和B,而这两个接口又都实现A的情况。此外,在两个或多个接口中定义了一个默认方法。

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

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

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

代码语言:javascript
运行
复制
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中的新特性,并阅读所有相关内容。我是通过谷歌搜索"Java 8新特性“找到的。在http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf找到了我想要的东西

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14692537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档