国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: av中文字幕在线 | 日韩在线一区二区 | 日韩国产在线观看 | 国产毛片av | 久久综合影院 | 欧美一区二区三区在线观看视频 | 欧美日韩精品在线 | 日韩欧美专区 | 成人aaa视频 | 情一色一乱一欲一区二区 | 91视频播放 | 免费欧美一级 | 欧美日韩综合精品 | 成人羞羞网站 | 99视频这里有精品 | 久久久国产一区 | 国产专区一区二区三区 | 色就是色网站 | 成人一区二区在线 | 久久免费视频观看 | 日韩免费高清在线 | 久久久久久不卡 | 色婷婷综合网 | 久久精品亚洲一区二区 | 午夜影院免费 | 国产精品久久久久久久午夜片 | 操视频网站| 国产精品区二区三区日本 | 不用播放器看av | 激情网五月天 | 国产欧美精品区一区二区三区 | 亚洲婷婷一区二区三区 | 久久久www成人免费无遮挡大片 | 成人免费黄色 | 亚洲国产精品久久久久秋霞不卡 | 日日夜夜精品视频 | 亚洲欧美日韩精品久久亚洲区 | 自拍偷拍色| 国产精选一区二区三区不卡催乳 | 最色网| 一道本一区二区三区 |