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

 更新时间:2021年11月01日 11:47:12   作者:南风Candy  
接口改动一下就要修改对应的实现类,为了兼容老接口,Java8新增了默认方法和静态方法,下面这篇文章主要给大家介绍了关于Java8中接口新特性的相关资料,需要的朋友可以参考下

前言

在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接口新特性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 聊聊SpringBoot使用Nacos进行服务注册发现与配置管理问题

    聊聊SpringBoot使用Nacos进行服务注册发现与配置管理问题

    Nacos支持基于DNS和基于RPC的服务发现(可以作为springcloud的注册中心)、动态配置服务(可以做配置中心)、动态 DNS 服务。本文重点给大家介绍SpringBoot使用Nacos进行服务注册发现与配置管理,感兴趣的朋友一起看看吧
    2022-01-01
  • Kotlin 基本语法实例详解

    Kotlin 基本语法实例详解

    这篇文章主要介绍了Kotlin 基本语法实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • springboot整合企微webhook机器人发送消息提醒

    springboot整合企微webhook机器人发送消息提醒

    这篇文章主要为大家介绍了springboot整合企微webhook机器人发送消息提醒,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 分享Spring的下载组件

    分享Spring的下载组件

    这篇文章主要为大家分享了Spring的下载组件,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 使用RedisAtomicLong优化性能问题

    使用RedisAtomicLong优化性能问题

    这篇文章主要介绍了使用RedisAtomicLong优化性能问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Spring Boot Mysql 数据库操作示例

    Spring Boot Mysql 数据库操作示例

    本篇文章主要介绍了Spring Boot Mysql 数据库操作示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • java编写的文件管理器代码分享

    java编写的文件管理器代码分享

    本文给大家分享的是一则使用java编写的文件管理器的代码,新人练手的作品,逻辑上还是有点小问题,大家帮忙看看吧。
    2015-04-04
  • Java中@DS+@Transactional注解切换数据源失效解决方案

    Java中@DS+@Transactional注解切换数据源失效解决方案

    本文主要介绍了@DS+@Transactional注解切换数据源失效解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java 使用Graphics2D在图片上写字

    java 使用Graphics2D在图片上写字

    这篇文章主要介绍了java 使用Graphics2D在图片上写字,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • JavaWeb ServletContext基础与应用详细讲解

    JavaWeb ServletContext基础与应用详细讲解

    ServletConfig对象,叫Servlet配置对象。主要用于加载配置文件的初始化参数。我们知道一个Web应用里面可以有多个servlet,如果现在有一份数据需要传给所有的servlet使用,那么我们就可以使用ServletContext对象了
    2023-01-01

最新评论