为什么Java不支持多继承?

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

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

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

这里写图片描述

这种结构带来了方法的歧义,即当我们调用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中则彻底禁止了多继承的语法,威廉认为是因为既然有了更好的接口来实现相同的功能,就不必要使语法变得更为复杂了,是出于语言整体设计的考虑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值