Java是单继承的?

Java是单继承的?

Java的什么是单继承的?

类?

接口?

不骗你,我之前确实知道Java是单继承的,但是我以为类和接口都是单继承的!
直到一个偶然间我在翻看RedisTemplate相关源码的时候,看到了这个:

public interface RedisCommands extends RedisKeyCommands, RedisStringCommands, RedisListCommands, RedisSetCommands, RedisZSetCommands, RedisHashCommands, RedisTxCommands, RedisPubSubCommands, RedisConnectionCommands, RedisServerCommands, RedisStreamCommands, RedisScriptingCommands, RedisGeoCommands, RedisHyperLogLogCommands {
    @Nullable
    Object execute(String var1, byte[]... var2);
}

当时简直打碎了我的三观。

这代码写的不对吧,Java不是单继承的么?可他怎么能继承这么多接口。

后来,经过翻阅大量资料(说到底就是问度娘呗),终于确认了:Java是单继承的不假,但指的是类是单继承的,而接口是多继承、多实现的。

为什么Java类是单继承的?

为什么Java类要设计成单继承的呢?我给他多继承行不行?

为了验证类的多继承的可行性,我们来写个demo来验证下。

class Father{

    void sleep(){
        System.out.println("凌晨一点睡觉。。。");
    }
}

class Mother{
    
    void sleep(){
        System.out.println("晚上十一点准时睡觉。。。");
    }
}

// 伪代码
class Son extends Father,Mother{

}

假设Father和Mother都有一个sleep方法。

然后Son要继承Father和Mother。

那么Son到底是要继承Father的sleep方法呢,还是继承Mother的sleep方法呢?

继承哪个父类的sleep方法都不合理!这也就是Java类只能单继承的原因。

为什么Java接口可以多继承?

Java接口多继承就没有问题?

我们继续写个demo看看有没有问题:

interface IFather{
    void sleep();
}

interface IMother{
    void sleep();
}

interface ISon extends IFather,IMother{
    
}

假设IFather和IMother都有一个sleep方法。

然后ISon要继承IFather和IMother。

那么Son到底是要继承Father的sleep方法呢,还是继承Mother的sleep方法呢?

不重要,不管是哪个sleep方法,都需要通过Son的实现类去实现sleep这个方法。

所以接口的多继承就是没问题的。

接口的默认方法怎么多继承?

接口的多继承真的没有问题吗?那JDK8之后加入的默认方法也可以多继承吗?

我们继续用代码看下:

interface IFather{

    default void getUp(){
        System.out.println("九点起床上班。。。");
    }

    void sleep();
}

interface IMother{

    default void getUp(){
        System.out.println("睡到十二点才想起起床。。。");
    }
    
    void sleep();
}

这时候IFather和IMother都新增了一个默认方法getUp

那么ISon该怎样同时继承他们呢?

interface ISon extends IFather,IMother{

    @Override
    default void getUp() {
        System.out.println("八点起床上学");
    }
}

是的,你没有看错,直接重写getUp默认方法就好啦

嗯……好像是这样,那Java接口的多继承没问题了。

为什么Java的多继承问题不能通过重写方法来解决呢?

但是,既然Java接口的默认方法可以通过重写来解决多继承问题,那么为什么Java的多继承问题不能通过重写方法来解决呢?

继续上面的例子,如果重写方法的话应该是这样:

// 伪代码
class Son extends Father,Mother{
    void sleep(){
        System.out.println("晚上九点准时睡觉。。。");
    }
}

这种方式肯定是不行的。

可能这时候有人会有疑问了。

Java类的多继承问题不能用重写方法来解决,为什么Java接口的默认方法却能用重写来解决呢?

我们首先得明白:

普通类和接口的区别(只论述和本文相关特点,不细聊)

Java在设计的时候,
类更侧重于描述对象的特征和功能,是具象的东西。

而接口则更偏向于定义一套规范,是个抽象的东西。

类在继承的时候,就是想拥有父类的特征和功能,这时候你如果进行重写,就会失去父类的特性和功能,也就失去了意义;

而接口在继承的时候,是想拥有父接口定义的规范,而默认方法更多的是描述本接口的特有功能,所以在继承的时候重写默认方法更加符合Java对于接口的定义。

总结

到此,我们了解到:

Java类是单继承的

Java接口是多继承的

默认方法的多继承可以通过重写来解决

重写并不能作为Java多继承问题的解决方案

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值