溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java8接口中引入default關(guān)鍵字的本質(zhì)原因是什么

發(fā)布時(shí)間:2022-01-06 12:56:25 來(lái)源:億速云 閱讀:166 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

Java8接口中引入default關(guān)鍵字的本質(zhì)原因是什么,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

接口的常規(guī)實(shí)現(xiàn)方式

熟悉java接口的同學(xué)都知道,接口被某些類實(shí)現(xiàn)后,一旦在接口中增加了新方法,那么實(shí)現(xiàn)該接口的所有類都要實(shí)現(xiàn)這個(gè)新增的方法(即使這個(gè)新增的接口對(duì)某些類沒(méi)有用處)。

定義一個(gè)接口

public interface IDemo {
    void func1();
}

類CDemo1實(shí)現(xiàn)接口IDemo

public class CDemo1 implements IDemo{
    @Override
    public void func1() {
    }
}

類CDemo2實(shí)現(xiàn)接口IDemo

public class CDemo2 implements IDemo{
    @Override
    public void func1() {
    }
}

在IDemo中新增加方法func2()

public interface IDemo {
    void func1();
    void func2();
}

可以看到CDemo1和CDemo2中需要強(qiáng)制實(shí)現(xiàn)方法func2(),如下圖所示:

Java8接口中引入default關(guān)鍵字的本質(zhì)原因是什么

接口中的default

上面的實(shí)例導(dǎo)致了前面提出的那個(gè)問(wèn)題,一旦在接口中增加了新方法,那么已經(jīng)實(shí)現(xiàn)了該接口的所有的類都要實(shí)現(xiàn)這個(gè)新增的方法!那么,如果是JDK中的某個(gè)核心接口需要變更,需要新增某些方法呢?這個(gè)工作量更是可想而知,我們來(lái)看一下java.util.Collection這個(gè)接口,它在jdk1.7中的方法包括:

Java8接口中引入default關(guān)鍵字的本質(zhì)原因是什么

而在JDk 1.8中 Collection接口中包括方法如下:

Java8接口中引入default關(guān)鍵字的本質(zhì)原因是什么

其中新增的接口,都用default來(lái)修飾(jdk1.7升級(jí)到j(luò)dk1.8后,接口的重要變化),源代碼如下:

default Stream<E> stream() {
 return StreamSupport.stream(spliterator(), false);
}

default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
}

default Spliterator<E> spliterator() {
    return Spliterators.spliterator(this, 0);
}

default boolean removeIf(Predicate<? super E> filter) {
    Objects.requireNonNull(filter);
    boolean removed = false;
    final Iterator<E> each = iterator();
    while (each.hasNext()) {
        if (filter.test(each.next())) {
            each.remove();
            removed = true;
        }
    }
    return removed;
}

我們不僅大吃一驚,這還是我們熟知的接口嗎?接口中的方法居然有了實(shí)現(xiàn)代碼!吃驚過(guò)后,我們來(lái)想想作者的意圖。還是上面的代碼,我們新增方法func3(),并完成簡(jiǎn)單的實(shí)現(xiàn)

public interface IDemo {
    void func1();
    void func2();
    default void func3(){
        System.out.println("this is default func2");
    }
}

然后查看類CDemo1,一切正常,沒(méi)有任何錯(cuò)誤提示:

Java8接口中引入default關(guān)鍵字的本質(zhì)原因是什么

實(shí)例化CDemo1后,可以正常調(diào)用func3方法,代碼如下:

public static void main(String[] args) {
    CDemo1 cd1=new CDemo1();
    cd1.func3();
}

讀到這里發(fā)現(xiàn)接口中通過(guò)default關(guān)鍵字來(lái)進(jìn)行接口實(shí)現(xiàn)的好處了吧,簡(jiǎn)單四個(gè)字就是 “方便擴(kuò)展” !通過(guò)這個(gè)技術(shù)可以做到在接口中新增加方法并且不會(huì)影響到已經(jīng)實(shí)現(xiàn)了該接口的所有的類!包括jdk1.8新引入的Lambda表達(dá)式也是基于這一知識(shí)點(diǎn)來(lái)實(shí)現(xiàn)的!

接口中的static

與此同時(shí),從jdk1.8開(kāi)始,接口中可以通過(guò)static關(guān)鍵字來(lái)修飾方法,同樣可以對(duì)方法進(jìn)行實(shí)現(xiàn)

static  void func4(){
    System.out.println("this is static func4");
}

調(diào)用方法也非常的簡(jiǎn)單,接口.static 方法,例如:

IDemo.func4();

大家可以這樣理解,接口中的static方法可以作為工具方法來(lái)提供給大家進(jìn)行方便調(diào)用!

Default好處

原先接口的缺陷是,修改接口后,則需要修改全部實(shí)現(xiàn)該接口的類,所以引進(jìn)的默認(rèn)方法。他們的目的是為了解決接口的修改與現(xiàn)有的實(shí)現(xiàn)不兼容的問(wèn)題。

關(guān)于Java8接口中引入default關(guān)鍵字的本質(zhì)原因是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI