對於接口我們都很熟悉,關於接口的的特性我們也是耳熟能詳
- 接口中的屬性默認使用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註解報錯。