Java不支持多继承的原因

概述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值