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防
- 下一篇: monolith_将Java EE Mo