概述
java不支持多继承的原因是由于多继承存在致命方块问题(diamond problem)。
举例说明致命方块问题
public abstract class Animal {
/**所有动物都得吃饭*/
protected abstract void eat();
/**其他抽象的特征,行为*/
}
public class Horse extends Animal {
@Override
protected void eat() {
System.out.println("马吃饭方式是咀嚼、下咽");
}
/**其他特殊、具体的行为*/
}
public class Bird extends Animal{
@Override
protected void eat() {
System.out.println("鸟儿吃饭方式是啄食,下咽");
}
/**其他特殊、具体的行为*/
}
/**
* Pegasus:天马,有翼的马
*/
public class Pegasus extends Bird,Horse {
/**其他特殊、具体的行为*/
}
Pegasus.java会提示Class cannot extends multiple classes,这是为什么?
解析
Bird和Horse从Animal继承了eat()方法,并重写了eat()方法。假如Java支持多继承,那么Pegasus类没写错,但是当天马执行eat()方法的时候,究竟是调用Bird的eat()方法还是Horse的eat()方法?这里就产生了歧义(ambiguity),因此Java不支持多继承。
如果想要有多继承效果,可用实现(implements)接口方式。为何接口不会产生致命方块问题,是以为接口所有的方法都是抽象的,实现的类必须得实现所有接口定义的接口,这不会存在歧义问题。
为何叫致命方块
看上面类图,发现像一个方块,所以叫方块问题(diamond problem)。这是个人认为。
Reference
为何Java不支持多继承