日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java8新特性系列-默認(rèn)方法和靜態(tài)方法

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

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國際域名空間、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、梅列網(wǎng)站維護(hù)、網(wǎng)站推廣。

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

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

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

 
 
 
 
  1. public interface Sortable {
  2.     void sort();
  3.     T peek();
  4. }

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

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

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

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

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

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

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

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

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

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

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

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

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

如果兩個或多個接口具有相同的默認(rèn)方法簽名,并且一個類實(shí)現(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. public interface Interface2 {
  8.     void methodTwo(String str);
  9.     default void newMethod(){
  10.         System.out.println("Interface2: Newly added method");
  11.     }
  12. }
  13. public class InterfaceImplementation implements Interface1, Interface2{
  14.     @Override
  15.     public void methodOne(String str) {
  16.         System.out.println("Overridden methodOne: " + str);
  17.     }
  18.     @Override
  19.     public void methodTwo(String str) {
  20.         System.out.println("Overridden methodTwo: " + str );
  21.     }
  22. }

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

 
 
 
 
  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.     // newMethod implemented to resolve the conflict.
  7.     @Override
  8.     public void newMethod() {
  9.         System.out.println("InterfaceImplementation: Newly added method");
  10.     }
  11.     @Override
  12.     public void methodTwo(String str) {
  13.         System.out.println("Overridden methodTwo: " + str );
  14.     }
  15. }

 我們總結(jié)一下:

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

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

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

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

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

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

 
 
 
 
  1. Sortable.getDefaultDirection()

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

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

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


分享題目:Java8新特性系列-默認(rèn)方法和靜態(tài)方法
文章分享:http://m.5511xx.com/article/dhhoocs.html