介面中的預設方法與靜態方法

糖油包子發表於2020-06-21

在Java8之前的版本中,介面中只能宣告常量和抽象方法,介面的實現類中必須實現介面中所有的抽象方法。而在Java8中,介面中可以宣告預設方法靜態方法。

介面中的預設方法

Java 8中允許介面中包含具有具體實現的方法,該方法稱為“預設方法”,預設方法使用“ default ”關鍵字修飾 。

示例:

public interface MyInterface {
    default String getMsg(String srcMsg){
        return "======"+srcMsg;
    }
}

介面中的預設方法,有一個“類優先”原則:

若一個介面中定義了一個預設方法,而另外一個父類或介面中又定義了同一個同名的方法時:

  • 選擇父類中的方法。如果一個父類提供了具體的實現,那麼介面中具有相同名稱的引數的預設方法會被忽略。
  • 介面衝突。如果一個父介面提供一個預設方法,而另一個介面中也提供了一個具有相同名稱和引數列表的方法(不管方法是否是預設方法),那麼必須覆蓋該方法來解決衝突。

示例1:

public interface MyInterface1 {
    default String getMsg(String srcMsg){
        return "===我是MyInterface1111111==="+srcMsg;
    }
}
///////////////////////////////////////////////////////
public class MyClass1 {
    public String getMsg(String srcMsg){
        return "===我是MyClass11111==="+srcMsg;
    }
}
///////////////////////////////////////////////////////
public class MySubClass1 extends MyClass1 implements MyInterface1 {
}

///////////////////////////////////////////////////////
public class InterfaceTest {

    public static void main(String[] args) {
        MySubClass1 ms1 = new MySubClass1();

        String srcMsg = "Java 牛逼!!";
        //MySubClass1 類繼承了 MyClass1 類,實現了MyInterface1 介面,根據類優先原則,呼叫同名方法時,會忽略掉介面 MyInterface1 中的預設方法。
        System.out.println(ms1.getMsg(srcMsg));//輸出結果:===我是MyClass11111===Java 牛逼!!

    }
}

示例2:

public interface MyInterface2 {
    default String getMsg(String srcMsg){
        return "===我是MyInterface2222222==="+srcMsg;
    }
}
////////////////////////////////////////////////////////////////
public class MySubClass2 implements MyInterface1,MyInterface2 {
    @Override
    public String getMsg(String srcMsg) {
        //同時實現了 MyInterface1,MyInterface2  介面,根據 類優先 原則,兩個父介面中都提供了相同的方法,那麼子類中就必須重寫這個方法來解決衝突。
        return MyInterface1.super.getMsg(srcMsg);
        //return MyInterface2.super.getMsg(srcMsg);
        //return "------"+srcMsg;
    }
}
////////////////////////////////////////////////////////////////
public class InterfaceTest {

    public static void main(String[] args) {
        MySubClass2 ms2 = new MySubClass2();

        //MySubClass2 重新實現了兩個父介面中都存在的相同名稱的方法。
        System.out.println(ms2.getMsg(srcMsg));//輸出結果:===我是MyInterface1111111===Java 牛逼!!
    }
}

 

介面中的靜態方法

在Java8中,介面中允許新增 靜態方法,使用方式:“介面名.方法名”

示例:

public interface MyInterface3 {
    static String getMsg(String msg){
        return "我是介面中的靜態方法:"+msg;
    }

    static void main(String[] args) {
        System.out.println(MyInterface3.getMsg("Java牛逼!!"));
    }
}

 

相關文章