1. 程式人生 > >java8--介面增強(預設方法、靜態方法)

java8--介面增強(預設方法、靜態方法)

Java8中介面增強:介面靜態方法、介面預設方法。

 

一、介面靜態方法

在介面方法前新增static 修飾符,表示介面中的靜態方法。介面靜態方法不要求子類實現、重寫,且子類也無法實現和重寫,

因為靜態的東西脫離了物件而存在於類中。 子類繼承和實現的是父類\介面的非靜態抽象方法。

介面中新增靜態方法,能夠增強介面的功能,而對所有子類、子介面無影響 。如

public interface MC{

 

static  max(int a ,int b){

  return a>b?a:b;

}

 

}

 

二、介面預設方法

預設方法允許介面方法定義預設實現,子類中無須實現此方法而就可以擁有該方法及實現。如下:

public interface DefaultFuncInter {
    int getInt();
    default String getString(){
        return "Default String";
    }
}
預設方法主要優勢是提供了一種擴充套件介面的方法,而不破壞現有程式碼。如果一個已經投入使用的介面需要擴充套件一個新的方法,在JDK8以前,我們必須再該介面的所有實現類中都新增該方法的實現,否則編譯會出錯。如果實現類數量很少且我們有修改的許可權,可能工作量會少,但是如果實現類很多或者我們沒有修改程式碼的許可權,這樣的話就很難解決了。而預設方法提供了一個實現,當沒有顯式提供時就預設採用這個實現,這樣新新增的介面就不會破壞現有的程式碼。預設方法另一個優勢是該方法是可選的,子類可以根據自身的需求可重寫(override)父類\介面的實現。

 

再看下面一個例子 :

public class DefaultMethodTest {

public static void main(String[] args) {
 A    a=new C();
 a.hi();
 a.print();
}

}

interface  A{


default void print() {
System.out.println("i am A ");
}
default   void hi() {
System.out.println("hi i am A");
}
}


interface  B{
default void print() {
System.out.println("i am B ");
}
}

class  C implements A,B {

@Override
public void print() {
A.super.print();

}
}

 

C類 implements 了A、B兩個介面,而A、B兩個介面中都定義了print的預設方法,則在子類C中必須重寫這個預設方法。