接口的默认方法解决默认方法冲突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函数式接口/Lambda表达式/接口默认方法/接口静态方法/接口冲突方法重写/lambda表达式指定泛型类型等