java8新特性系列(1、接口的默認方法)

在接口中新增了default方法和static方法,這兩種方法能夠有方法體 
一、static方法 
示例代碼:

public interface DefalutTest {
    static int a =5;
    default void defaultMethod(){
        System.out.println("DefalutTest defalut 方法");
    }
ide

    int sub(int a,int b);spa

    static void staticMethod() {
        System.out.println("DefalutTest static 方法");
    }
}
.net

接口裏的靜態方法,即static修飾的有方法體的方法不會被繼承或者實現,可是靜態變量會被繼承 code

例如:咱們添加一個接口DefalutTest的實現類DefaultTestImplorm

public class DefaultTestImpl implements DefalutTest{對象

    @Override
    public int sub(int a, int b) {
        // TODO Auto-generated method stub
        return a-b;
    }blog

}繼承

以下圖所示是這個實現類中全部可調用的方法: 
這裏寫圖片描述
在這些方法裏面咱們沒法找到staticMethod方法,則說明接口中的static方法不能被它的實現類直接使用。可是咱們看到了defaultMethod,說明實現類能夠直接調用接口中的default方法; 
那麼如何使用接口中的static方法呢??? 
接口.static方法調用,如:DefalutTest.staticMethod();接口

    public static void main(String[] args) {
        DefaultTestImpl dtl = new DefaultTestImpl();
        DefalutTest.staticMethod();
    }圖片

當咱們試圖使用接口的子接口去調用父接口的static方法是,咱們發現,沒法調用,找不到方法: 
這裏寫圖片描述

結論:接口中的static方法不能被繼承,也不能被實現類調用,只能被自身調用

二、default方法 
準備一個子接口繼承DefalutTest接口

public interface SubTest extends DefalutTest{

}

準備一個子接口的實現類

public class SubTestImp implements SubTest{

    @Override
    public int sub(int a, int b) {
        // TODO Auto-generated method stub
        return a-b;
    }

}
 

如今咱們建立一個子接口實現類對象,並調用對象中的default方法:

public class Main {

    public static void main(String[] args) {
        SubTestImp stl = new SubTestImp();
        stl.defaultMethod();

    }
}

執行結果: 
DefalutTest defalut 方法

結論1:default方法能夠被子接口繼承亦可被其實現類所調用

如今咱們在子接口中重寫default方法,在進行調用:

public interface SubTest extends DefalutTest{

    default void defaultMethod(){
        System.out.println("SubTest defalut 方法");
    }
}

執行結果:SubTest defalut 方法

結論2:default方法被繼承時,能夠被子接口覆寫

如今,咱們去除接口間的繼承關係,並使得SubTestImp同時實現父接口和子接口,咱們知道此時父接口和子接口中存在同名同參數的default方法,這會怎麼樣? 
以下圖所示,實現類報錯,實現類要求必須指定他要實現那個接口中的default方法 
這裏寫圖片描述

結論3:若是一個類實現了多個接口,且這些接口中無繼承關係,這些接口中如有相同的(同名,同參數)的default方法,則接口實現類會報錯,接口實現類必須經過特殊語法指定該實現類要實現那個接口的default方法 
特殊語法:<接口>.super.<方法名>([參數]) 
示例代碼:

public class SubTestImp implements SubTest,DefalutTest{

    @Override
    public int sub(int a, int b) {
        // TODO Auto-generated method stub
        return a-b;
    }

    @Override
    public void defaultMethod() {
        // TODO Auto-generated method stub
        DefalutTest.super.defaultMethod();
    }

}

使用示例:

//接口代碼
interface Formula {
    double calculate(int a);
    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}
//實現
Formula formula = new Formula() {
    @Override     public double calculate(int a) {         return sqrt(a * 100);     } }; formula.calculate(100);     // 100.0 formula.sqrt(16);           // 4.0

相關文章
相關標籤/搜索