Java中的多重繼承

       接口不僅僅只是一種更純粹形式的抽象類,它具有更高的目標,接口沒有具體的實現,沒友任何與接口有關的存儲,這樣可以使用接口去進行組合,完成一些功能:一個x可以完成a、可以完成b、同時可以完成c。在C++中組合多個類接口的行爲稱之爲多重繼承。它可能會是你背上沉重的包袱,因爲每一個類都有一個具體的實現。在Java中,你可以執行相同的行爲,但是隻有一個類可以有具體的實現,因此通過組合多個接口,C++ 的問題不會在Java中發生:

       在導出類中,不強制要求必須有一個是抽象的的或“具體的”基類。

       如果要從一個非接口的類繼承,那麼只能從一個類繼承。其餘的元素必須都是接口。需要將所有的接口名置於implements 關鍵詞之後,用逗號將他們一一分割開來。可以繼承任意多個接口,並且向上轉型爲每個接口,因爲每個接口都是一個獨立的類型。

      下面是一個具體類組合多個接口之後產生一個新類的例子:

interface  CanFight{

    void fight();

}

interface CanSwim{

    void swim();

}

interface Canfly{

    void fly();

}

class ActionCharacter{

    public void fight(){}

}

class Hero extends ActionCharacter

    implements CanFight,CanSwim,Canfly{

    public void swim() {}

    public void fly() {}

}

public class Adventure {

    public static void t(CanFight x){x.fight();}

    public static void u(CanSwim u){u.swim();}

    public static void v(Canfly v){v.fly();}

    public static void w(ActionCharacter x){x.fight();}



    public static void main(String[] args) {

        Hero h = new Hero();

        t(h); // Treat it as a CanFight

        u(h); // Treat it as a CanSwim

        v(h); // Treat it as a CanFly

        w(h); // Treat it as a ActionCharacter

    }

}

        可以看到,Hero組合了具體類ActionCharacter和接口CanFight、CanSwim、CanFly 。當通過這種方式將一個具體類和多個接口組合在一起的時候,這個具體類必須放在前面,後面再緊跟接口,否則會編譯報錯。

        注意:CanFight接口和ActionCharacter類中的fight()方法的特徵簽名是一樣的的,而且在Hero中並沒有提供fight()的定義。可以擴展接口,但是得到的只是另一個接口。當想要創建對象的時候,所有的定義都必須存在。即使Hero沒有顯式的提供fight()的定義,其定義也隨着ActionCharacter而來,這樣就使得創建對象成爲可能。

        在Adventure類中,可以看到有四個方法把上述各種接口和具體類作爲參數。當Hero對象被創建的時候,它可以被傳遞給這些方法中的任意一個,這意味着它依次被向上轉型爲每一個接口。

發佈了124 篇原創文章 · 獲贊 224 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章