java的默认值规则_Java 8:默认方法解析规则
java的默認值規則
隨著Java 8中默認方法的引入,一個類現在可以從多個位置(例如另一個類或接口)繼承相同的方法。 在這種情況下,可以使用以下規則來確定選擇哪種方法:
讓我們看一些示例并應用這些規則。
范例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
這是因為,如規則1所述,超類C的name()方法聲明優先于A和B的默認方法聲明。
范例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()但由于它實現A ,它具有從默認方法A 。 根據規則2,如果類或超類中沒有方法,則選擇最特定的默認提供接口。 因為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
在此示例中,沒有更多特定的默認提供接口可供選擇,因此編譯器將引發錯誤。 要解決該錯誤,您需要顯式重寫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 (但不是全部)都覆蓋了該方法,則將應用規則2。 順便說一句,這是鉆石問題 。
翻譯自: https://www.javacodegeeks.com/2016/06/java-8-default-method-resolution-rules.html
java的默認值規則
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java的默认值规则_Java 8:默认方法解析规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可靠的ddos防护厂家(可靠的ddos防
- 下一篇: 安卓怎么进入开发者模式(安卓怎么进入)