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中必須重寫這個預設方法。