傻大方


首页 > 人文 >

Java|为什么Java类不支持多继承而接口可以?



按关键词阅读:

每个用Java的人都知道java不支持多继承,但为什么呢?无论从抽象还是多态等层面思考,感觉都是行得通的,那么为什么不支持呢?
 Java|为什么Java类不支持多继承而接口可以?
文章图片
很多人都是分析一旦一个类继承了多个父类,那么父类中如果有相同的成员变量和方法,就不好处理,如下图,这就是Diamond问题
GrandParent f()/\/\Parent1 f()Parent2 f()\/\/Son f()那么此时子类如果我们只引用 f(),编译器将无法决定它应该调用哪个 f()方法,但此说明不足以让人信服,比如可以强制要求子类必须覆写f()方法。
Java之父,James Gosling在1995年的一份白皮书中给出了关于为什么不支持多继承
JAVA omits many rarely used, poorly understood, confusing features of C++ that in our experience bring more grief than bene?t. This primarily consists of operator overloading (although it does have method overloading), multiple inheritance, and extensive automatic coercions.
主要就是说,Gosling认为,多继承是一种很少使用,并且很容易混淆的特性,所以Java语言就像删除操作符重载特性一样删除了多继承这种特性。
也就是说java为了便于程序员理解和使用,去除了一些不容易理解的特性,例如类的多继承。并非不能实现。
那为什么接口可以呢?
针对于Diamond(钻石)问题,接口由于本身都是抽象方法,继承谁都无所谓,都是需要其实现类去实现的,故不存在此问题。
此时有人问了,jdk1.8以后,java接口被赋予了一个新的功能,可以通过default关键字定义非抽象方法,那如果出现一个接口继承的父接口有相同的非抽象方法怎么办呢?
下面我们看看jdk1.8中如何处理
public interface Aservice {void say();default void bye(){System.out.println("a service say bye");}}public interface Bservice {void say();default void bye(){System.out.println("b service say bye");}}此时我们定义接口去继承,如下图,发现被强制要求覆写相同的非抽象方法,以保证编译器知道具体执行哪个方法。
 Java|为什么Java类不支持多继承而接口可以?
文章图片
【 Java|为什么Java类不支持多继承而接口可以?】因此接口是可以的多继承的,即使jdk1.8中添加了非抽象方法。


    来源:(行走自由的花)

    【】网址:/a/2020/0930/kd545231.html

    标题: Java|为什么Java类不支持多继承而接口可以?


    上一篇: 能力|英雄联盟S10: 欧美幻神的重聚,老牌豪门TSM

    下一篇: 余杭区|彩笔绘良渚 盛世颂华章,百名中外画家走进良渚古城


    人文

    4亿播放!央行旗下支付清算协会在抖音发起金融防赌话题获好评

    阅读(50)

    为提升宣传的互动感和参与感,7月20日,支付清算协会专门在抖音启动打击跨境赌博相关短视频征集和宣传活动。并在抖音发起上述话题,携金融机构、支付机构和清算机构以及网民,一起普及防网络赌博的知识。目前,话题播放量已近4亿,引起网友广泛好评。据了解,...

    人文

    喜点多|长期不工作的人和正常上班的人有什么区别?

    阅读(13)

    上班会身心疲惫,不上班会焦虑不安。我发现身边上班的人越来越少了!有一种人非常相信,到什么年龄做什么事情,她们选择了生娃,带孩子,再生娃,带两个孩子,4年间,完成了自己儿女双全的人生大事;还有一种人上班上久了,觉得没有“奔头”了,自己开始折腾...