带接口的java多重继承
我们都知道关于多重继承的diamond problem
A
/ \
B C
\ /
D
这个问题描述了类D
的一种不明确的情况。如果类A
有一个方法,并且B
和/或C
都重写了该方法,那么D
重写的是哪个版本的方法
这个问题也适用于Java中的接口吗?如果没有,Java接口如何克服这个问题
你可以在下面搜索框中键入要查询的问题!
我们都知道关于多重继承的diamond problem
A
/ \
B C
\ /
D
这个问题描述了类D
的一种不明确的情况。如果类A
有一个方法,并且B
和/或C
都重写了该方法,那么D
重写的是哪个版本的方法
这个问题也适用于Java中的接口吗?如果没有,Java接口如何克服这个问题
# 1 楼答案
Java不支持多重继承,因此不会出现菱形问题。如果B&;C是接口,则接口中没有实现。即使B&;C重写接口A中的方法(不能是类),这些方法将具有相同的签名。关于使用哪种实现没有任何模糊性,因为没有实现
# 2 楼答案
Java克服了这个问题,即使接口可以有方法的默认实现,因为默认实现要么是明确的(类
A
中的实现),要么这种情况通过某种规则解决(当类B
或类C
重写类A
中的实现时,见下文)当类或接口的超类型提供具有相同签名的多个默认方法时:
但是,如果两个或多个独立定义的默认方法冲突,或者默认方法与抽象方法冲突,则Java编译器会产生编译器错误。必须显式重写超类型方法。在本例中,您可以使用super关键字调用任何默认实现
另见:How does Java 8' new default interface model works (incl. diamond, multiple inheritance, and precedence)?
# 3 楼答案
Java 8中引入了接口中的默认方法,可能会出现与多重继承相关的问题,有3种情况-
1-如果实现类重写默认方法并为默认方法提供自己的功能,则类的方法优先于接口默认方法
2-当类实现了两个接口,并且都具有相同的默认方法时,并且该类没有重写该方法,则将抛出错误
3-如果一个接口扩展了另一个接口,并且两者都具有相同的默认方法,则继承接口的默认方法将优先
阅读更多关于它的信息here
# 4 楼答案
关于Java8接口多重继承(又称Java如何避免菱形问题)的现有答案:
有三条规则需要遵循:
一个班级总是赢的。类自己的方法实现优先于接口中的默认方法
如果类没有:大多数特定的接口将获胜
# 5 楼答案
接口具有虚拟声明,并且它们不会有实现,因此没有 歧义问题
# 6 楼答案
菱形问题只适用于实现继承(
extends
在Java8之前的所有Java版本中)。它不适用于API继承(implements
在Java8之前的所有Java版本中)由于具有匹配类型签名的接口方法是兼容的,因此如果您两次继承相同的方法签名,则不会出现菱形问题:匹配方法签名只是合并。(如果类型签名不相同,那么也没有菱形问题。)
在Java7及以下版本中,继承实现代码的唯一方法是通过
extends
关键字,该关键字最多限制为一个父级。因此,不存在多重实现继承,也不存在菱形问题Java8增加了一个新的缺点,因为它允许接口具有实现代码。当您使用具有匹配签名的方法实现多个接口时,它仍然可以通过简单地返回到以前的行为(没有实现继承)来避免菱形问题