Java還要再學一遍基礎(十五)
阿新 • • 發佈:2019-01-08
概述
初學Java的時候經常都能看到--Java類不能繼承多個類,但是可以實現多個介面。
學了一段時間之後突然發現:原來介面還能繼承介面。
再過一段時間可能終於發現:介面可以繼承多個介面!
其實也是在情理之中,因為Java不支援繼承多個類一定程度上是因為繼承多個類而多個類擁有相同的方法的問題。但是介面不一樣,一般來說接口裡都是抽象類,所以不存在類的具體實現,就算多繼承的時候有相同名字的方法也無所謂(JDK1.8中介面也可以有預設的的方法實現)
例項:
自定義的介面:可以看到介面確實可以多繼承。 那麼加入有相同名字的方法呢? 在MyInterface1裡面增加一個void method2():public class MutiInterfaceTest implements MyInterface{ @Override public void method1() { } @Override public void method2() { } @Override public void method3() { } } interface MyInterface1 { void method1(); } interface MyInterface2 { void method2(); } interface MyInterface extends MyInterface1, MyInterface2{ void method3(); }
public class MutiInterfaceTest implements MyInterface{ @Override public void method1() { } @Override public void method2() { } @Override public void method3() { } } interface MyInterface1 { void method1(); void method2(); } interface MyInterface2 { void method2(); } interface MyInterface extends MyInterface1, MyInterface2{ void method3(); }
編譯沒有報錯。說明可以有重複的方法(畢竟都沒有實現)。 那麼問題來了,在JDK1.8中使用default來定義同名的預設實現的方法: 當一個介面中定義預設實現的方法而另一個介面中還是抽象方法會怎麼樣?(直接使用預設實現還是編譯報錯?) 當兩個介面中都定義了同名的預設實現方法會怎麼樣? 測試: 第一種情況,MyInterface1中使用default實現一個method方法,MyInterface2中則為抽象方法:
這個時候編譯器報錯:interface MyInterface1 { default void method() { System.out.println("MyInterface1 method2 run"); }; } interface MyInterface2 { void method(); } interface MyInterface extends MyInterface1, MyInterface2{ }
很明顯錯誤資訊說的是有衝突。 再看看Eclipse給的解決方案:
第一種方案是說在MyInterface2中實現method。 點選之後生成的程式碼:
interface MyInterface extends MyInterface1, MyInterface2{
@Override
default void method() {
}
}
很直接,就是全都覆蓋掉,重新實現。
第二種方案:
interface MyInterface extends MyInterface1, MyInterface2{
@Override
default void method() {
MyInterface1.super.method();
}
}
通過MyInterface1.super.method();直接使用MyInterface中已經實現了的method方法。
例項測試:
public class MutiInterfaceTest implements MyInterface {
public static void main(String[] args) {
new MutiInterfaceTest().method();
}
}
interface MyInterface1 {
default void method() {
System.out.println("MyInterface1 method run");
};
}
interface MyInterface2 {
void method();
}
interface MyInterface extends MyInterface1, MyInterface2{
@Override
default void method() {
MyInterface1.super.method();
}
}
輸出:
MyInterface1 method2 run
再看當兩個介面都有預設實現的情況:
interface MyInterface1 {
default void method() {
System.out.println("MyInterface1 method run");
};
}
interface MyInterface2 {
default void method() {
System.out.println("MyInterface2 method run");
};
}
interface MyInterface extends MyInterface1, MyInterface2{
}
編譯器報錯:
雖然錯誤資訊不一樣了,但是意思基本是一個意思,就是說有重複名字的預設方法實現 同樣下面的方案很明顯也是讓我們可以二選一的意思 選擇第一個:
interface MyInterface extends MyInterface1, MyInterface2{
@Override
default void method() {
MyInterface1.super.method();
}
}
跟前面一樣,同樣我們也可以隨意的修改這個方法體內部的實現。
小結
- Java中的介面可以繼承多個介面
- 被繼承的介面中有同名方法:
都是抽象方法:沒有任何問題。其中包含了default修飾的方法(JDK1.8特性):必須在子介面中重寫該方法,同時可以通過MyInterface1.super.method();的方式呼叫預設實現。其中如果有static方法:static方法單獨存在。可以重名。