Java8新特性之介面預設方法
JAVA8 已經發布很久,而且毫無疑問,java8 是自 java5(2004年釋出)之後的最重要的版本。其中包括語言、編譯器、庫、工具和 JVM 等諸多方面的新特性。Java8 新特性列表如下:
- 介面預設方法
- 函式式介面
- Lambda 表示式
- 方法引用
- Stream
- Optional 類
- Date API
- Base64
- 重複註解與型別註解
介面預設方法
1、什麼是介面預設方法
從 Java8 開始,程式允許在介面中包含帶有具體實現的方法,使用 default 修飾,這類方法就是預設方法。預設方法在介面中可以新增多個,並且 Java8 提供了很多對應的介面預設方法。
2、設計介面預設方法好處
使用介面程式設計的好處是的開發是面向抽象而不再是面向具體來程式設計,使得程式變得很靈活,缺陷是,當需要修改介面時候,此時對應需要修改全部實現該介面的類,舉個例子, java 8 之前對於我們常用的集合框架沒有 foreach 方法,通常能想到的解決辦法是在 JDK 裡給相關的介面新增新的方法及實現。從 Java8 開始,引入了介面預設方法,這樣的好處也是很明顯的,首先解決了 Java8 以前版本介面相容性問題,同時對於我們以後的程式開發,也可以在介面子類中直接使用介面預設方法,而不再需要再各個子類中各自實現響應介面方法。
3、預設方法
jdk8 中,介面可以包含實現方法,需要使用 default 修飾,此類方法稱為預設方法。預設方法在介面中必須提供實現,在實現類中可以按需重寫。預設方法只能在實現類中或通過實現類物件呼叫。注意:當多個父介面中存在相同的預設方法時,子類中以就近原則繼承。
public interface IMathOperation {
/**
* 定義介面預設方法 支援方法形參
*/
default void print(){
System.out.println("這是數值運算基本介面。。。");
}
}
4、靜態方法
靜態方法即通過 static 修飾的方法。介面中靜態方法頁也必須實現,提供了可以直接通過介面呼叫方法的方式。
public interface IMathOperation { /** * 定義介面預設方法 支援方法形參 */ default void print(){ System.out.println("這是數值運算基本介面。。。"); } /** * 定義靜態預設方法 */ static void version(){ System.out.println("這是1.0版簡易計算器"); } }
5、介面預設方法使用
- 定義 IMathOperation 介面並提供預設列印方法
public interface IMathOperation {
/**
* 定義介面預設方法 支援方法形參
*/
default void print(){
System.out.println("這是數值運算基本介面。。。");
}
/**
* 定義靜態預設方法
*/
static void version(){
System.out.println("這是1.0版簡易計算器");
}
/**
* 整數加法運算方法
* @param a
* @param b
* @return
*/
public int add(int a,int b);
}
- 子類實現
定義 MathOperationImpl 子類 實現 IMathOperation 介面
這裡可以看到,在實現 IMathOperation 介面時可以選擇實現(也可以不實現 ,在子類方法中直接使用)介面預設方法。
public class MathOperationImpl implements IMathOperation {
@Override
public int add(int a, int b) {
// 子類中可以直接呼叫父類介面預設方法
IMathOperation.super.print();
// 呼叫父類靜態預設方法
IMathOperation.version();
return a+b;
}
}
最全的學習資料 → 衛星:lezijie007(暗號:66)
多個預設方法情況
使用 Java8 開發應用程式是,子類實現多個介面時,對於介面預設方法定義可能會出現多個預設方法,並且介面預設方法可能會出現同名情況,此時對於子類在實現或者呼叫時通常遵循三條原則:
1、類中的方法優先順序最高
2、如果第一條無法進行判斷,那麼子介面的優先順序更高:函式簽名相同時,優先選擇擁有最具體實現的預設方法的介面,即如果B繼承了A,那麼B就比A更加具體
3、如果還是無法判斷,繼承了多個介面的類必須通過顯示覆蓋和呼叫期望的方法,顯示地選擇使用哪一個預設方法的實現
示例程式碼如下:
/**
* 定義手機介面 提供預設info方法
*/
public interface Phone {
default void info(){
System.out.println("這是一部手機");
}
}
/**
* 定義MiPhone子介面 並繼承 Phone 父介面 同時也提供info方法
*/
public interface MiPhone extends Phone{
default void info(){
System.out.println("這是一部小米手機");
}
}
/**
* 實現 Phone MiPhone 介面
*/
public class M2sPhone implements Phone,MiPhone {
public static void main(String[] args) {
new M2sPhone().info();
}
}
列印結果:
這是一部小米手機
Phone 介面
*/
public class M2sPhone implements Phone,MiPhone {
public static void main(String[] args) {
new M2sPhone().info();
}
}
列印結果:
這是一部小米手機
jdk8 已經發布很久了,而且毫無疑問,java8 是自 java5(2004年釋出)之後的最重要的版本。其中包括語言、編譯器、庫、工具和 JVM 等諸多方面的新特性。