IT袋

当前位置:主页 > 经验教程 > 软件教程 >

java接口默认方法什么用

java接口默认方法什么用 关于java接口简单例子(2)

更新:2023-08-25 16:48:09 来源:IT袋 作者:苏晓敏
导读:java接口默认方法什么用,如图1,是这个场景的UML图。 我们对照上面三条规则来看,类C中main()方法会输出什么? 规则(1))不满足。因为B继承了A,所以B比A更具体,所以应该选择B的

java接口默认方法什么用

java接口默认方法什么用

如图1,是这个场景的UML图。

我们对照上面三条规则来看,类C中main()方法会输出什么?

规则(1))不满足。因为B继承了A,所以B比A更具体,所以应该选择B的hello()方法。所以,程序会打印输出”hello from B”。

场景2:

如果C像下面这样继承了D,会怎么样?

public class D implements A {}public class C extends D implements A, B { public static void main(String[] args) { new C().hello(); }}

java接口默认方法什么用

如图2,是这个场景的UML图。

同样,我们对照着三条规则来看:

C虽然继承了D,但D中未覆盖A的默认方法。接着,编译器会在A和B中做选择,由于B更具体,所以,程序会打印输出”hello from B”。

场景3:

将上面的D稍作修改:

public class D implements A { public void hello() { System.out.println("hello from D"); }}

结果又如何?

由于依据规则(1),父类中声明的方法具有更高的优先级,所以程序会打印输出”hello from D”。

场景4:

假设现在B不在继承A:

public interface A { default void hello() { System.out.println("hello from A"); }}public interface B { default void hello() { System.out.println("hello from B"); }}public class C implements A, B { public static void main(String[] args) { new C().hello(); }}

java接口默认方法什么用

如图3,是这个场景的UML图。

此时,由于编译器无法识别A还是B的实现更加具体,所以会抛出编译错误:”C inherits unrelated defaults for hello() from types A and B“。

像这种场景要解决冲突,可以在C中覆盖hello()方法并在方法内显示的选择调用A还是B的方法。

调用方式如下:

public class C extends D implements A, B { public void hello() { // 显式地选择调用接口B中的方法 // 同理,要调用接口A中的方法,可以这样:A.super.hello() B.super.hello(); } public static void main(String[] args) { // 输出 hello from B new C().hello(); }}

场景5:

public interface A { default void hello() { System.out.println("hello from A"); }}public interface B extends A{}public interface C extends A{}public class D implements B, C { public void hello() { new D().hello(); }}

java接口默认方法什么用

此时,只有一个方法申明可以选择,所以程序会输出”hello from A”。

欢迎工作一到五年的Java工程师朋友们加入Java程序员开发: 721575865

相关阅读