中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Java8新特性系列有哪些

發布時間:2021-10-18 11:22:13 來源:億速云 閱讀:131 作者:iii 欄目:web開發

本篇內容介紹了“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);     }      }

“Java8新特性系列有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

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

AI

称多县| 武汉市| 云梦县| 江阴市| 湄潭县| 镇雄县| 石渠县| 昆明市| 五指山市| 吕梁市| 庆阳市| 河源市| 福州市| 平泉县| 沅陵县| 昭苏县| 长沙县| 布尔津县| 康乐县| 庐江县| 会理县| 余姚市| 丽江市| 泽库县| 夏津县| 潼关县| 鲜城| 隆化县| 邳州市| 毕节市| 南丹县| 古丈县| 旬阳县| 资兴市| 盐亭县| 河北省| 蒙城县| 永春县| 富川| 平远县| 阿坝|