为什么Java类仅能继承一个类却能实现多个接口?

目录:
1、多继承的问题
2、实现多个接口是如何解决此问题的
3、JDK8新特性引起的问题
  解决办法:

1、多继承的问题

多继承会产生“钻石问题”(菱形继承)
一张图理解菱形继承:

图源:维基百科

菱形继承(钻石问题)是当两个类B和C从A继承而类D从B和C继承时产生的歧义。如果D中的方法调用A中定义的方法(并且不覆盖该方法),并且B和C以不同的方式覆盖了该方法,那么它从哪个类继承:B或C?

也就是在上述继承关系下,子类的方法存在二义性问题
因此,Java不支持多继承。

2、实现多个接口是如何解决此问题的

实现接口时,方法的细节由类自行实现,因此不存在二义性问题

3、JDK8新特性引起的问题

JDK8之后,接口中也可以定义staticdefault方法了,这导致以下两种新的冲突可能出现:

“冲突”指的是方法 同名+参数类型相同

  1. 子类继承某父类A的同时,又实现了接口B,且A中有方法与接口B的默认方法冲突;
  2. 子类同时实现了接口A、B,且两个接口中有默认方法冲突;

解决办法:

  1. 同时继承超类与接口时:JVM默认超类优先(如果超类提供了具体实现,则接口的会被忽略)
  2. 同时实现两个接口时:如果至少有一个接口提供了实现,就会报错,必须覆盖这个方法来解决二义性问题;如果两个接口都未实现该方法,就没有冲突

学习Java时,学习资料靠谱程度是:源码 >= 官方文档 > 书籍 > 博客 = 视频,博客也许可以方便地解决问题,但系统地阅读经典书籍及查阅官方文档比搜索查阅博客更适合非应急情况的学习。

你可能感兴趣的:(为什么Java类仅能继承一个类却能实现多个接口?)