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 相关文章推荐
浅谈什么是SpringBoot异常处理自动配置的原理
Jun 21 Java/Android
IDEA使用SpringAssistant插件创建SpringCloud项目
Jun 23 Java/Android
探讨Java中的深浅拷贝问题
Jun 26 Java/Android
Java 泛型详解(超详细的java泛型方法解析)
Jul 02 Java/Android
JavaGUI模仿QQ聊天功能完整版
Jul 04 Java/Android
Java使用Unsafe类的示例详解
Sep 25 Java/Android
SpringDataJPA在Entity中常用的注解介绍
Dec 06 Java/Android
Java 超详细讲解数据结构中的堆的应用
Apr 02 Java/Android
Java工作中实用的代码优化技巧分享
Apr 21 Java/Android
mybatis-plus模糊查询指定字段
Apr 28 Java/Android
HttpClient实现文件上传功能
Aug 14 Java/Android
Java Redisson多策略注解限流
Sep 23 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中过滤非法字符的具体实现
2013/10/29 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
PHP文件操作实例总结
2016/09/27 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
js 操作符实例代码
2009/10/24 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
微信JS接口大全
2016/08/25 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
element实现合并单元格通用方法
2019/11/13 Javascript
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
[01:03:47]VP vs NewBee Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
Python编写屏幕截图程序方法
2015/02/18 Python
详解Python的Django框架中的中间件
2015/07/24 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
python安装twisted的问题解析
2018/08/21 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
事业单位接收函
2014/01/10 职场文书
高中生期末评语大全
2014/01/28 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
酒店开业主持词
2015/07/02 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书