为什么Java中类是单继承,而接口是多继承?


1、类继承会导致派生类如果不需要覆盖基类的方法时,基类被继承过来的方法仍可能有实现的细节即方法体,那么菱形继承问题是多继承下的产物:B,C继承A,D继承B,C,在不考虑B,C为抽象类且方法不存在被实现的方法时,D会继承B,C的所有方法,那么D的方法继承的是B,C哪个类的方法呢?或许已经存在解决办法,但是明显存在不安全因素。(这个地方我也没去试,因为这个问题C++早就给出了解决方案,所以试也试不出来)

2、但是接口为什么又是多继承呢?因为在第一点中提到,继承过来的方法可能有方法体,在接口中方法都是public的抽象方法,或许有默认实现,但是不会被继承过去。那么多继承存在的菱形继承就不攻自破了,是的,关键就是继承后这个方法仍然没有被实现那么就可以使用多继承。也就是说Java的抽象类应该可以进行多继承操作,前提是派生类也是抽象类。(这里我没有去进行操作了,各位看客可以试试)

为什么默认实现不会被继承呢?

如下图,当我想调用D.point()方法时,由于没有被实现,和E同样的操作,但是编译器却给了一个没有实现的提示,这就说明规定默认实现本质是独立于接口继承的,可能细节性的地方没去探究了,但是已经能证明接口可以有安全的多继承了。

public interface A {
    public default void point(){
        System.out.println("A");
    }
}

interface B extends A{
    public default void point(){
        System.out.println("B");
    }
}
interface C extends A{
    public default void point(){
        System.out.println("C");
    }
}
interface D extends B,C{
    public void point();
}
interface E extends B,C{
    public default void point(){
        System.out.println("E");
    }
}

本人是Android开发的,偶尔会看看Java的书,正巧看到接口多继承这里意识到还不知道为什么,于是就有了这篇文章。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值