介面中的默認方法與靜態方法

在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牛逼!!"));
    }
}