为什么Java不支持多继承?

我们知道,在Java中,多重继承是不支持的,即子类不允许继承多个父类,但这样设计的原因是什么呢?

于是威廉来引出一个场景,即著名的‘菱形问题

假设A类有两个子类B和C,且允许类D同时继承于B和C,那我们可以用下面这张图来表示

为什么Java不支持多继承?_第1张图片

这种结构带来了方法的歧义,即当我们调用B和C同时拥有,且在D中没有覆盖的方法时,Java编译器就不知道该调用哪一个父类的具体方法实现了

来看具体的例子

public class Animal {
  private int weight;
  public String showWeight(){}
}

public class Tiger extends Animal {
  public String showWeight(){
    return "Tiger's weight:" + String.valueOf(weight);
  }
}

public class Lion extands Animal {
  public String showWeight(){
    return "Lion's weight:" + String.valueOf(weight);
  }
}

// 假设可以多继承,实际并不允许
public class Liger extends Tiger, Lion {}

现在我们来看下,当调用Liger.showWeight()时会发生什么?

由于showWeight方法在Liger子类本身没有具体的实现,Java编译器就会在父类中去寻找,这时候它发现两个父类中都有实现,该用哪个呢?于是歧义出现了

为了避免这种歧义,Java的语法中禁止了多继承,而把这种功能放在了接口中实现

由于接口只定义方法框架而没有具体的实现,所以应用接口的类就必须去实现方法,调用的始终是自身类的方法实现,因此就不会有上述的歧义问题

另外提一句,在C++中可以通过将父类的方法设为抽象abstract方法来解决菱形问题,C++编译器是允许这种多继承的。Java中则彻底禁止了多继承的语法,威廉认为是因为既然有了更好的接口来实现相同的功能,就不必要使语法变得更为复杂了,是出于语言整体设计的考虑

你可能感兴趣的:(不那么基础的Java基础)