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

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

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

類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(),如下圖所示:


接口中的default

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

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


其中新增的接口,都用default來修飾(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)代碼!吃驚過后,我們來想想作者的意圖。還是上面的代碼,我們新增方法func3(),并完成簡(jiǎn)單的實(shí)現(xiàn)

public interface IDemo {

? ? void func1();

? ? void func2();

? ? default void func3(){

? ? ? ? System.out.println("this is default func2");

? ? }

}

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

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

public static void main(String[] args) {

? ? CDemo1 cd1=new CDemo1();

? ? cd1.func3();

}

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

接口中的static

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

static? void func4(){

? ? System.out.println("this is static func4");

}

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

IDemo.func4();

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

以上就是時(shí)我對(duì)jkd接口中的default方法和static方法的總結(jié),原創(chuàng)不易,如果文章幫到了大家,煩請(qǐng)點(diǎn)贊轉(zhuǎn)發(fā)!

?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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