自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解Java8接口中引入Default關(guān)鍵字的本質(zhì)原因

開(kāi)發(fā) 后端
熟悉java接口的同學(xué)都知道,接口被某些類實(shí)現(xiàn)后,一旦在接口中增加了新方法,那么實(shí)現(xiàn)該接口的所有類都要實(shí)現(xiàn)這個(gè)新增的方法(即使這個(gè)新增的接口對(duì)某些類沒(méi)有用處)。

接口的常規(guī)實(shí)現(xiàn)方式

熟悉java接口的同學(xué)都知道,接口被某些類實(shí)現(xiàn)后,一旦在接口中增加了新方法,那么實(shí)現(xiàn)該接口的所有類都要實(shí)現(xiàn)這個(gè)新增的方法(即使這個(gè)新增的接口對(duì)某些類沒(méi)有用處)。

定義一個(gè)接口

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

 類CDemo1實(shí)現(xiàn)接口IDemo

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

類CDemo2實(shí)現(xiàn)接口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中需要強(qiáng)制實(shí)現(xiàn)方法func2(),如下圖所示:

詳解Java8接口中引入default關(guān)鍵字的本質(zhì)原因
詳解Java8接口中引入default關(guān)鍵字的本質(zhì)原因

接口中的default

上面的實(shí)例導(dǎo)致了前面提出的那個(gè)問(wèn)題,一旦在接口中增加了新方法,那么已經(jīng)實(shí)現(xiàn)了該接口的所有的類都要實(shí)現(xiàn)這個(gè)新增的方法!那么,如果是JDK中的某個(gè)核心接口需要變更,需要新增某些方法呢?這個(gè)工作量更是可想而知,我們來(lái)看一下java.util.Collection這個(gè)接口,它在jdk1.7中的方法包括:

詳解Java8接口中引入default關(guān)鍵字的本質(zhì)原因

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

詳解Java8接口中引入default關(guān)鍵字的本質(zhì)原因

其中新增的接口,都用default來(lái)修飾(jdk1.7升級(jí)到j(luò)dk1.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; 

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

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

 然后查看類CDemo1,一切正常,沒(méi)有任何錯(cuò)誤提示:

詳解Java8接口中引入default關(guān)鍵字的本質(zhì)原因

實(shí)例化CDemo1后,可以正常調(diào)用func3方法,代碼如下:

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

讀到這里發(fā)現(xiàn)接口中通過(guò)default關(guān)鍵字來(lái)進(jìn)行接口實(shí)現(xiàn)的好處了吧,簡(jiǎn)單四個(gè)字就是 “方便擴(kuò)展” !通過(guò)這個(gè)技術(shù)可以做到在接口中新增加方法并且不會(huì)影響到已經(jīng)實(shí)現(xiàn)了該接口的所有的類!包括jdk1.8新引入的Lambda表達(dá)式也是基于這一知識(shí)點(diǎn)來(lái)實(shí)現(xiàn)的!

接口中的static

與此同時(shí),從jdk1.8開(kāi)始,接口中可以通過(guò)static關(guān)鍵字來(lái)修飾方法,同樣可以對(duì)方法進(jìn)行實(shí)現(xiàn)

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

調(diào)用方法也非常的簡(jiǎn)單,接口.static 方法,例如:

  1. IDemo.func4(); 

大家可以這樣理解,接口中的static方法可以作為工具方法來(lái)提供給大家進(jìn)行方便調(diào)用!

 

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

2021-02-01 13:10:07

Staticc語(yǔ)言UNIX系統(tǒng)

2009-09-02 09:24:03

C# this關(guān)鍵字

2009-09-01 15:25:04

C# default關(guān)

2022-11-12 18:32:50

Golangomitemptyjson

2013-01-30 10:12:14

Pythonyield

2009-09-28 11:34:49

Javascript

2011-06-14 13:26:27

volatile

2017-05-27 20:59:30

Java多線程synchronize

2025-01-09 10:30:40

2021-07-27 07:31:16

單例模式關(guān)鍵字

2012-03-01 12:50:03

Java

2024-03-15 11:52:03

C++關(guān)鍵字編程

2023-03-09 07:38:58

static關(guān)鍵字狀態(tài)

2010-02-05 15:51:06

C++ explici

2023-11-10 09:29:30

MySQLExplain

2012-06-02 00:53:39

Javafinally

2020-08-10 08:00:13

JavaFinal關(guān)鍵字

2024-01-15 10:41:31

C++關(guān)鍵字開(kāi)發(fā)

2023-09-22 22:27:54

autoC++11

2024-03-21 06:13:41

NULLC++關(guān)鍵字
點(diǎn)贊
收藏

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