亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java8的default方法詳細介紹

2019-11-26 15:32:43
字體:
來源:轉載
供稿:網友

什么是default方法?

Java 8發布以后,可以給接口添加新方法,但是,接口仍然可以和它的實現類保持兼容。這非常重要,因為你開發的類庫可能正在被多個開發者廣泛的使用著。而Java 8之前,在類庫中發布了一個接口以后,如果在接口中添加一個新方法,那些實現了這個接口的應用使用新版本的接口就會有崩潰的危險。

有了Java 8,是不是就沒有這種危險了?答案是否定的。

給接口添加default方法可能會讓某些實現類不可用。

首先,讓我們看下default方法的細節。

在Java 8中,接口中的方法可以被實現(Java8中的static的方法也可以在接口中實現,但這是另一個話題)。接口中被實現的方法叫做default方法,用關鍵字default作為修飾符來標識。當一個類實現一個接口的時候,它可以實現已經在接口中被實現過的方法,但這不是必須的。這個類會繼承default方法。這就是為什么當接口發生改變的時候,實現類不需要做改動的原因。

多繼承的時候呢?

當一個類實現了多于一個(比如兩個)接口,而這些接口又有同樣的default方法的時候,事情就變得很復雜了。類繼承的是哪一個default方法呢?哪一個也不是!在這種情況下,類要自己(直接或者是繼承樹上更上層的類)來實現default方法(才可以)。

當一個接口實現了default方法,另一個接口把default方法聲明成了abstract的時候,同樣如此。Java 8試圖避免不明確的東西,保持嚴謹。如果一個方法在多個接口中都有聲明,那么,任何一個default實現都不會被繼承,你將會得到一個編譯時錯誤。

但是,如果你已經把你的類編譯過了,那就不會出現編譯時錯誤了。在這一點上,Java 8是不一致的。它有它自己的原因,有于各種原因,在這里我不想詳細的說明或者是深入的討論(因為:版本已經發布了,討論時間太長,這個平臺從來沒有這樣的討論)。

1.假如你有兩個接口,一個實現類。
2.其中一個接口實現了一個default方法m()。
3.把接口和實現類一塊編譯。
4.修改那個沒有包含m()方法的接口,聲明m()方法為abstract。
5.單獨重新編譯修改過的接口。
6.運行實現類。

 
上面的情況下類可以正常運行。但是,不能用修改過的接口重新編譯,但是用老的接口編譯仍然可以運行。接下來

1.修改那個含有abstract方法m()的接口,創建一個default實現。
2.編譯修改后的接口
3.運行類:失敗。
當兩個接口給同一個方法都提供了default實現的時候,這個方法是無法被調用的,除非實現類也實現了這個default方法(要么是直接實現,要么是繼承樹上更上層的類做實現)。

 
但是,這個類是兼容的。它可以在使用新接口的情況下被載入,甚至可以執行,只要它沒有調用在兩個接口中都有default實現的方法。

實例代碼:



為了演示上面的例子,我給C.java創建了一個測試目錄,它下面還有3個子目錄,用于存放I1.java和I2.java。測試目錄下包含了類C的源碼C.java。base目錄包含了可以編譯和運行的那個版本的接口。I1包含了有default實現的m()方法,I2不包含任何方法。

實現類包含了main方法,所以我們可以在測試中執行它。它會檢查是否存在命令行參數,這樣,我們就可以很方便的執行調用m()和不調用m()的測試。

復制代碼 代碼如下:

~/github/test$ cat C.java
public class C implements I1, I2 {
  public static void main(String[] args) {
    C c = new C();
    if(args.length == 0 ){
        c.m();
    }
  }
}
~/github/test$ cat base/I1.java
public interface I1 {
  default void m(){
    System.out.println("hello interface 1");
  }
}
~/github/test$ cat base/I2.java
public interface I2 {
}

使用下面的命令行來編譯運行:

復制代碼 代碼如下:
~/github/test$ javac -cp .:base C.java
~/github/test$ java -cp .:base C
hello interface 1

compatible目錄包含了有abstract方法m()的I2接口,和未修改的I1接口。

復制代碼 代碼如下:
~/github/test$ cat compatible/I2.java
public interface I2 {
  void m();
}

