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 Swing实现自助取款机系统
Jun 11 Java/Android
浅谈@Value和@Bean的执行顺序问题
Jun 16 Java/Android
Netty结合Protobuf进行编解码的方法
Jun 26 Java/Android
总结Java对象被序列化的两种方法
Jun 30 Java/Android
详解Spring Boot使用系统参数表提升系统的灵活性
Jun 30 Java/Android
Spring Boot 整合 Apache Dubbo的示例代码
Jul 04 Java/Android
dubbo服务整合zipkin详解
Jul 26 Java/Android
使用Spring处理x-www-form-urlencoded方式
Nov 02 Java/Android
Jpa Specification如何实现and和or同时使用查询
Nov 23 Java/Android
SpringBoot中使用Redis作为全局锁示例过程
Mar 24 Java/Android
Java 获取Word中所有的插入和删除修订的方法
Apr 06 Java/Android
java开发双人五子棋游戏
May 06 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
PHP5中虚函数的实现方法分享
2011/04/20 PHP
php读取文件内容的几种方法详解
2013/06/26 PHP
体育彩票排列三组选三算法分享
2014/03/07 PHP
js下利用控制器载入对应脚本
2010/07/17 Javascript
javascript写的日历类(基于pj)
2010/12/28 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
jQuery垂直多级导航菜单代码分享
2015/08/18 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
详解Node.js利用node-git-server快速搭建git服务器
2017/09/27 Javascript
vue中的scope使用详解
2017/10/29 Javascript
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
React styled-components设置组件属性的方法
2018/08/07 Javascript
微信小程序开发的基本流程步骤
2019/01/31 Javascript
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
Tornado高并发处理方法实例代码
2018/01/15 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
python plotly画柱状图代码实例
2019/12/13 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
印度服装购物网站:Limeroad
2018/09/26 全球购物
优秀毕业生找工作自荐信
2014/06/23 职场文书
教师个人读书活动总结
2014/07/08 职场文书
党性分析材料格式
2014/12/19 职场文书
放射科岗位职责
2015/02/14 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL
《传颂之物 虚伪的假面》BD发售宣传CM公开
2022/04/04 日漫
微信小程序调用python模型
2022/04/21 Python