亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當默認方法被子類的靜態方法覆蓋時,為什么 Java 8 編譯失???

當默認方法被子類的靜態方法覆蓋時,為什么 Java 8 編譯失?。?/h1>
慕工程0101907 2022-12-15 16:42:13
在 model.addRow(row) 之后有一個 break 語句:                // add row to the model                    model.addRow(row);                break; // breaks out of the while() { } loop.Break 將退出當前代碼塊(如果嵌套在多個 fors/whiles/dos 中則更多)。這意味著它在執行一次后完全停止并跳出 while 循環。刪除中斷;行并讓它運行不止一次
查看完整描述

3 回答

?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

Father這里不是問題,因為來自接口的靜態方法不是繼承的(例如List.of(..)不能通過調用ArrayList.of(..))所以沒有覆蓋/隱藏,這也意味著沒有沖突。


因此我們可以安全地寫


interface Father {

    static void method() { } 

}

interface Child extends Father {

    static void method() { } 

}

問題是繼承default void method() { }自接口的方法,這意味著之后MotherChild


interface Child extends Father, Mother { 

    static void method() { } 

}

你最終會得到有兩個method()版本的接口:靜態和非靜態(默認)


interface Child extends Father, Mother { 

    static void method() { } 

    default void method() { } //inherited from Mother

}

但為什么這是個問題?


假設您想向Child接口添加另一個方法,該方法將調用method()


interface Child extends Father, Mother { 

    static void method() { } 

    default void method() { } //inherited from Mother

    default void demo(){

        method(); //which code block should be executed?

    }

}

它應該從靜態方法() 還是從默認方法() 執行代碼?編譯器將無法決定。


雖然這種情況可以通過使用來解決


Child.method()對于靜態方法,

this.method()對于默認方法(是的,它不會有歧義,因為靜態方法不會this被實例化的類繼承),

重點是首先要防止此類問題。這就是為什么我們被要求不能在一個地方(定義或繼承)具有相同簽名(名稱+參數類型)的靜態和非靜態方法。


查看完整回答
反對 回復 2022-12-15
?
慕少森

TA貢獻2019條經驗 獲得超9個贊

這是一個有趣的情況。我認為簡單的答案是靜態方法從未被允許隱藏(它們不能覆蓋)基類中的非靜態方法。如果您static從 中刪除修飾符Father,那也會導致 Child 無法編譯。這可能是為了避免混淆。

所以默認方法只是遵循現有規則。

“但是等一下”,您可能會想,“添加默認方法的目的是明確允許庫開發人員在不破壞現有代碼的情況下將新功能引入舊接口。如果任何現有代碼具有名稱沖突的靜態方法 - 不會它壞了?”

其實我覺得不一定。IIRC,這是一個有意允許二進制兼容性和源兼容性不同的地方。我想你會發現如果:

  • interface Child(和使用它的東西)已經被編譯,而默認方法不存在于interface Mother, 和

  • 您稍后將默認方法添加到該源文件并interface Mother編譯該源文件。

然后我認為你最終會得到工作正常的代碼(在字節碼/JVM 級別)。但是,它會在您嘗試針對 interface Child更新的interface Mother.


查看完整回答
反對 回復 2022-12-15
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

我還找到了解釋更多案例的Oracle 教程。

基本上在這里你可以找到一個摘要(從教程中提?。?/p>

http://img1.sycdn.imooc.com//639ade28000157dc05570118.jpg

查看完整回答
反對 回復 2022-12-15
  • 3 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號