激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java 8中default方法能做什么?不能做什么?

Java 8中default方法能做什么?不能做什么?

2021-04-19 13:31稀土掘金 Java教程

這篇文章主要給大家介紹了關于Java 8中default方法能做什么?不能做什么?文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。

什么是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是不一致的。它有它自己的原因,有于各種原因,在這里我不想詳細的說明或者是深入的討論(因為:版本已經發布了,討論時間太長,這個平臺從來沒有這樣的討論)。

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

Java 8中default方法能做什么?不能做什么?

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

  • 修改那個含有 abstract 方法 m() 的接口,創建一個 default 實現。
  • 編譯修改后的接口
  • 運行類:失敗。

當兩個接口給同一個方法都提供了default實現的時候,這個方法是無法被調用的,除非實現類也實現了這個default方法(要么是直接實現,要么是繼承樹上更上層的類做實現)。

Java 8中default方法能做什么?不能做什么?

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

實例代碼

Java 8中default方法能做什么?不能做什么?

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class c implements i1, i2 {
 public static void main(string[] args) {
  c c = new c();
  if(args.length == 0 ){
   c.m();
  }
 }
}
 
public interface i1 {
 default void m(){
  system.out.println("hello interface 1");
 }
}
 
public interface i2 {
}

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

?
1
2
3
javac -cp .:base c.java
java -cp .:base c
hello interface 1

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

?
1
2
3
public interface i2 {
 void m();
}

這個不能用來編譯類c:

?
1
2
3
4
5
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 目錄下的接口,我們仍然會得到能運行實現類的兩個接口:

?
1
2
3
javac compatible/i*.java
java -cp .:compatible c
hello interface 1

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

?
1
2
3
4
5
public interface i2 {
 default void m(){
  system.out.println("hello interface 2");
 }
}

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

?
1
2
3
4
5
6
7
javac wrong/*.java
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)
java -cp .:wrong c x

結論

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

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://juejin.im/post/5abc9c546fb9a028b61797d8

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产精品一区视频 | 午夜影视一区二区 | 美国黄色小视频 | 欧美一级网 | 美女福利视频国产 | 亚洲第一成人久久网站 | 欧美另类视频在线 | 嗯哈~不行好大h双性 | 亚洲一区二区三区视频免费 | 亚洲午夜在线视频 | 日本在线免费观看视频 | 99久久久国产 | chengrenzaixian| 56av国产精品久久久久久久 | 日本精品二区 | 一级成人欧美一区在线观看 | 国产精品久久亚洲 | 羞羞视频免费观看入口 | 刘亦菲一区二区三区免费看 | 国产88久久久国产精品免费二区 | 黄网站在线播放视频免费观看 | 国产亚洲精品久久久久久网站 | 国产精品av久久久久久网址 | 国产精品久久久久免费视频 | 欧美大胆xxxx肉体摄影 | 黄视频免费在线 | 国产大片在线观看 | 色淫影院| 欧美一页| 91网页| 蜜桃一本色道久久综合亚洲精品冫 | 免费a级黄色毛片 | 欧美一区二区三区不卡免费观看 | 双性精h调教灌尿打屁股的文案 | 欧美一级棒 | 一区二区久久电影 | 久久成人免费网 | 视频在线91 | 亚洲尻逼视频 | 国产成人精品一区二区三区电影 | 加勒比综合 |