Java8中接口的新特性使用指南


Posted in Java/Android onNovember 01, 2021

前言

在Java8中接口中不再只有抽象方法,还可以有静态方法以及默认方法,此时的接口更像是一个类。我们一起来看看如何使用吧~

Java8中,可以为接口添加静态方法和默认方法。

静态方法:使用static关键字修饰。可以通过接口直接调用静态方法,并执行其方法体

默认方法:使用default关键字修饰。可以通过类来调用

直接看代码吧

package com.nanfeng.demo.interfacepractice.java8;
 
/**
 * java8中的新特性
 * 在接口中默认方法的权限是public,所以public也可以省略
 */
public interface CompareA {
    // 接口中可以定义抽象方法
    public static void method1() {
        System.out.println("Java8中接口中可以定义静态方法,通过接口来调用--1");
    }
 
    // 默认方法
    public default void method2() {
        System.out.println("Java8中接口中可以定义默认方法--2");
    }
    public default void method3() {
        System.out.println("Java8中接口中可以定义默认方法--3");
    }
}

编写测试类ComepareTest

package com.nanfeng.demo.interfacepractice.java8;
 
public class CompareATest {
    public static void main(String[] args) {
        // 创建实现类对象
        CompareAClass c = new CompareAClass();
        /**
         * 知识点一:接口中的静态方法 只能通过接口来调用
         * Static method may be invoked on containing interface class only
         * 静态方法只能在包含接口类时调用         */
        // c.method1();
 
        // 使用接口调用method1()方法,此时的接口有点像工具类了
        CompareA.method1();
        /**
         * 知识点二:
         * 默认方法,可以通过创建实现类的对象来调用接口中的默认方法
         * 或者也可以对接口中的默认方法进行重写
         */
        c.method2();
    }
}
 
class CompareAClass implements CompareA {
    /**
     * 在实现类中对接口中的默认方法进行重写时
     * 注意:不可以省略public权限修饰,否则会报错
     * 执行时,依然会调用我们重写后的方法,符合继承
     *
     *
     */
    @Override
    public void method2() {
        System.out.println("Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略");
    }
}

运行结果:

Java8中接口中可以定义静态方法,通过接口来调用
Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略--2

第一种情况,一个类实现了接口的同时又继承了一个父类

1、创建实现类的父类

package com.nanfeng.demo.interfacepractice.java8;
 
/**
 * 实现类的父类
 */
public class SuperClass {
    // 定义与接口中同名的方法
    public void method3(){
        System.out.println("实现类的父类中,出现和接口中同名同参数的方法--SuperClass");
    }
}

2、让子类实现接口的同时继承父类

package com.nanfeng.demo.interfacepractice.java8;
 
public class CompareATest {
    public static void main(String[] args) {
        // 创建实现类对象
        CompareAClass c = new CompareAClass();
        /**
         * 知识点一:接口中的静态方法 只能通过接口来调用
         * Static method may be invoked on containing interface class only
         * 静态方法只能在包含接口类时调用         */
        // c.method1();
 
        // 使用接口调用method1()方法,此时的接口有点像工具类了
        CompareA.method1();
        /**
         * 知识点二:
         * 默认方法,可以通过创建实现类的对象来调用接口中的默认方法
         * 或者也可以对接口中的默认方法进行重写
         */
        c.method2();
         /**
         * 知识点三:
         * 父类中的方法和接口中的方法同名时应该怎么处理?
         * 如果子类(或实现类)继承的父类和实现的接口中声明了同名同参的方法
         * 那么在子类没有重写此方法时,默认的调用的是父类中同名同参的方法。
         * -->类优先原则
         */
        c.method3();
    }
}
 
class ComepareAClass extends SuperClass implements CompareA {
    /**
     * 在实现类中对接口中的默认方法进行重写时
     * 注意:不可以省略public权限修饰,否则会报错
     * 执行时,依然会调用我们重写后的方法,符合继承
     */
    @Override
    public void method2() {
        System.out.println("Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略");
    }
 
 
}

运行查看结果:

Java8中接口中可以定义静态方法,通过接口来调用--1
Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略--2
实现类的父类中,出现和接口中同名的方法--SuperClass

情况二

实现类在没有继承父类的前提下,对多个接口进行实现,应该如何处理

1、创建CompareB接口,创建和CompareA接口中通同参的默认方法

注意:如果一个类同时继承多个接口,接口中出现同名同参的默认方法时,会出现接口冲突。此时,实现类必须重写此方法

/**
 * Java接口中支持接口的多继承
 * 情况一:
 * class ComepareAClass extends SuperClass implements CompareA
 * CompareA接口和SuperClass父类出现同名同参的方法时,默认会调用父类中的方法,体现了类优先原则
 * 情况二:
 * class ComepareAClass implements CompareA, CompareB
 * 在没有继承父类的前提下,一个类对多个接口继承的前提下,两个接口中定义了同名同参的默认方法,会如何执行?
 * 知识点四:
 * 如果一个实现类实现了多个接口,而这多个接口中定义了同名同参的默认方法,那么在实现类没有重写此方法的情况下,报错
 * -->会出现借口冲突
 * 这就必须我们在实现类中重写此方法
 *
 */
