日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java8 默认方法_Java 8的默认方法:可以做什么和不能做什么?

發(fā)布時(shí)間:2023/12/3 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java8 默认方法_Java 8的默认方法:可以做什么和不能做什么? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java8 默認(rèn)方法

什么是默認(rèn)方法

在Java 8發(fā)行版中,您可以修改接口以添加新方法,以便該接口與實(shí)現(xiàn)該接口的類保持兼容。 萬(wàn)一您開(kāi)發(fā)了一個(gè)庫(kù),該庫(kù)將由基輔到紐約的幾位程序員使用,那么這非常重要。 在Java 8出現(xiàn)之前,如果您在庫(kù)中發(fā)布了接口,則您不能添加新方法,而不必冒險(xiǎn)在接口中實(shí)現(xiàn)的某些應(yīng)用程序會(huì)隨接口的新版本而中斷。

使用Java 8,這種恐懼消失了嗎? 沒(méi)有。

向接口添加默認(rèn)方法可能會(huì)使某些類無(wú)法使用。

首先讓我們看一下默認(rèn)方法的要點(diǎn)。

在Java 8中,可以在接口中實(shí)現(xiàn)一種方法。 (從Java8開(kāi)始,靜態(tài)方法也可以在接口中實(shí)現(xiàn),但這是另一回事。)在接口中實(shí)現(xiàn)的方法稱為默認(rèn)方法,用關(guān)鍵字default表示為修飾符。 當(dāng)類實(shí)現(xiàn)接口時(shí),它可以但不必實(shí)現(xiàn)已經(jīng)在接口中實(shí)現(xiàn)的方法。 該類繼承默認(rèn)實(shí)現(xiàn)。 這就是為什么在實(shí)現(xiàn)接口的更改時(shí)可能無(wú)需觸摸類的原因。

多重繼承?

當(dāng)一個(gè)具體的類實(shí)現(xiàn)多個(gè)(例如兩個(gè))接口并且這些接口實(shí)現(xiàn)相同的默認(rèn)方法時(shí),事情就變得復(fù)雜起來(lái)。 該類將繼承哪個(gè)默認(rèn)方法? 答案是否定的。 在這種情況下,該類必須自己實(shí)現(xiàn)該方法(直接實(shí)現(xiàn)或通過(guò)繼承更高級(jí)別的類)。

當(dāng)只有一個(gè)接口實(shí)現(xiàn)默認(rèn)方法而另一個(gè)僅將其聲明為抽象方法時(shí),也是如此。 Java 8試圖受到約束,并避免“隱式”的事情。 如果在多個(gè)接口中聲明了這些方法,則不會(huì)繼承任何默認(rèn)實(shí)現(xiàn),則將出現(xiàn)編譯時(shí)錯(cuò)誤。

但是,如果您已經(jīng)編譯了類,則不會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。 這樣Java 8不一致。 它有其原因,我不想在這里詳述或出于各種原因而進(jìn)入辯論(例如:發(fā)布已結(jié)束,辯論時(shí)間很長(zhǎng),并且從未在此平臺(tái)上使用)。

  • 假設(shè)您有兩個(gè)接口,還有一個(gè)實(shí)現(xiàn)這兩個(gè)接口的類。
  • 接口之一實(shí)現(xiàn)默認(rèn)方法m() 。
  • 您編譯所有接口和類。
  • 您更改不包含方法m()的接口,以將其聲明為抽象方法。
  • 僅編譯修改后的接口。
  • 運(yùn)行課程。


在這種情況下,該類將運(yùn)行。 您不能使用修改后的接口再次對(duì)其進(jìn)行編譯,但是如果它是使用較舊版本進(jìn)行編譯的:它仍然可以運(yùn)行。 現(xiàn)在

  • 修改具有抽象方法m()的接口并創(chuàng)建默認(rèn)實(shí)現(xiàn)。
  • 編譯修改后的接口。
  • 運(yùn)行類:失敗。

當(dāng)有兩個(gè)接口為同一方法提供默認(rèn)實(shí)現(xiàn)時(shí),該方法不能在實(shí)現(xiàn)類中調(diào)用,除非由該類實(shí)現(xiàn)(再次:直接或從另一個(gè)類繼承)。

該類是兼容的。 可以使用新界面加載它。 只要兩個(gè)接口中都沒(méi)有默認(rèn)實(shí)現(xiàn)的方法的調(diào)用,它甚至可以開(kāi)始執(zhí)行。

樣例代碼

為了演示上述內(nèi)容,我為類C.java創(chuàng)建了一個(gè)測(cè)試目錄,并為文件I1.java和I2.java的接口創(chuàng)建了三個(gè)子目錄。 測(cè)試的根目錄在文件C.java包含類C的源代碼。 目錄base包含適合執(zhí)行和編譯的接口版本。 I1包含具有默認(rèn)實(shí)現(xiàn)的方法m() 。 接口I2目前不包含任何方法。

該類包含一個(gè)main方法,因此我們可以在測(cè)試中執(zhí)行它。 它測(cè)試是否有任何命令行參數(shù),因此我們可以輕松地執(zhí)行它,而無(wú)需調(diào)用方法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 { }

我們可以使用命令行來(lái)編譯和運(yùn)行該類:

~/github/test$ javac -cp .:base C.java ~/github/test$ java -cp .:base C hello interface 1

compatible目錄包含聲明了方法m()抽象的接口I2版本,并且由于技術(shù)原因,它包含未I1.java 。

~/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

該錯(cuò)誤信息非常準(zhǔn)確。 即使我們具有先前編譯中的C.class ,并且即使在compatible目錄中編譯接口,我們?nèi)詫⒂袃蓚€(gè)接口可用于運(yùn)行該類:

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

wrong的第三個(gè)目錄包含I2版本,該版本還定義了方法m() :

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

我們甚至不應(yīng)該去編譯它。 即使該方法是雙重定義的,只要不調(diào)用該方法,該類仍然可以執(zhí)行,但是只要我們嘗試調(diào)用方法m() ,它就會(huì)失敗。 這就是我們使用命令行參數(shù)的目的:

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

結(jié)論

當(dāng)您開(kāi)始將庫(kù)移至Java 8并修改接口以添加默認(rèn)實(shí)現(xiàn)時(shí),您可能不會(huì)遇到問(wèn)題。 至少這是Java 8庫(kù)開(kāi)發(fā)人員希望將功能方法添加到集合中的方式。 使用您的庫(kù)的應(yīng)用程序仍然依賴沒(méi)有默認(rèn)方法的Java 7庫(kù)。 使用和修改不同的庫(kù)時(shí),沖突的可能性很小。 怎么避免呢?

像以前一樣設(shè)計(jì)您的庫(kù)API。 不要輕易依賴默認(rèn)方法的可能性。 他們是不得已的選擇。 明智地選擇名稱,以避免與其他接口沖突。 我們將學(xué)習(xí)如何使用此功能來(lái)開(kāi)發(fā)Java編程。

翻譯自: https://www.javacodegeeks.com/2014/04/java-8-default-methods-what-can-and-can-not-do.html

java8 默認(rèn)方法

總結(jié)

以上是生活随笔為你收集整理的java8 默认方法_Java 8的默认方法:可以做什么和不能做什么?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。