最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年03月04日 15:13:25   作者:編碼是個技術(shù)活  
這篇文章主要給大家介紹了關(guān)于Java8新特性之默認(rèn)方法和靜態(tài)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

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

主要是為了方便擴(kuò)展已有接口;如果沒有默認(rè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來對對象進(jìn)行排序。

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

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

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是一個自定義集合類,其中包含可以使用接口方法進(jìn)行排序和查看的數(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)方式,默認(rèn)方法 default method,我們可以對Sortable<T>進(jìn)行如下改造:

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()的默認(rèn)實現(xiàn)。

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

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

如果兩個或多個接口具有相同的默認(rèn)方法簽名,并且一個類實現(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)先級高于任何聲明為默認(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,例如:

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()

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

接口是設(shè)計模式中一種開閉原則的體驗,而java8賦予了接口新的特性,使得接口使用起來更加的得心應(yīng)手了,這也有助于我們更加內(nèi)聚自己的代碼結(jié)構(gòu)了。Java源碼中也有很多場景使用到了默認(rèn)方法,例如: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);
 }
 
}

總結(jié)

到此這篇關(guān)于Java8新特性之默認(rèn)方法和靜態(tài)方法的文章就介紹到這了,更多相關(guān)Java8默認(rèn)方法和靜態(tài)方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java編程之AC自動機(jī)工作原理與實現(xiàn)代碼

    java編程之AC自動機(jī)工作原理與實現(xiàn)代碼

    這篇文章主要介紹了java編程之AC自動機(jī)的有關(guān)內(nèi)容,涉及其應(yīng)用場景,運行原理,運行過程,構(gòu)造方法及Java中的實現(xiàn)代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • logback打印多次mybatis的sql日志問題

    logback打印多次mybatis的sql日志問題

    這篇文章主要介紹了logback打印多次mybatis的sql日志問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 關(guān)于@JsonProperty,@NotNull,@JsonIgnore的具體使用

    關(guān)于@JsonProperty,@NotNull,@JsonIgnore的具體使用

    這篇文章主要介紹了關(guān)于@JsonProperty,@NotNull,@JsonIgnore的具體使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java synchronized關(guān)鍵字使用方式及特性解析

    Java synchronized關(guān)鍵字使用方式及特性解析

    這篇文章主要介紹了Java synchronized關(guān)鍵字使用方式及特性解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java 讀取指定路徑的文本文件并返回String的方法

    Java 讀取指定路徑的文本文件并返回String的方法

    今天小編就為大家分享一篇Java 讀取指定路徑的文本文件并返回String的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Java創(chuàng)建多線程的兩種方式對比

    Java創(chuàng)建多線程的兩種方式對比

    在Java中創(chuàng)建線程的方式有兩種,第一種是直接繼承Thead類,另一種是實現(xiàn)Runable接口。那么這兩種方式孰優(yōu)孰劣呢?這就是本文需要探討的內(nèi)容范疇了,看官們請仔細(xì)向下看
    2014-10-10
  • springboot中使用redis由淺入深解析

    springboot中使用redis由淺入深解析

    這篇文章主要由淺入深為大家介紹了springboot中使用redis的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Springboot啟動擴(kuò)展點超詳細(xì)教程小結(jié)

    Springboot啟動擴(kuò)展點超詳細(xì)教程小結(jié)

    這篇文章主要介紹了Springboot啟動擴(kuò)展點超詳細(xì)教程小結(jié),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 使用注解解決ShardingJdbc不支持復(fù)雜SQL方法

    使用注解解決ShardingJdbc不支持復(fù)雜SQL方法

    這篇文章主要為大家介紹了使用注解解決ShardingJdbc不支持復(fù)雜SQL方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Mybatis-Plus將字段設(shè)置為null解決方法

    Mybatis-Plus將字段設(shè)置為null解決方法

    MyBatis-Plus是一個MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增 強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus將字段設(shè)置為null的解決方法的相關(guān)資料,需要的朋友可以參考下
    2023-04-04

最新評論

永胜县| 会同县| 扶沟县| 延川县| 小金县| 宁波市| 宁远县| 雅安市| 阜康市| 高邮市| 德昌县| 和田县| 丹寨县| 德阳市| 三亚市| 涿州市| 墨玉县| 绥江县| 贵定县| 郎溪县| 新疆| 紫云| 武安市| 泰顺县| 辽宁省| 都昌县| 隆德县| 宁国市| 镇康县| 达拉特旗| 漾濞| 上饶市| 积石山| 金堂县| 民乐县| 福贡县| 屏边| 莱阳市| 千阳县| 漳平市| 定陶县|