class CompareAClass implements CompareA, CompareB {
    /**
     * 在实现类中对接口中的默认方法进行重写时
     * 注意:不可以省略public权限修饰,否则会报错
     * 执行时,依然会调用我们重写后的方法,符合继承
     */
    @Override
    public void method2() {
        System.out.println("Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略--2");
    }
    // 解决接口冲突,必须对接口中的方法进行重写
    @Override
    public void method3() {
        System.out.println("ComepareAClass实现类对多个接口中的同名方法进行重写,重写后执行的就是实现类中的方法--method3()");
    }
}

运行结果:

Java8中接口中可以定义静态方法,通过接口来调用--1
Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略--2
ComepareAClass实现类对多个接口中的同名方法进行重写,重写后执行的就是实现类中的方法--method3()

情况三

在子类(或实现类)中自己定义的方法中,调用接口和父类中没有被重写的方法

/**
 * Java接口中支持接口的多继承
 * 情况一:
 * class ComepareAClass extends SuperClass implements CompareA
 * CompareA接口和SuperClass父类出现同名同参的方法时,默认会调用父类中的方法,体现了类优先原则
 * 情况二:
 * class ComepareAClass implements CompareA, CompareB
 * 在没有继承父类的前提下,一个类对多个接口继承的前提下,两个接口中定义了同名同参的默认方法,会如何执行?
 * 知识点四:
 * 如果一个实现类实现了多个接口,而这多个接口中定义了同名同参的默认方法,那么在实现类没有重写此方法的情况下,报错
 * -->会出现借口冲突
 * 这就必须我们在实现类中重写此方法
 * 情况三:
 * class CompareAClass extends SuperClass implements CompareA, CompareB
 * 一个子类(或实现类)继承父类的同时实现多个接口
 * 在子类(或实现类)中自己定义的方法中,调用接口和父类中没有被重写的方法
 * */
class CompareAClass extends SuperClass implements CompareA, CompareB {
    /**
     * 在实现类中对接口中的默认方法进行重写时
     * 注意:不可以省略public权限修饰,否则会报错
     * 执行时,依然会调用我们重写后的方法,符合继承
     */
    @Override
    public void method2() {
        System.out.println("Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略--2");
    }
    // 解决接口冲突,必须对接口中的方法进行重写
    @Override
    public void method3() {
        System.out.println("ComepareAClass实现类对多个接口中的同名方法进行重写,重写后执行的就是实现类中的方法--method3()");
    }
 
    /**
     * 知识点五:如何在子类(或实现类)的方法中调用父类(或者接口中)没有被重写的方法
     */
    public void myMethod(){
        // 调用自己重写的method3()方法
        this.method3();
        // 调用父类中声明的method3()方法
        super.method3();
        // 调接口中的默认方法(注意:是非静态方法,所以不可以使用接口名调用)
        //调用方式:接口名.super.方法
        CompareA.super.method3();
        CompareB.super.method3();
 
    }
}

总结

到此这篇关于Java8中接口新特性的文章就介绍到这了,更多相关Java8接口新特性内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
探讨Java中的深浅拷贝问题
Jun 26 Java/Android
Spring Boot两种全局配置和两种注解的操作方法
Jun 29 Java/Android
springboot项目以jar包运行的操作方法
Jun 30 Java/Android
解决Swagger2返回map复杂结构不能解析的问题
Jul 02 Java/Android
Spring Cloud Gateway去掉url前缀
Jul 15 Java/Android
Java8中接口的新特性使用指南
Nov 01 Java/Android
Mybatis是这样防止sql注入的
Dec 06 Java/Android
JavaCV实现照片马赛克效果
Jan 22 Java/Android
MyBatis配置文件解析与MyBatis实例演示
Apr 07 Java/Android
Android开发之WECHAT微信小程序路由跳转的两种形式
Apr 12 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
Jul 07 Java/Android
Spring中的使用@Async异步调用方法
Nov 01 #Java/Android
MyBatis自定义SQL拦截器示例详解
Oct 24 #Java/Android
java多态注意项小结
Spring Security中用JWT退出登录时遇到的坑
Java实现房屋出租系统详解
Oct 05 #Java/Android
Java Spring 控制反转(IOC)容器详解
Java spring定时任务详解
You might like
php 表单验证实现代码
2009/03/10 PHP
Yii查询生成器(Query Builder)用法实例教程
2014/09/04 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
js不是基础的基础
2006/12/24 Javascript
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
JQuery toggle使用分析
2009/11/16 Javascript
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
JavaScript 学习笔记之操作符(续)
2015/01/14 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
TensorFlow数据输入的方法示例
2018/06/19 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
荷兰时尚精品店:Labels Fashion
2020/03/22 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
移动通信行业实习自我鉴定
2013/09/28 职场文书
海飞丝的广告词
2014/03/20 职场文书
小学生评语大全
2014/04/18 职场文书
食品安全标语
2014/06/07 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
教师个人发展总结
2015/02/11 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python