栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 前言
  • 一、接口默认方法有什么意义
  • 二、实战演示
    • 1.基础使用
    • 2.默认方法冲突
  • 总结


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

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


总结
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/665803.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号