接口的默认方法、解决默认方法冲突【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) 的不相关默认值
这里发生了二义性,需要我们自己解决冲突,可以在实现类中覆盖此方法,此案例中把上方实现类中的注释去掉即可


总结

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渣渣高不会写Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值