java 多重繼承
阿新 • • 發佈:2019-01-02
介面不僅僅只是一種更純粹形式的抽象類,它的目標比這更高,因為介面是根本沒有任何具體實現的--也就是說,沒有任何與介面相關的儲存,因此也就無法阻止多個介面的組合,
在匯出類中,不強制要求必須有一個抽象的或"具體的"(沒有任何抽象方法的)基類,如果要從一個非介面的類繼承,那麼只能從一個類去繼承,其餘的元素必須是介面.需要將所有的介面名都置於implements關鍵字之後,用逗號將它們隔開.可以繼承任意多個介面,並可以向上轉型為每個介面,因為每個介面都是一個獨立型別
使用介面的核心原因:
1.為了能夠向上轉型為多個基型別(以及由此帶來的靈活性)
2.防止客服端程式設計師建立該類的物件,並且保證這僅僅是一個介面.這就帶來一個問題:我們應該使用介面還是抽象類?如果要建立不帶任何方法定義和成員變數的基類,那麼就應該選擇介面而不是抽象類,事實上,如果知道某事物應該成為一個基類,那麼第一選擇應該是使他稱為介面
//: interfaces/Adventure.java // Multiple interfaces. package object; interface CanFight { void fight(); //ActionCharacter 也有一個fight(); } interface CanSwim { void swim(); } interface CanFly { void fly(); } class ActionCharacter { public void fight() {} } class Hero extends ActionCharacterimplements 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 x) { x.swim(); } public static void v(CanFly x) { x.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 an ActionCharacter } } ///:~
二.通過繼承來擴充套件介面
通過繼承可以很容易在介面新增新的方法宣告,還可以通過繼承在新介面中組合數個介面
//: interfaces/HorrorShow.java // Extending an interface with inheritance. interface Monster { void menace(); } interface DangerousMonster extends Monster { void destroy(); } interface Lethal { void kill(); } class DragonZilla implements DangerousMonster { public void menace() {} public void destroy() {} } interface Vampire extends DangerousMonster, Lethal {//多繼承只適用於介面繼承 void drinkBlood(); } class VeryBadVampire implements Vampire { public void menace() {} public void destroy() {} public void kill() {} public void drinkBlood() {} } public class HorrorShow { static void u(Monster b) { b.menace(); } static void v(DangerousMonster d) { d.menace(); d.destroy(); } static void w(Lethal l) { l.kill(); } public static void main(String[] args) { DangerousMonster barney = new DragonZilla(); u(barney); v(barney); Vampire vlad = new VeryBadVampire(); u(vlad); v(vlad); w(vlad); } } ///:~