接口中的方法可以有方法體了?靜態方法可以寫在接口中?來看Java1.8新特性!

對於接口我們都很熟悉,關於接口的的特性我們也是耳熟能詳

  • 接口中的屬性默認使用public static final 修飾
  • 接口中的方法默認使用public abstract 修飾
  • 接口可以多繼承

但是在java8中,由於Lamada表達式的出現,接口這一類出現了巨大的變化

首先由於Lamada表達式的出現,一些接口中多出了很多要適應它的方法,這樣就會導致從前實現這些接口的實現類都需要重寫,爲了更加方便的解決這一問題,java8在接口中添加了default修飾的默認方法。這個方法的聲明方式如下:

  public interface Note{

    public abstract void print();

    default void dprint(){
        System.out.println("接口中的默認方法");
    }

}

注意:由於這個方法時普通方法,所以不能加abstarct修飾

這個方法默認存在接口中,實現類可以不必重寫,當使用接口的對象調用的時候,會直接調用接口中的這個方法

public class Realize implements Note {

    @Override
    public void print() {
        System.out.println("實現類中的方法");
    }

}
public class Test {

    public static void main(String[] args) {
        Note n = new Realize();       
        n.print();//會輸出實現類的方法
        n.dprint();//會輸出接口中的方法
    }
}

 運行結果:

實現類中的方法
接口中的默認方法

default修飾的默認方法重寫和其他抽象方法重寫的方式相同

public class Realize implements Note {

    @Override
    public void print() {
        System.out.println("實現類中的方法");
    }

    @Override
    public void dprint(){
        System.out.println("實現類中重寫的默認方法");
    }

}

繼續運行Test.main()方法,結果爲:

實現類中的方法
實現類中重寫的默認方法

同時,java8中,接口中也可以定義靜態方法

public interface Note{

    static void method(){
        System.out.println("接口中的靜態方法");
    }

    public abstract void print();

    default void dprint(){
        System.out.println("接口中的默認方法");
    }
}

但是靜態方法的重寫是無意義的,這一點就不必贅述了

即使實現類中重寫了接口的靜態方法,當接口對象指向實現類時,接口對象調用的仍然是自己的靜態方法,而不是實現類的

無法構成多態的重寫,也就沒有必要重寫了

 


public class Realize implements Note {

    @Override
    public void print() {
        System.out.println("實現類中的方法");
    }

//    @Override    //寫與接口同名的靜態方法,編譯器不認爲是重寫,加Override註解報錯
    public static void method(){
        System.out.println("123");

    }

    @Override
    public void dprint(){
        System.out.println("實現類中重寫的默認方法");
    }
}
public class Test {

    public static void main(String[] args) {

        Note n = new Realize();
        //接口指向實現類,與父引用指向子類類似
        n.print();//會輸出實現類的方法
        //接口中的靜態方法,可以直接通過接口調用
        Note.method();
        n.dprint();
    }
}

結果爲:

實現類中的方法
接口中的靜態方法
實現類中重寫的默認方法

注意: 寫與接口同名的靜態方法,編譯器不認爲是重寫,加Override註解報錯。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章