java接口默认方法什么用 关于java接口简单例子(2)
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(); }}

如图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(); }}

如图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(); }}

此时,只有一个方法申明可以选择,所以程序会输出”hello from A”。
欢迎工作一到五年的Java工程师朋友们加入Java程序员开发: 721575865
相关阅读
-
steam有双人游戏吗 steam双人游戏两个人都要买吗介绍
IT电脑小知识篇,关于steam双人游戏两个人都要买吗介绍的相关经验,关于steam有双人游戏吗 steam双人游戏两个人都要买吗介绍,请看下面详细的介绍。 自从双人成行爆火后,steam上其他的一些
-
美团团购怎么弄 美团团购怎么弄便宜
今天带来的生活小经验美团团购怎么弄方面的介绍,关于美团团购怎么弄 美团团购怎么弄便宜,一起跟随小编看看吧! 总结:1、进入美团优选:在美团界面中,点击美团优选进入。2、选择自
-
qq里的一起听歌在哪里 qq音乐一起听歌记录在哪里
本文摘要:qq音乐一起听歌记录在哪里的介绍,qq音乐不可以查一起听记录,但邀请好友一起听歌后,会在一起听页面看到最近邀请过的好友,邀请好友一起听歌一共有三步。具体操作如下:
-
网易云耳机怎么恢复双耳模式 网易云耳机怎么切换双耳模式
你是不是想知道网易云耳机怎么恢复双耳模式方面的内容,网易云耳机恢复双耳模式共三步,只需使用耳机开关键进行操作即可。具体步骤如下:


