中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Java8為什么會有默認方法-創(chuàng)新互聯(lián)

這篇文章將為大家詳細講解有關Java8為什么會有默認方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設,愛輝企業(yè)網(wǎng)站建設,愛輝品牌網(wǎng)站建設,網(wǎng)站定制,愛輝網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,愛輝網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

前言

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

為什么會有默認方法?

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

舉個例子,Sortable <T>接口以及實現(xiàn)該接口的類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是一個自定義集合類,其中包含可以使用接口方法進行排序和查看的數(shù)字列表指定元素,代碼如下:

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>添加新方法:T sortAndPeek(),那么SortableStringCollection和

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

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

public interface Sortable<T> {
 void sort();
 T peek();

 default T sortAndPeek(){ // New 'default method' added in the interface
  sort();
  return peek();
 }

}

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

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

Java8為什么會有默認方法

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

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

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 );
 }
}

我們總結(jié)一下:

  • 類中的方法優(yōu)先級高。類或父類中聲明的方法的優(yōu)先級高于任何聲明為默認方法的優(yōu)先級。

  • 如果無法依據(jù)第一條進行判斷,那么子接口的優(yōu)先級更高:函數(shù)簽名相同時,優(yōu)先選擇擁有最具體實現(xiàn)的默認方法的接口,即如果B繼承了A,那么B就比A更加具體。

  • 最后,如果還是無法判斷,繼承了多個接口的類必須通過顯式覆蓋和調(diào)用期望的方法,顯式地選擇使用哪一個默認方法的實現(xiàn)。

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

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

就像“默認方法”一樣,“靜態(tài)方法”也可以添加到接口中。例如,我們可以添加一個靜態(tài)方法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;
 }
}

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

Sortable.getDefaultDirection()

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

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

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為什么會有默認方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

本文名稱:Java8為什么會有默認方法-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://www.rwnh.cn/article18/cepdgp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站用戶體驗、定制開發(fā)小程序開發(fā)、網(wǎng)站排名全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營
新晃| 泾川县| 木兰县| 久治县| 襄汾县| 阿克苏市| 武冈市| 拉萨市| 太仓市| 焉耆| 安吉县| 会东县| 穆棱市| 余江县| 柳林县| 清水河县| 淮南市| 巴中市| 嫩江县| 兴和县| 锡林浩特市| 随州市| 祥云县| 固原市| 昌黎县| 东乌| 淮南市| 客服| 延长县| 合水县| 呼图壁县| 东辽县| 故城县| 新干县| 南城县| 濉溪县| 芮城县| 怀柔区| 山丹县| 鲁甸县| 德阳市|