這個不能用來編譯類C:
復制代碼 代碼如下:
~/github/test$ javac -cp .:compatible C.java
C.java:1: error: C is not abstract and does not override abstract method m() in I2
public class C implements I1, I2 {
   ^
1 error

錯誤信息非常精確。因為我們有前一次編譯獲得的C.class,如果我們編譯compatible目錄下的接口,我們仍然會得到能運行實現類的兩個接口:

復制代碼 代碼如下:

~/github/test$ javac compatible/I*.java
~/github/test$ java -cp .:compatible C
hello interface 1

第三個叫做wrong的目錄,包含的I2接口也定義了m()方法:

復制代碼 代碼如下:

~/github/test$ cat wrong/I2.java
public interface I2 {
  default void m(){
    System.out.println("hello interface 2");
  }
}

我們應該不厭其煩的編譯它。盡管m()方法被定義了兩次,但是,實現類仍然可以運行,只要它沒有調用那個定義了多次的方法,但是,只要我們調用m()方法,立即就會失敗。這是我們使用的命令行參數:

復制代碼 代碼如下:

~/github/test$ javac wrong/*.java
~/github/test$ java -cp .:wrong C
Exception in thread "main" java.lang.IncompatibleClassChangeError: Conflicting
default methods: I1.m I2.m
    at C.m(C.java)
    at C.main(C.java:5)
~/github/test$ java -cp .:wrong C x
~/github/test$

結論

當你把給接口添加了default實現的類庫移植到Java 8環境下的時候,一般不會有問題。至少Java8類庫開發者給集合類添加default方法的時候就是這么想的。使用你類庫的應用程序仍然依賴沒有default方法的Java7的類庫。當使用和修改多個不同的類庫的時候,有很小的幾率會發生沖突。如何才能避免呢?

像以前那樣設計你的類庫??赡芤蕾嘾efault方法的時候不要掉以輕心。萬不得已不要使用。明智的選擇方法名,避免和其它接口產生沖突。我們將會學習到Java編程中如何使用這個特性做開發。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美大片免费观看| 成人免费观看49www在线观看| 亚洲资源在线看| 久久精品免费播放| 久久天堂av综合合色| 色综合91久久精品中文字幕| 精品女同一区二区三区在线播放| 欧美日韩国产成人在线| 国产日韩一区在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲高清福利视频| 日韩性生活视频| 欧美区二区三区| 亚洲精品自在久久| 欧美孕妇毛茸茸xxxx| 欧美成人中文字幕| 88国产精品欧美一区二区三区| 亚洲性日韩精品一区二区| www.欧美精品一二三区| 国产精品久久久久久久久久久不卡| 国产97色在线| 亚洲成年人影院在线| 欧美激情一区二区三区成人| 久久91亚洲精品中文字幕| 一区二区成人精品| 久久久999精品免费| 国产精品香蕉在线观看| 久久久久国色av免费观看性色| 久久亚洲综合国产精品99麻豆精品福利| 久久免费视频观看| 亚洲级视频在线观看免费1级| 大伊人狠狠躁夜夜躁av一区| 久久久久久com| 国产精品国产三级国产专播精品人| 性色av香蕉一区二区| 国产成人97精品免费看片| 色妞久久福利网| 久久精视频免费在线久久完整在线看| 亚洲欧美日韩国产精品| 中文字幕日韩精品在线| 国产精品三级久久久久久电影| 668精品在线视频| 97色在线播放视频| 97人人做人人爱| 精品色蜜蜜精品视频在线观看| 欧美激情亚洲一区| 69**夜色精品国产69乱| 亚洲影院在线看| 中文字幕日韩在线播放| 色偷偷88888欧美精品久久久| 午夜精品久久久久久99热| 国产亚洲精品久久| 国产综合在线看| 欧洲一区二区视频| 欧美成人性色生活仑片| 欧美激情日韩图片| 亚洲国产日韩一区| 亚洲成色999久久网站| 91久久久久久久久| 国产脚交av在线一区二区| 91日本在线视频| 中文.日本.精品| 亚洲第一页在线| 日韩精品中文字幕久久臀| 色综合色综合久久综合频道88| 国产日韩欧美视频在线| 九九九久久久久久| 国产裸体写真av一区二区| 精品一区二区三区四区在线| 国产精品va在线播放| 精品免费在线观看| 成人性生交大片免费看视频直播| 久久久伊人日本| 这里只有精品久久| 亚洲国产黄色片| 欧美国产日韩一区二区在线观看| 久久久噜久噜久久综合| 亚洲大胆人体av| 欧美精品福利视频| 国产极品jizzhd欧美| 久久中文字幕视频| 4438全国亚洲精品在线观看视频| 久久久精品久久久久| 欧美日韩成人在线观看| 亚洲欧美国产日韩天堂区| 日本午夜精品理论片a级appf发布| 欧美一二三视频| www国产亚洲精品久久网站| 精品视频—区二区三区免费| 精品久久久香蕉免费精品视频| 欧美成年人在线观看| 最好看的2019年中文视频| 欧美猛男性生活免费| 欧美国产日韩中文字幕在线| 久久综合免费视频| 欧美日韩福利在线观看| 久久久久成人网| 成人精品福利视频| 91极品女神在线| 日韩视频欧美视频| 久久高清视频免费| 日韩av电影国产| 欧美成人亚洲成人| 欧洲美女7788成人免费视频| 91精品国产自产在线老师啪| 欧美怡春院一区二区三区| 日本欧美精品在线| 中文字幕亚洲欧美在线| www.欧美免费| 国产欧美精品一区二区| 亚洲春色另类小说| 国产福利视频一区| 国产在线观看91精品一区| 日韩av电影在线播放| 97免费中文视频在线观看| 久久久久久12| 欧美性做爰毛片| 国产丝袜视频一区| 日韩av片电影专区| 亚洲人成啪啪网站| 日韩免费黄色av| 国产偷国产偷亚洲清高网站| 欧美精品国产精品日韩精品| 国产精品国模在线| 大胆欧美人体视频| 国产精品入口免费视| 国产福利视频一区二区| 日韩网站免费观看| 激情久久av一区av二区av三区| 国产亚洲a∨片在线观看| 久久免费高清视频| 国产中文字幕日韩| 国产亚洲精品高潮| 亚洲色图综合久久| 日韩中文字幕在线看| 欧美日韩黄色大片| 国产91色在线|免| 亚洲精品白浆高清久久久久久| 国内精品视频久久| 日韩精品亚洲精品| 欧美日韩美女视频| 久久久久这里只有精品| 欧美激情视频网| 久久精品电影一区二区| 成人黄色在线播放| 久久久久久成人| 91综合免费在线| 久久精品中文字幕一区| 欧美夫妻性生活视频| 97人洗澡人人免费公开视频碰碰碰| 91在线精品视频| 亚洲精品乱码久久久久久金桔影视| 精品视频—区二区三区免费| 久久网福利资源网站| 亚洲综合成人婷婷小说| 欧美成人亚洲成人| 亚洲成人在线视频播放| 久久久久久久久久久成人| 精品国产欧美一区二区三区成人| 98精品国产高清在线xxxx天堂| 精品国内产的精品视频在线观看| 欧美一级淫片videoshd| 97久久精品国产| 正在播放欧美一区|