国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java8新特性系列-默認方法和靜態方法

Java8新特性系列-默認方法和靜態方法

2021-03-04 23:50今日頭條編碼是個技術活 Java教程

在Java 8之前,默認情況下,接口中的所有方法都是公共的和抽象的。但是這一限制在Java 8中被打破了,Java 8允許開發人員在接口中添加新方法,而無需在實現這些接口的類中進行任何更改。

Java8新特性系列-默認方法和靜態方法

在Java 8之前,默認情況下,接口中的所有方法都是公共的和抽象的。但是這一限制在Java 8中被打破了,Java 8允許開發人員在接口中添加新方法,而無需在實現這些接口的類中進行任何更改。

為什么會有默認方法?

主要是為了方便擴展已有接口;如果沒有默認方法,假如給Java中的某個接口添加一個新的抽象方法,那么所有實現了該接口的類都得修改,影響將非常大。

舉個例子,Sortable 接口以及實現該接口的類SortableNumberCollection和SortableStringCollection。該接口有兩種方法:void sort(); 和T peek()。

public interface Sortable<T> { 

    void sort(); 

    T peek(); 

sort()方法用于對象排序,T peek()用于獲取指定元素,另外需要一個比較器類ObjectComparator來對對象進行排序。

public class ObjectComparator implements Comparator<Comparable> { 

    @Override 

    public int compare(Comparable o1, Comparable o2) { 

        return o1.compareTo(o2); 

    } 

SortableStringCollection是一個自定義集合類可以進行排序,并查看字符串指定元素,代碼如下:

public class SortableStringCollection implements Sortable<String> { 

 

    private List<String> items = new ArrayList<>(); 

 

    public void add(String item) { 

        items.add(item); 

    } 

 

    @Override 

    public void sort() { 

        items.sort(new ObjectComparator()); 

    } 

 

    @Override 

    public String peek() { 

        return items.get(0); 

    } 

同樣,SortableNumberCollection是一個自定義集合類,其中包含可以使用接口方法進行排序和查看的數字列表指定元素,代碼如下:

public class SortableNumberCollection implements Sortable<Integer> { 

 

    private List<Integer> items = new ArrayList<>(); 

 

    public void add(Integer item) { 

        items.add(item); 

    } 

 

    @Override 

    public void sort() { 

        items.sort(new ObjectComparator()); 

    } 

 

    @Override 

    public Integer peek() { 

        return items.get(0); 

    } 

Java8之前如果對接口Sortable添加新方法:T sortAndPeek(),那么SortableStringCollection和

SortableNumberCollection都必須實現T sortAndPeek()方法。

Java8之后提供了一種新的實現方式,默認方法 default method,我們可以對Sortable進行如下改造:

public interface Sortable<T> { 

    void sort(); 

    T peek(); 

 

    default T sortAndPeek(){    // New 'default method' added in the interface 

        sort(); 

        return peek(); 

    } 

 

同時SortableStringCollection和SortableNumberCollection類不需要任何更改。這樣可以減少我們對原有代碼的改動。同時如果需要,還可以在實現此接口的任何類中重寫該方法T sortAndPeek()的默認實現。

在下圖中我們看到default Method不通的標識:

Java8新特性系列-默認方法和靜態方法

在多繼承中使用默認方法問題

如果兩個或多個接口具有相同的默認方法簽名,并且一個類實現了這兩個接口,則將引發編譯時錯誤。例如:

public interface Interface1 { 

    void methodOne(String str); 

    default void newMethod(){ 

        System.out.println("Interface1: Newly added method"); 

    } 

 

 

 

public interface Interface2 { 

    void methodTwo(String str); 

    default void newMethod(){ 

        System.out.println("Interface2: Newly added method"); 

    } 

 

 

 

public class InterfaceImplementation implements Interface1, Interface2{ 

    @Override 

    public void methodOne(String str) { 

        System.out.println("Overridden methodOne: " + str); 

    } 

 

    @Override 

