为什么Java不支持多继承

原文链接:http://javarevisited.blogspot.com/2011/07/why-multiple-inheritances-are-not.html

最近我的一个朋友进行了几次面试,碰到了一个很容易被问的问题:为什么Java不支持多重继承,尽管他回答Java可以通过实现多个interface的方式实现多重继承,但面试官却依然为什么不支持。也许我的朋友仅仅是阅读了一些相关的博客,因此他过来把这个经典的问题抛给我,类似为什么Java中的String是不可变的常量一样,也许这样做是Java创造者设计决定的。然而我觉得至少以下两个原因是有意义的:

1)避免diamond problem(菱形问题),假设class A有一个foo()方法,class B和Class C都继承了A并实现了foo()方法,Class D 同时继承了Class B、Class C,如果在D中调用foo()方法,那哪个会被调用呢?这个被称为diamond problem,因为这种继承结构与四个边的菱形类似,

      A foo()
           / \
          /   \
 B foo()   C foo()
          \   /
           \ /
            D foo()
  我认为即使把顶部的class A去掉在D中调用foo()时依然有这样的歧义。

也许有时你还会被问为什么C++支持multiple inheritance而Java却不行,这时我会向他解释下面的第二个原因,这不是技术原因,而是从程序的可维护、可读行上考虑的,然而这只是我个人推测,只有Java设计者才能确认这个原因。Wikipedia  上有各种语言应对diamond problem引起问题的解决方式。

 

2)第二个更能说服我的原因是多重继承复杂化了设计并在类型转换、构造上带来了更多的问题,并且也没有很多必须使用多重继承的场景,因此为了简单化而不使用多重继承是明智的。为了避免歧义,Java使用interface实现了single inheritance,interface只提供了方法的声明而没有方法的实现,因此在子类中只有一个方法的实现也就不会产生歧义了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值