有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带接口的java多重继承

我们都知道关于多重继承的diamond problem

   A
  / \
 B   C
  \ / 
   D

这个问题描述了类D的一种不明确的情况。如果类A有一个方法,并且B和/或C都重写了该方法,那么D重写的是哪个版本的方法

这个问题也适用于Java中的接口吗?如果没有,Java接口如何克服这个问题


共 (6) 个答案

  1. # 1 楼答案

    Java不支持多重继承,因此不会出现菱形问题。如果B&;C是接口,则接口中没有实现。即使B&;C重写接口A中的方法(不能是类),这些方法将具有相同的签名。关于使用哪种实现没有任何模糊性,因为没有实现

  2. # 2 楼答案

    Java克服了这个问题,即使接口可以有方法的默认实现,因为默认实现要么是明确的(类A中的实现),要么这种情况通过某种规则解决(当类B或类C重写类A中的实现时,见下文)

    当类或接口的超类型提供具有相同签名的多个默认方法时:

    • 实例方法优于接口默认方法
    • 已被其他候选项覆盖的方法将被忽略当超类型共享一个共同的祖先时,可能会出现这种情况

    但是,如果两个或多个独立定义的默认方法冲突,或者默认方法与抽象方法冲突,则Java编译器会产生编译器错误。必须显式重写超类型方法。在本例中,您可以使用super关键字调用任何默认实现

    另见:How does Java 8' new default interface model works (incl. diamond, multiple inheritance, and precedence)?

  3. # 3 楼答案

    Java 8中引入了接口中的默认方法,可能会出现与多重继承相关的问题,有3种情况-

    1-如果实现类重写默认方法并为默认方法提供自己的功能,则类的方法优先于接口默认方法

    2-当类实现了两个接口,并且都具有相同的默认方法时,并且该类没有重写该方法,则将抛出错误

    3-如果一个接口扩展了另一个接口,并且两者都具有相同的默认方法,则继承接口的默认方法将优先

    阅读更多关于它的信息here

  4. # 4 楼答案

    关于Java8接口多重继承(又称Java如何避免菱形问题)的现有答案:

    有三条规则需要遵循:

    1. 一个班级总是赢的。类自己的方法实现优先于接口中的默认方法

    2. 如果类没有:大多数特定的接口将获胜

    enter image description here

    1. 如果不是上述情况,继承类必须显式地声明它使用的方法实现(否则它将不会编译)

    enter image description here

  5. # 5 楼答案

    接口具有虚拟声明,并且它们不会有实现,因此没有 歧义问题

  6. # 6 楼答案

    菱形问题只适用于实现继承(extends在Java8之前的所有Java版本中)。它不适用于API继承(implements在Java8之前的所有Java版本中)

    由于具有匹配类型签名的接口方法是兼容的,因此如果您两次继承相同的方法签名,则不会出现菱形问题:匹配方法签名只是合并。(如果类型签名不相同,那么也没有菱形问题。)

    在Java7及以下版本中,继承实现代码的唯一方法是通过extends关键字,该关键字最多限制为一个父级。因此,不存在多重实现继承,也不存在菱形问题

    Java8增加了一个新的缺点,因为它允许接口具有实现代码。当您使用具有匹配签名的方法实现多个接口时,它仍然可以通过简单地返回到以前的行为(没有实现继承)来避免菱形问题