聊聊java中的多继承,解决Java8接口default方法多继承冲突问题【享学Java】(下)

简介: 聊聊java中的多继承,解决Java8接口default方法多继承冲突问题【享学Java】(下)

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 {
}


不了编译报错如下:


image.png


说明:如果只实现一个接口,编译不会报错且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方法冲突的三步骤:


  1. 方法签名相同时,才表示出现了冲突。
  2. 类中的方法优先级最高。类或者父类中的方法实现优先级大于任何接口的默认方法
  3. 其实,子接口的默认方法优先级更高。
  4. 若最终还是无法判断,那么实现类必须通过显示复写的方式复写默认方法,然后再自己通过xxx.super.xxx()的方式来指定具体使用哪个接口的实现


总之,Java8在语言层面上,对若出现接口default方法冲突的解决方案是:不作为。其实不作为也是一种作为,它让编译器去提示调用者必须显示的override这个冲突的方法,让coder自己去决定调用逻辑~


总结


写这篇文章的原因是我自己在写default方法的时候出现了冲突,从而决定多java的多继承深入了解一下。

带着问题来驱动学习这样的效果会更好,希望本文也能给你带来帮助~


The last:如果觉得本文对你有帮助,不妨点个赞呗。当然分享到你的朋友圈让更多小伙伴看到也是被作者本人许可的~



相关文章
|
7天前
|
Java
Java中的继承和多态是什么?请举例说明。
Java中,继承让子类继承父类属性和方法,如`class Child extends Parent`,子类可重写父类方法。多态允许父类引用指向子类对象,如`Animal a = new Dog()`,调用`a.makeSound()`会根据实际对象类型动态绑定相应实现,增强了代码灵活性和可扩展性。
8 0
|
14天前
|
搜索推荐 Java
Java的面向对象特性主要包括封装、继承和多态
【4月更文挑战第5天】Java的面向对象特性主要包括封装、继承和多态
13 3
|
8天前
|
Java
Java中ReentrantLock中tryLock()方法加锁分析
Java中ReentrantLock中tryLock()方法加锁分析
10 0
|
1天前
|
Java
Java接口中可以定义哪些方法?
【4月更文挑战第13天】
4 0
Java接口中可以定义哪些方法?
|
2天前
|
设计模式 Java
Java接口与抽象类
Java接口与抽象类
15 0
|
7天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
10 0
|
7天前
|
安全 Java 编译器
接口之美,内部之妙:深入解析Java的接口与内部类
接口之美,内部之妙:深入解析Java的接口与内部类
25 0
接口之美,内部之妙:深入解析Java的接口与内部类
|
8天前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
21 9
|
10天前
|
缓存 安全 Java
Java中函数式接口详解
Java 8引入函数式接口,支持函数式编程。这些接口有单一抽象方法,可与Lambda表达式结合,简化代码。常见函数式接口包括:`Function<T, R>`用于转换操作,`Predicate<T>`用于布尔判断,`Consumer<T>`用于消费输入,`Supplier<T>`用于无参生成结果。开发者也可自定义函数式接口。Lambda表达式使实现接口更简洁。注意异常处理和线程安全。函数式接口广泛应用于集合操作、并行编程和事件处理。提升代码可读性和效率,是现代Java开发的重要工具。
21 0
|
10天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
33 0