Java为什么不使用多继承?

发布时间: 2020-02-12 20:11:16

相信如果是第一次学习接口的同学可能会产生一个疑惑?什么疑惑呢?

首先接口长成这样

 interface Exampleinterface
{

    void something();
}

interface Exampleinterace1
{
    void something1();
}
  • 我们可以通过implements关键字,实现多个接口继承。 那想必抽象类大家都学过了,表示一种更高层次的类,往往充当占位的角色,功能与接口十分相似,只是声明和继承的关键子不一样。那为什么不直接继承多个抽象类,像这样
abstract class Ex0
{
    public abstract void something();
}


abstract class Ex1
{
    abstract void something();
}

class Test extends Ex0,Ex1//会报错
{
    public void something() {

    }
}

这是因为Java不支持一个类多个继承类。为什么Java不支持多继承呢?

好,既然Java不支持我们先看看那些语言支持吧,这里我们就以Python,和C++来说明,多继承如何工作的。 首先需要了解一下多继承的二义性问题 * 二义性问题:当b1,b2都继承A时,假设A类有个f()方法都被b1,b2重写。此时c在同时继承b1,b2当调用f()方法时,就无法确定调用那个方法。

首先Python多继承也会遇到二义性的问题,这里Python用的及时MRO机制,最早MRO利用的深度优先算法,但是有缺陷,只能对一个类进行重写,后来改成c3算法,主要利用的是广度优先算法,就很好确立了方法调用的顺序。

而C++的多继承则是同过虚继承来解决这个问题。二者在面对多继承的二义性问题时都十分复杂难以理解,笔者看了半天也就明白个大概,就不仔细说了。所以Java语言的设计者在面对 这个问题的时候,坚持着Java是简单易学的特性,放弃了多继承这个特性,转而利用多继承接口来实现多继承的类似功能。