Java不支持多继承的原因

来源:互联网 发布:医疗软件发展前景 编辑:程序博客网 时间:2024/05/16 02:15

概述

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不支持多继承