JAVA多繼承例子


我們知道Java語言中一個類只能繼承一個父類,但是一個類可以實現多個接口。隨着默認方 法在Java 8中引入,有可能出現一個類繼承了多個方法而它們使用的卻是同樣的函數簽名。這種 情況下,類會選擇使用哪一個函數?在實際情況中,像這樣的沖突可能極少發生,但是一旦發生 這樣的狀況,必須要有一套規則來確定按照什么樣的約定處理這些沖突。這一節中,我們會介紹 Java編譯器如何解決這種潛在的沖突。我們試圖回答像“接下來的代碼中,哪一個hello方法是 被C類調用的”這樣的問題。注意,接下來的例子主要用於說明容易出問題的場景,並不表示這
些場景在實際開發過程中會經常發生。

public interface A {
    default public void hello(){
        System.out.println( "我是接口A");
    }
}
public interface B  extends A{
    @Override
    default public void hello(){
        System.out.println( "我是接口B");
    }
}
public class C implements A,B {
    public static void main(String... args) { 
        new C().hello();
    }
}

  

 上面會輸出什么?

輸出是  接口B

說如果類或者父類沒有對應的方法,那么就應 該選擇提供了最具體實現的接口中的方法。因此,編譯器會在接口A和接口B的hello方法之間做
選擇。由於B更加具體,所以程序會再次打印輸出接口B  運用了下面規則的(2)

現在我們在加一個類 D  

public class D implements A {
    @Override
    public void hello(){
        System.out.println("我是 D");
    }
}

  並對接口c做一些更改  讓C 繼承D

public class C extends D implements A,B {
    public static void main(String... args) {
        new C().hello();
    }
}

  現在輸出的內容是什么

 

答案是 接口D

由於依據規則(1),父類中聲明的方法具有更高的優先級,所以程序會打印輸出“Hello from D”。

 

 

總結

解決問題的三條規則 如果一個類使用相同的函數簽名從多個地方(比如另一個類或接口)繼承了方法,通過三條
規則可以進行判斷。

(1) 類中的方法優先級最高。類或父類中聲明的方法的優先級高於任何聲明為默認方法的優
先級。

(2) 如果無法依據第一條進行判斷,那么子接口的優先級更高:函數簽名相同時,優先選擇
擁有最具體實現的默認方法的接口,即如果B繼承了A,那么B就比A更加具體。
(3) 最后,如果還是無法判斷,繼承了多個接口的類必須通過顯式覆蓋和調用期望的方法,

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM