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

詳解Java8接口中引入Default關鍵字的本質原因

開發 后端
熟悉java接口的同學都知道,接口被某些類實現后,一旦在接口中增加了新方法,那么實現該接口的所有類都要實現這個新增的方法(即使這個新增的接口對某些類沒有用處)。

接口的常規實現方式

熟悉java接口的同學都知道,接口被某些類實現后,一旦在接口中增加了新方法,那么實現該接口的所有類都要實現這個新增的方法(即使這個新增的接口對某些類沒有用處)。

定義一個接口

  1. public interface IDemo { 
  2.     void func1(); 

 類CDemo1實現接口IDemo

  1. public class CDemo1 implements IDemo{ 
  2.     @Override 
  3.     public void func1() { 
  4.     } 

類CDemo2實現接口IDemo

  1. public class CDemo2 implements IDemo{ 
  2.     @Override 
  3.     public void func1() { 
  4.     } 

 在IDemo中新增加方法func2()

  1. public interface IDemo { 
  2.     void func1(); 
  3.     void func2(); 

 可以看到CDemo1和CDemo2中需要強制實現方法func2(),如下圖所示:

詳解Java8接口中引入default關鍵字的本質原因
詳解Java8接口中引入default關鍵字的本質原因

接口中的default

上面的實例導致了前面提出的那個問題,一旦在接口中增加了新方法,那么已經實現了該接口的所有的類都要實現這個新增的方法!那么,如果是JDK中的某個核心接口需要變更,需要新增某些方法呢?這個工作量更是可想而知,我們來看一下java.util.Collection這個接口,它在jdk1.7中的方法包括:

詳解Java8接口中引入default關鍵字的本質原因

而在JDk 1.8中 Collection接口中包括方法如下:

詳解Java8接口中引入default關鍵字的本質原因

其中新增的接口,都用default來修飾(jdk1.7升級到jdk1.8后,接口的重要變化),源代碼如下:

  1. default Stream<E> stream() { 
  2.  return StreamSupport.stream(spliterator(), false); 
  3.  
  4. default Stream<E> parallelStream() { 
  5.     return StreamSupport.stream(spliterator(), true); 
  6.  
  7. default Spliterator<E> spliterator() { 
  8.     return Spliterators.spliterator(this, 0); 
  9.  
  10. default boolean removeIf(Predicate<? super E> filter) { 
  11.     Objects.requireNonNull(filter); 
  12.     boolean removed = false
  13.     final Iterator<E> each = iterator(); 
  14.     while (each.hasNext()) { 
  15.         if (filter.test(each.next())) { 
  16.             each.remove(); 
  17.             removed = true
  18.         } 
  19.     } 
  20.     return removed; 

 我們不僅大吃一驚,這還是我們熟知的接口嗎?接口中的方法居然有了實現代碼!吃驚過后,我們來想想作者的意圖。還是上面的代碼,我們新增方法func3(),并完成簡單的實現

  1. public interface IDemo { 
  2.     void func1(); 
  3.     void func2(); 
  4.     default void func3(){ 
  5.         System.out.println("this is default func2"); 
  6.     } 

 然后查看類CDemo1,一切正常,沒有任何錯誤提示:

詳解Java8接口中引入default關鍵字的本質原因

實例化CDemo1后,可以正常調用func3方法,代碼如下:

  1. public static void main(String[] args) { 
  2.     CDemo1 cd1=new CDemo1(); 
  3.     cd1.func3(); 

讀到這里發現接口中通過default關鍵字來進行接口實現的好處了吧,簡單四個字就是 “方便擴展” !通過這個技術可以做到在接口中新增加方法并且不會影響到已經實現了該接口的所有的類!包括jdk1.8新引入的Lambda表達式也是基于這一知識點來實現的!

接口中的static

與此同時,從jdk1.8開始,接口中可以通過static關鍵字來修飾方法,同樣可以對方法進行實現

  1. static  void func4(){ 
  2.     System.out.println("this is static func4"); 

調用方法也非常的簡單,接口.static 方法,例如:

  1. IDemo.func4(); 

大家可以這樣理解,接口中的static方法可以作為工具方法來提供給大家進行方便調用!

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-02-01 13:10:07

Staticc語言UNIX系統

2022-11-12 18:32:50

Golangomitemptyjson

2009-09-02 09:24:03

C# this關鍵字

2009-09-01 15:25:04

C# default關

2013-01-30 10:12:14

Pythonyield

2025-06-13 08:00:00

Java并發編程volatile

2009-09-28 11:34:49

Javascript

2011-06-14 13:26:27

volatile

2017-05-27 20:59:30

Java多線程synchronize

2021-07-27 07:31:16

單例模式關鍵字

2025-01-09 10:30:40

2012-03-01 12:50:03

Java

2024-03-15 11:52:03

C++關鍵字編程

2010-02-05 15:51:06

C++ explici

2023-03-09 07:38:58

static關鍵字狀態

2023-11-10 09:29:30

MySQLExplain

2020-08-10 08:00:13

JavaFinal關鍵字

2012-06-02 00:53:39

Javafinally

2024-01-15 10:41:31

C++關鍵字開發

2023-09-22 22:27:54

autoC++11
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美久久久电影 | 日韩国产免费观看 | 欧美在线天堂 | 2019天天操| 日日夜夜天天干 | 欧美视频第三页 | 中文字幕一区在线观看视频 | 欧美11一13sex性hd | 亚洲欧美精品 | 天天躁日日躁aaaa视频 | 日韩精品一区在线 | 成人欧美一区二区三区黑人孕妇 | 久久91av | japanhd成人| av影片在线 | 超碰91在线 | 精品国产精品一区二区夜夜嗨 | 一区二区三区在线看 | 四虎最新地址 | 97国产一区二区精品久久呦 | 99精品久久久久久中文字幕 | 欧美日韩高清一区 | 亚洲国产欧美在线人成 | 亚洲精品永久免费 | 国产精品久久亚洲 | 日本黄色大片免费 | 99热精品久久 | 成人欧美一区二区三区在线播放 | 欧美成人免费在线视频 | 中文字幕在线观看 | 精品一区二区观看 | 欧美日韩久久久久 | 黄色亚洲网站 | 亚洲国产精品人人爽夜夜爽 | 在线观看av网站永久 | 九九九视频在线观看 | 国产福利资源在线 | 野狼在线社区2017入口 | 亚洲精品久久久 | 日韩激情一区 | 国产伦一区二区三区 |