    public void methodTwo(String str) { 

        System.out.println("Overridden methodTwo: " + str ); 

    } 

此時代碼會提示如下異常:

InterfaceImplementation inherits unrelated defaults for newMethod() from types Interface1 and Interface2 

要解決此問題,我們將必須重寫類InterfaceImplementation中的方法:

public class InterfaceImplementation implements Interface1, Interface2{ 

    @Override 

    public void methodOne(String str) { 

        System.out.println("Overridden methodOne: " + str); 

    } 

 

    // newMethod implemented to resolve the conflict. 

    @Override 

    public void newMethod() { 

        System.out.println("InterfaceImplementation: Newly added method"); 

    } 

 

    @Override 

    public void methodTwo(String str) { 

        System.out.println("Overridden methodTwo: " + str ); 

    } 

我們總結一下:

  • 類中的方法優先級最高。類或父類中聲明的方法的優先級高于任何聲明為默認方法的優先級。
  • 如果無法依據第一條進行判斷,那么子接口的優先級更高:函數簽名相同時,優先選擇擁有最具體實現的默認方法的接口,即如果B繼承了A,那么B就比A更加具體。
  • 最后,如果還是無法判斷,繼承了多個接口的類必須通過顯式覆蓋和調用期望的方法,顯式地選擇使用哪一個默認方法的實現。

在Java 8中添加靜態方法

接口定義的靜態方法獨立于任何對象調用。所以,在調用靜態方法時,不需要實現接口,也不需要接口的實例,

就像“默認方法”一樣,“靜態方法”也可以添加到接口中。例如,我們可以添加一個靜態方法Direction getDefaultDirection(),該方法將返回默認Direction,例如:

public interface Sortable<T> { 

 

    Direction defaultDirection = Direction.DESC

 

    enum Direction { 

        ASC

        DESC 

    }; 

 

    void sort(); 

    T peek(); 

 

    static Direction getDefaultDirection(){    // 'static method' added to the interface. 

        return defaultDirection; 

    } 

在上面的示例中,可以使用類引用來調用靜態Direction getDefaultDirection()方法:

Sortable.getDefaultDirection() 

對默認方法和靜態方法的一點思考

接口是設計模式中一種開閉原則的體驗,而java8賦予了接口新的特性,使得接口使用起來更加的得心應手了,這也有助于我們更加內聚自己的代碼結構了。Java源碼中也有很多場景使用到了默認方法,例如:Iterator接口,我們在開發中可以多使用一些新的特性從而提高開發效率及增加代碼的健壯性。

public interface Iterable<T> { 

 

    Iterator<T> iterator(); 

     

    default void forEach(Consumer<? super T> action) { 

        Objects.requireNonNull(action); 

        for (T t : this) { 

            action.accept(t); 

        } 

    } 

     

    default Spliterator<T> spliterator() { 

        return Spliterators.spliteratorUnknownSize(iterator(), 0); 

    } 

     

原文地址:https://www.toutiao.com/i6932637837846135300/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 九九资源站| 99久久免费精品国产男女性高好 | 免费看操片| 亚洲精品成人 | 国产第一区在线 | 日韩三级黄色片 | 久久在线视频 | a国产在线观看 | 亚洲尤物| 一级黄色a毛片 | 国产成人精品一区二区三区 | 国产精品1区2区 | 亚洲国产精品一区二区久久 | 91精品久久久久久久久 | 亚洲 中文 欧美 日韩 在线观看 | 九九热精品视频 | 亚洲a网| av亚洲在线 | 亚洲福利一区 | 国产日韩精品一区 | 日韩精品一区二区在线观看 | 亚洲成av人影片在线观看 | 久久久一| 黄色在线免费观看视频网站 | 国产精品国产成人国产三级 | 国产一区二区三区免费在线 | 亚洲精品成人在线 | 精品一级| 国产福利视频在线观看 | 日韩在线看片 | 日本在线视频免费观看 | 中文字幕视频在线观看 | 亚洲免费视频在线观看 | 日本黄色免费播放 | 成人高清视频在线观看 | 在线观看亚洲成人 | 中文字幕在线观看第一页 | 成人黄色免费在线视频 | 欧美一区三区 | 日韩一区在线播放 | 超黄毛片|