介面可以從另一個介面繼承。與類不同,介面可以繼承多個介面。如下程式碼所示 -
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使用三個簡單的規則為了解決衝突。如下 -
可以使用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