最近我的一个朋友进行了几次面试,碰到了一个很容易被问的问题:为什么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只提供了方法的声明而没有方法的实现,因此在子类中只有一个方法的实现也就不会产生歧义了。