Java8接口默认方法的多继承问题
我们知道Java8的一大新特性的是:接口中可以写default方法了。这其实是java自己就给自己出了一个问题。
接口可以书写默认方法了,然后又因为接口之间是可以多继承的,因而实质上Java 8的接口多继承其实也会涉及到实现多继承的问题。下面我们通过一个实例来看看Java它在语法层面的解决方案:
interface Father { default void eat() { System.out.println("爸爸吃饭方式..."); } } interface Mother { default void eat() { System.out.println("妈妈吃饭方式..."); } }
爸爸妈妈都是接口定义,所以儿子Son实现两个接口理论上肯定是阔以的:
class Son implements Father, Mother { }
不了编译报错如下:
说明:如果只实现一个接口,编译不会报错且default方法是能直接通过实例调用的。
==解决方案: ==
class Son implements Father, Mother { @Override public void eat() { System.out.println("儿子自己的吃饭方式~~~"); // 注意这种语法是调用 【指定接口】的defualt方法: // 若接口名字没有冲突,直接super调用即可~~~ Father.super.eat(); Mother.super.eat(); } }
测试:
public class Main { public static void main(String[] args) { new Son().eat(); } }
输出结果:
儿子自己的吃饭方式~~~ 爸爸吃饭方式... 妈妈吃饭方式...
归纳总结:解决接口default方法冲突的三步骤:
- 方法签名相同时,才表示出现了冲突。
- 类中的方法优先级最高。类或者父类中的方法实现优先级大于任何接口的默认方法
- 其实,子接口的默认方法优先级更高。
- 若最终还是无法判断,那么实现类必须通过显示复写的方式复写默认方法,然后再自己通过xxx.super.xxx()的方式来指定具体使用哪个接口的实现
总之,Java8在语言层面上,对若出现接口default方法冲突的解决方案是:不作为。其实不作为也是一种作为,它让编译器去提示调用者必须显示的override这个冲突的方法,让coder自己去决定调用逻辑~
总结
写这篇文章的原因是我自己在写default方法的时候出现了冲突,从而决定多java的多继承深入了解一下。
带着问题来驱动学习这样的效果会更好,希望本文也能给你带来帮助~
The last:如果觉得本文对你有帮助,不妨点个赞呗。当然分享到你的朋友圈让更多小伙伴看到也是被作者本人许可的~