91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java8接口中引入default關鍵字的本質原因是什么

發布時間:2022-01-06 12:56:25 來源:億速云 閱讀:167 作者:柒染 欄目:開發技術

Java8接口中引入default關鍵字的本質原因是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

接口的常規實現方式

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

定義一個接口

public interface IDemo {
    void func1();
}

類CDemo1實現接口IDemo

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

類CDemo2實現接口IDemo

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

在IDemo中新增加方法func2()

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

可以看到CDemo1和CDemo2中需要強制實現方法func2(),如下圖所示:

Java8接口中引入default關鍵字的本質原因是什么

接口中的default

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

Java8接口中引入default關鍵字的本質原因是什么

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

Java8接口中引入default關鍵字的本質原因是什么

其中新增的接口,都用default來修飾(jdk1.7升級到jdk1.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;
}

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

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

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

Java8接口中引入default關鍵字的本質原因是什么

實例化CDemo1后,可以正常調用func3方法,代碼如下:

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

讀到這里發現接口中通過default關鍵字來進行接口實現的好處了吧,簡單四個字就是 “方便擴展” !通過這個技術可以做到在接口中新增加方法并且不會影響到已經實現了該接口的所有的類!包括jdk1.8新引入的Lambda表達式也是基于這一知識點來實現的!

接口中的static

與此同時,從jdk1.8開始,接口中可以通過static關鍵字來修飾方法,同樣可以對方法進行實現

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

調用方法也非常的簡單,接口.static 方法,例如:

IDemo.func4();

大家可以這樣理解,接口中的static方法可以作為工具方法來提供給大家進行方便調用!

Default好處

原先接口的缺陷是,修改接口后,則需要修改全部實現該接口的類,所以引進的默認方法。他們的目的是為了解決接口的修改與現有的實現不兼容的問題。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通许县| 临安市| 泰来县| 凤翔县| 任丘市| 侯马市| 聂荣县| 甘孜县| 浦江县| 乐东| 西充县| 诸城市| 上饶市| 天津市| 迭部县| 安溪县| 瓮安县| 故城县| 樟树市| 昆明市| 澜沧| 冷水江市| 宁蒗| 石河子市| 勃利县| 德州市| 邹平县| 靖宇县| 安乡县| 龙川县| 奉新县| 黄骅市| 邯郸市| 兰州市| 灵武市| 壤塘县| 枣庄市| 绥芬河市| 宕昌县| 资兴市| 根河市|