Java介面繼承

介面可以從另一個介面繼承。與類不同,介面可以繼承多個介面。如下代碼所示 -

interface Singer {
  void sing();
  void setRate(double rate);
  double getRate();
}
interface Writer {
  void write();
  void setRate(double rate);
  double getRate();
}
interface Player {
  void play();
  void setRate(double rate);
  default double getRate() {
    return 300.0;
  }
}

一個介面使用關鍵字extends來繼承自其他介面。 關鍵字extends之後是以逗號分隔的繼承介面名稱列表。繼承的介面稱為超級介面,繼承介面的介面稱為子介面。

介面繼承其超級介面的以下成員:

  • 抽象和默認方法
  • 常量字段
  • 嵌套類型

介面不從其超級介面繼承靜態方法。介面可以重寫它從其超級介面繼承的繼承的抽象和默認方法。如果超級介面和子介面具有相同名稱的字段和嵌套類型,則子介面會覆蓋父介面對應字段。

interface A {
  String s = "A";
}
interface B extends A {
  String s = "B";
}
public class Main {
  public static void main(String[] argv){
    System.out.println(B.s);
  }
}

以下代碼顯示如何覆蓋父介面的默認方法。

interface A {
  default String getValue(){
    return "A-Interface";
  }
}
interface B extends A {
  default String getValue(){
    return "B-Interface";
  }
}

class MyClass implements B{
}

public class Main {
  public static void main(String[] argv){
    System.out.println(new MyClass().getValue());
  }
}

上面的代碼生成以下結果。

B-Interface

繼承衝突實現

引入默認方法使得類可以從其超類和超級介面繼承衝突的實現。Java使用三個簡單的規則為了解決衝突。如下 -

  1. 總是以超介面的為准
  2. 最具體的以超介面為准
  3. 類必須覆蓋衝突的方法

instanceof運算符

可以使用instanceof運算符來評估計算引用類型變數是指特定類的對象,還是其類實現特定介面。instanceof運算符的一般語法是 -

referenceVariable instanceof  ReferenceType

參考以下實現代碼 -

interface A {//  ww  w. j  a  va 2  s.  co  m
  default String getValue(){
    return "A";
  }
}
interface B {
  default String getValue(){
    return "B";
  }
}

class MyClass implements B,A{
  public String getValue(){
    return "B";
  }
}

public class Main {
  public static void main(String[] argv){
    MyClass myClass = new MyClass();
    System.out.println(myClass instanceof MyClass);
    System.out.println(myClass instanceof A);
    System.out.println(myClass instanceof B);
  }
}

上面的代碼生成以下結果。

true
true
true

上一篇: Java介面實現 下一篇: Java枚舉類型