接口的默认方法解决默认方法冲突java-jdk8

Posted ggzx666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口的默认方法解决默认方法冲突java-jdk8相关的知识,希望对你有一定的参考价值。


前言


一、接口默认方法有什么意义

在jdk8中接口新增了默认方法,
在jdk8以前,接口中的所有方法都是没有方法体的抽象方法,实现了该接口的类都需要实现接口中的所有方法。


现在如果有一个接口和很多个实现该类的接口
情景1:假如我们需要在接口中新增一个方法供部分类使用,那么在jdk8以前,我们可以通过new一个抽象类然后抽象类继承这个接口,抽象类新增一个方法,然后让部分类继承抽象类就好了。
情景2:假如我们需要在接口中新增一个方法供所有类使用,在jdk8以前,我们需要新建一个抽象类,在抽象类加一个方法,然后所有类继承抽象类,但是这其实还是很麻烦,毕竟所有类都需要修改
现在,接口中可以使用默认方法,这样所有类都可以使用或者覆盖接口的默认方法,可以很方便的解决以上问题。

二、实战演示

1.基础使用

public interface IUSB 
    default void insert()
        System.out.println("IUSB:插入USB");
    
    default void insert(String name)
        System.out.println("IUSB:插入USB"+name);
    


2.默认方法冲突

接口中有了默认方法,就引发了一个问题,假如一个类继承了一个父类和接口,接口的默认方法名和父类的一个方法名相同,怎么办?

public interface IUSB 
    default void insert()
        System.out.println("IUSB:插入USB");
    
    default void insert(String name)
        System.out.println("IUSB:插入USB"+name);
    



public class Template 
    public void insert()
        System.out.println("Template:插入USB");
    



public class USB extends Template implements IUSB
    public static void main(String[] args) 
        USB usb=new USB();
        usb.insert();
        usb.insert("手机");
    
//    public void insert(String name)
//        System.out.println("USB:插入接口"+name);
//    

结果:
Template:插入USB
IUSB:插入USB手机

解释:接口中有两个默认方法,一个带参一个不带参,父类有一个带参方法,三个方法名都一样,实现类调用无参方法,就调用父类方法,调用有参方法,因为父类没有参数是String的方法,所以调用的是接口的默认方法。 总结:在方法名和参数相同的时候,调用父类的方法。否则调用与参数匹配的方法、
第三个代码的注释部分是覆盖接口的insert方法,当去掉注释后结果: Template:插入USB IUSB:插入USB手机 可以证明,实现类可以覆盖接口中的默认方法。

上面是接口和父类的方法冲突,那么两个接口的默认方法冲突会怎么样?
在上面代码的基础上新加一个接口,并让实现类实现这个类

public interface IUSB2 
    default void insert(String name)
        System.out.println("ISUB2:插入USB"+name);
    


public class USB extends Template implements IUSB,IUSB2
    public static void main(String[] args) 
        USB usb=new USB();
        usb.insert();
        usb.insert("手机");
    
//    public void insert(String name)
//        System.out.println("USB:插入接口"+name);
//    


结果:java: 类 USB从类型 IUSB 和 IUSB2 中继承了insert(java.lang.String) 的不相关默认值
这里发生了二义性,需要我们自己解决冲突,可以在实现类中覆盖此方法,此案例中把上方实现类中的注释去掉即可


总结

以上是关于接口的默认方法解决默认方法冲突java-jdk8的主要内容,如果未能解决你的问题,请参考以下文章

Java实现两个接口并解决默认方法冲突:为什么使用super关键字?

《Java8实战》读书笔记08:接口的默认方法

《Java8实战》读书笔记08:接口的默认方法

Java 8 默认方法和多继承深入解析

Java8函数式接口/Lambda表达式/接口默认方法/接口静态方法/接口冲突方法重写/lambda表达式指定泛型类型等

java遗珠之接口方法