Java 8 之前,介面里面只能寫抽象方法,不能寫實作方法
Java 8 開始是可以有方法實作的,可以在介面中添加默認方法和靜態方法
默認方法用 default 修飾,只能用在介面中,靜態方法用 static 修飾,并且介面中的默認方法、靜態方法可以同時有多個,
為什么要用介面默認方法
舉一個很現實的例子:
我們的介面老早就寫好了,后面因為各種業務問題,避免不了要修改介面,
在 Java 8 之前,比如要在一個介面中添加一個抽象方法,那所有的介面實作類都要去實作這個方法,不然就會編譯錯誤,
而某些實作類根本就不需要實作這個方法也被迫要寫一個空實作,改動會非常大,
所以,介面默認方法就是為了解決這個問題,只要在一個介面添加了一個默認方法,所有的實作類就自動繼承,不需要改動任何實作類,也不會影響業務;
另外,介面默認方法可以被介面實作類重寫,
為什么要有介面靜態方法?
介面靜態方法和默認方法類似,只是介面靜態方法不可以被介面實作類重寫,
介面靜態方法只可以直接通過靜態方法所在的 介面名.靜態方法名 來呼叫,
介面默認方法多繼承沖突問題
因為介面默認方法可以被繼承并重寫,如果繼承的多個介面都存在相同的默認方法,那就存在沖突問題,
沖突一
interface People {
default void eat() {
System.out.println("人吃飯,");
}
}
interface Man {
default void eat() {
System.out.println("男人吃飯,");
}
}
//Boy 同時繼承了 People 和 Man,此時在 IDEA 編輯器中就會報錯
interface Boy extends People, Man {
}
//這就是介面多繼承帶來的沖突問題,Boy 不知道該繼承誰的,
//這顯然也是個問題,IDEA 也會提示,需要重寫這個方法才能解決問題:
interface Boy extends People, Man {
@Override
default void eat() {
People.super.eat(); //在方法里面還能直接呼叫指定父介面的默認方法
Man.super.eat(); //在方法里面還能直接呼叫指定父介面的默認方法
System.out.println("男孩吃飯,");
}
}
用實作類測驗一下
class Student implements Boy {
public static void main(String[] args) {
Student student = new Student();
student.eat();
}
}
//result
//人吃飯,
//男人吃飯,
//男孩吃飯,
沖突二
我們再換一種寫法,把 Man 繼承 People,然后 Man 重寫 People 中的默認方法
此時,編輯器不報錯了,而 People 的默認方法置灰了,提示沒有被用到,
再運行一下上面的示例,輸出:
interface People {
default void eat() {
System.out.println("人吃飯,");
}
}
interface Man extends People{
default void eat() {
System.out.println("男人吃飯,");
}
}
interface Boy extends People, Man {
}
//result
//男人吃飯
因為 Man 繼承 People,Man 又重定了默認方法,很顯然,這個時候,Boy 知道該繼承誰的默認方法了,
注意,此時,如果用 People 通過 super 呼叫父類的 eat 方法會報錯,因為調不到了
interface Boy extends People, Man {
@Override
default void eat() {
People.super.eat(); //People報錯
System.out.println("男孩吃飯");
}
}
沖突三
在 Man 介面中新增一個方法:say,然后在 Boy 介面中新增一個默認方法:say,
interface Man extends People{
default void eat() {
System.out.println("男人吃飯,");
}
void say(); //IDEA提示,say方法變灰,沒有被使用
}
這時候,Man 中的抽象方法居然被忽略了,IDEA 都提示說沒用到,這顯然是默認方法優先于抽象方法,
總結
介紹了 Java 8 的默認方法和靜態方法,以及默認方法的沖突問題解決方案,
如果以后還說介面不能寫實作方法,那就太OUT了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/458425.html
標籤:Java
上一篇:各種鎖、volatile、synchronized、單例模式
下一篇:Java語言基礎
