1. 程式人生 > >java 多重繼承

java 多重繼承

介面不僅僅只是一種更純粹形式的抽象類,它的目標比這更高,因為介面是根本沒有任何具體實現的--也就是說,沒有任何與介面相關的儲存,因此也就無法阻止多個介面的組合,

在匯出類中,不強制要求必須有一個抽象的或"具體的"(沒有任何抽象方法的)基類,如果要從一個非介面的類繼承,那麼只能從一個類去繼承,其餘的元素必須是介面.需要將所有的介面名都置於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 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 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);
  }
} ///:~