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

歡迎訪問 生活随笔!

生活随笔

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

java

java的默认值规则_Java 8:默认方法解析规则

發(fā)布時間:2023/12/3 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java的默认值规则_Java 8:默认方法解析规则 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

java的默認(rèn)值規(guī)則

隨著Java 8中默認(rèn)方法的引入,一個類現(xiàn)在可以從多個位置(例如另一個類或接口)繼承相同的方法。 在這種情況下,可以使用以下規(guī)則來確定選擇哪種方法:

  • 類或超類方法聲明始終優(yōu)先于默認(rèn)方法
  • 否則,將使用具有最具體的默認(rèn)提供接口的方法
  • 最后,如果方法同樣特定,則會出現(xiàn)編譯器錯誤,并且您將被迫顯式覆蓋該方法并指定您的類應(yīng)調(diào)用的方法
  • 讓我們看一些示例并應(yīng)用這些規(guī)則。

    范例1:

    以下代碼顯示什么?

    public interface A {default void name() {System.out.println("A");} }public interface B {default void name() {System.out.println("B");} }public class C implements A {@Overridepublic void name() {System.out.println("C");} }public class D extends C implements A, B {public static void main(final String... args) {new D().name();} }

    答案 :C

    這是因為,如規(guī)則1所述,超類C的name()方法聲明優(yōu)先于A和B的默認(rèn)方法聲明。

    范例2:

    以下代碼顯示什么?

    public interface A {default void name() {System.out.println("A");} }public interface B extends A {@Overridedefault void name() {System.out.println("B");} }public class C implements A {}public class D extends C implements A, B {public static void main(final String... args) {new D().name();} }

    答案 :B

    不同于前面的例子, C不覆蓋name()但由于它實現(xiàn)A ,它具有從默認(rèn)方法A 。 根據(jù)規(guī)則2,如果類或超類中沒有方法,則選擇最特定的默認(rèn)提供接口。 因為B擴展了A ,所以它更加具體,因此打印了“ B”。

    范例3:

    以下代碼顯示什么?

    public interface A {default void name() {System.out.println("A");} }public interface B {default void name() {System.out.println("B");} }public class D implements A, B {public static void main(final String... args) {new D().name();} }

    答 :編譯器錯誤! Duplicate default methods named name with the parameters () and () are inherited from the types B and A

    在此示例中,沒有更多特定的默認(rèn)提供接口可供選擇,因此編譯器將引發(fā)錯誤。 要解決該錯誤,您需要顯式重寫D的方法,并指定要D使用的方法聲明。 例如,如果要使用B :

    class D implements A, B {@Overridepublic void name() {B.super.name();} }

    范例4:

    以下代碼顯示什么?

    public interface A {default void name() {System.out.println("A");} }public interface B extends A {}public interface C extends A {}public class D implements B, C {public static void main(final String... args) {new D().name();} }

    答 :A

    子接口B和C并未覆蓋該方法,因此實際上只有A的方法可供選擇。 附帶說明一下,如果B或C (但不是全部)都覆蓋了該方法,則將應(yīng)用規(guī)則2。 順便說一句,這是鉆石問題 。

    翻譯自: https://www.javacodegeeks.com/2016/06/java-8-default-method-resolution-rules.html

    java的默認(rèn)值規(guī)則

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結(jié)

    以上是生活随笔為你收集整理的java的默认值规则_Java 8:默认方法解析规则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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