成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java8新特性系列-默認(rèn)方法和靜態(tài)方法

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

[[385113]]

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

為什么會有默認(rèn)方法?

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

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

  1. public interface Sortable<T> { 
  2.     void sort(); 
  3.     T peek(); 

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

  1. public class ObjectComparator implements Comparator<Comparable> { 
  2.     @Override 
  3.     public int compare(Comparable o1, Comparable o2) { 
  4.         return o1.compareTo(o2); 
  5.     } 

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

  1. public class SortableStringCollection implements Sortable<String> { 
  2.  
  3.     private List<String> items = new ArrayList<>(); 
  4.  
  5.     public void add(String item) { 
  6.         items.add(item); 
  7.     } 
  8.  
  9.     @Override 
  10.     public void sort() { 
  11.         items.sort(new ObjectComparator()); 
  12.     } 
  13.  
  14.     @Override 
  15.     public String peek() { 
  16.         return items.get(0); 
  17.     } 

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

  1. public class SortableNumberCollection implements Sortable<Integer> { 
  2.  
  3.     private List<Integer> items = new ArrayList<>(); 
  4.  
  5.     public void add(Integer item) { 
  6.         items.add(item); 
  7.     } 
  8.  
  9.     @Override 
  10.     public void sort() { 
  11.         items.sort(new ObjectComparator()); 
  12.     } 
  13.  
  14.     @Override 
  15.     public Integer peek() { 
  16.         return items.get(0); 
  17.     } 

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

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

Java8之后提供了一種新的實現(xiàn)方式,默認(rèn)方法 default method,我們可以對Sortable進(jìn)行如下改造:

  1. public interface Sortable<T> { 
  2.     void sort(); 
  3.     T peek(); 
  4.  
  5.     default T sortAndPeek(){    // New 'default method' added in the interface 
  6.         sort(); 
  7.         return peek(); 
  8.     } 
  9.  

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

在下圖中我們看到default Method不通的標(biāo)識:


在多繼承中使用默認(rèn)方法問題

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

  1. public interface Interface1 { 
  2.     void methodOne(String str); 
  3.     default void newMethod(){ 
  4.         System.out.println("Interface1: Newly added method"); 
  5.     } 
  6.  
  7.  
  8.  
  9. public interface Interface2 { 
  10.     void methodTwo(String str); 
  11.     default void newMethod(){ 
  12.         System.out.println("Interface2: Newly added method"); 
  13.     } 
  14.  
  15.  
  16.  
  17. public class InterfaceImplementation implements Interface1, Interface2{ 
  18.     @Override 
  19.     public void methodOne(String str) { 
  20.         System.out.println("Overridden methodOne: " + str); 
  21.     } 
  22.  
  23.     @Override 
  24.     public void methodTwo(String str) { 
  25.         System.out.println("Overridden methodTwo: " + str ); 
  26.     } 

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

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

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

  1. public class InterfaceImplementation implements Interface1, Interface2{ 
  2.     @Override 
  3.     public void methodOne(String str) { 
  4.         System.out.println("Overridden methodOne: " + str); 
  5.     } 
  6.  
  7.     // newMethod implemented to resolve the conflict. 
  8.     @Override 
  9.     public void newMethod() { 
  10.         System.out.println("InterfaceImplementation: Newly added method"); 
  11.     } 
  12.  
  13.     @Override 
  14.     public void methodTwo(String str) { 
  15.         System.out.println("Overridden methodTwo: " + str ); 
  16.     } 

 我們總結(jié)一下:

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

在Java 8中添加靜態(tài)方法

接口定義的靜態(tài)方法獨立于任何對象調(diào)用。所以,在調(diào)用靜態(tài)方法時,不需要實現(xiàn)接口,也不需要接口的實例,

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

  1. public interface Sortable<T> { 
  2.  
  3.     Direction defaultDirection = Direction.DESC
  4.  
  5.     enum Direction { 
  6.         ASC
  7.         DESC 
  8.     }; 
  9.  
  10.     void sort(); 
  11.     T peek(); 
  12.  
  13.     static Direction getDefaultDirection(){    // 'static method' added to the interface. 
  14.         return defaultDirection; 
  15.     } 

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

  1. Sortable.getDefaultDirection() 

對默認(rèn)方法和靜態(tài)方法的一點思考

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

  1. public interface Iterable<T> { 
  2.  
  3.     Iterator<T> iterator(); 
  4.      
  5.     default void forEach(Consumer<? super T> action) { 
  6.         Objects.requireNonNull(action); 
  7.         for (T t : this) { 
  8.             action.accept(t); 
  9.         } 
  10.     } 
  11.      
  12.     default Spliterator<T> spliterator() { 
  13.         return Spliterators.spliteratorUnknownSize(iterator(), 0); 
  14.     } 
  15.      

 【編輯推薦】

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2021-09-13 07:53:30

安全

2014-04-10 18:00:10

Java8Java8教程

2021-03-02 07:13:54

Java8版本升級

2021-02-22 11:51:15

Java開發(fā)代碼

2023-07-19 08:03:05

Future異步JDK

2024-10-09 08:42:03

2014-07-15 14:48:26

Java8

2009-08-27 16:24:48

擴(kuò)展方法C# 3.0新特性

2022-12-30 09:24:23

Java8Stream操作

2022-12-09 07:48:10

Java8Stream表達(dá)式

2014-10-20 13:57:59

JavaFX 8Java 8

2014-03-28 11:08:16

Java 8多重繼承

2017-10-25 11:05:14

Java

2014-07-14 11:34:53

Java 8Nashorn

2015-05-25 09:45:16

Java多繼承深入解析

2013-05-02 09:14:19

Java 8Java 8的新特性

2014-04-16 07:43:31

Java 8JRE

2014-03-19 11:04:14

Java 8Java8特性

2014-04-15 15:45:22

Java8Java8教程

2014-05-05 09:58:01

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产美女自拍视频 | 亚洲精品一区二区 | 黄色免费在线观看网址 | k8久久久一区二区三区 | 免费av一区二区三区 | 精品乱子伦一区二区三区 | 天天人人精品 | 亚洲一区二区三区在线播放 | 国产精品呻吟久久av凹凸 | 精品国产视频 | 奇米久久 | 精品久久久久久久久久久久 | 欧美日韩精品亚洲 | 一级黄色片网址 | 欧美在线色视频 | 天色综合网 | 欧美一级视频免费看 | 欧美精品一二三区 | 久久久久久久久久久丰满 | 日本三级网 | 精品欧美一区二区三区久久久 | 久久久精品一区二区三区 | 国产精品一区二区不卡 | 亚洲视频一区二区三区四区 | 免费精品久久久久久中文字幕 | 欧美mv日韩mv国产网站91进入 | 成人在线电影网站 | 久久久久久精 | 国产一区久久 | 99re视频| 亚洲精品白浆高清久久久久久 | 国产亚韩 | 91精品久久久久久久久 | 亚洲综合久久精品 | 久久久福利 | 91 久久 | 亚洲综合中文字幕在线观看 | 欧美亚洲视频在线观看 | 国产精品99久久久久久www | www日本在线| 国产福利一区二区 |