日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

每個用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類不支持多繼承而接口可以?

 

因此接口是可以的多繼承的,即使jdk1.8中添加了非抽象方法。

分享到:
標簽:Java
  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定