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