默認(rèn)方法

默認(rèn)方法

聲明:java8新特性系列為個(gè)人學(xué)習(xí)筆記,參考地址點(diǎn)擊這里,侵刪??!

Java 8 新增了接口的默認(rèn)方法。

簡單說,默認(rèn)方法就是接口可以有實(shí)現(xiàn)方法,而且不需要實(shí)現(xiàn)類去實(shí)現(xiàn)其方法。

我們只需在方法名前面加個(gè) default 關(guān)鍵字即可實(shí)現(xiàn)默認(rèn)方法。

為什么要有這個(gè)特性?

首先,之前的接口是個(gè)雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當(dāng)需要修改接口時(shí)候,需要修改全部實(shí)現(xiàn)該接口的類,目前的 java 8 之前的集合框架沒有 foreach 方法,通常能想到的解決辦法是在JDK里給相關(guān)的接口添加新的方法及實(shí)現(xiàn)。然而,對(duì)于已經(jīng)發(fā)布的版本,是沒法在給接口添加新方法的同時(shí)不影響已有的實(shí)現(xiàn)。所以引進(jìn)的默認(rèn)方法。他們的目的是為了解決接口的修改與現(xiàn)有的實(shí)現(xiàn)不兼容的問題。

語法

默認(rèn)方法語法格式如下:

interface Computer {
    default void print(){
        System.out.println("我是一臺(tái)電腦!");
    }
}

多個(gè)默認(rèn)方法

一個(gè)接口可以有多個(gè)默認(rèn)方法,考慮這樣的情況,一個(gè)類實(shí)現(xiàn)了多個(gè)接口,且這些接口有相同的默認(rèn)方法,以下實(shí)例說明了這種情況的解決方法:

interface Computer {
    default void print(){
        System.out.println("我是一臺(tái)電腦!");
    }
}
interface LenovoComputer {
    default void print(){
        System.out.println("我是一臺(tái)聯(lián)想電腦");
    }
    default void printPrise(){
        System.out.println("我的售價(jià)是¥5000");
    }
}

如果一個(gè)類,實(shí)習(xí)了多個(gè)接口,且多個(gè)接口的默認(rèn)方法名相同,那么該類要重寫該默認(rèn)方法,也可以使用 super 來調(diào)用指定接口的默認(rèn)方法

class MyComputer implements LenovoComputer, Computer {
    
    @Override
    public void print() {
        LenovoComputer.super.print();
        Computer.super.print();
    }
    
}

interface Computer {
    default void print() {
        System.out.println("我是一臺(tái)電腦!");
    }
}

interface LenovoComputer {
    default void print() {
        System.out.println("我是一臺(tái)聯(lián)想電腦");
    }
    default void printPrise() {
        System.out.println("我的售價(jià)是¥5000");
    }
}

多重繼承的沖突說明:

由于同一個(gè)方法可以從不同接口引入,自然而然的會(huì)有沖突的現(xiàn)象,規(guī)則如下:

1)一個(gè)聲明在類里面的方法優(yōu)先于任何默認(rèn)方法

2)優(yōu)先選取最具體的實(shí)現(xiàn)

一個(gè)類實(shí)現(xiàn)一個(gè)接口時(shí),必須重寫其中一個(gè)默認(rèn)方法,否則編譯出錯(cuò)。

class MyComputer implements LenovoComputer{
    private void sayHello(){
        System.out.println("hello");
    }
    @Override
    public void printPrise() {
        LenovoComputer.super.printPrise();
    }
}

**默認(rèn)方法和抽象方法的區(qū)別: **是抽象方法必須要被實(shí)現(xiàn),默認(rèn)方法不是。作為替代方式,接口可以提供一個(gè)默認(rèn)的方法實(shí)現(xiàn),所有這個(gè)接口的實(shí)現(xiàn)類都會(huì)通過繼承得到這個(gè)方法(如果有需要也可以重寫這個(gè)方法)

靜態(tài)默認(rèn)方法

Java 8 的另一個(gè)特性是接口可以聲明(并且可以提供實(shí)現(xiàn))靜態(tài)方法。例如:

interface Computer {
    static void printName(){
        System.out.println("我沒起好名字");
    }
    default void print() {
        System.out.println("我是一臺(tái)電腦!");
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容