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 16 Java/Android
详解Spring事件发布与监听机制
Jun 30 Java/Android
详解Spring Boot使用系统参数表提升系统的灵活性
Jun 30 Java/Android
解决Jenkins集成SonarQube遇到的报错问题
Jul 15 Java/Android
mybatis3中@SelectProvider传递参数方式
Aug 04 Java/Android
Java中try catch处理异常示例
Dec 06 Java/Android
Java实现给Word文件添加文字水印
Feb 15 Java/Android
Java设计模式之享元模式示例详解
Mar 03 Java/Android
Netty分布式客户端处理接入事件handle源码解析
Mar 25 Java/Android
Spring Security使用单点登录的权限功能
Apr 03 Java/Android
Java Spring Lifecycle的使用
May 06 Java/Android
Android基础入门之dataBinding的简单使用教程
Jun 21 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
PHP文件大小格式化函数合集
2014/03/10 PHP
typecho插件编写教程(二):写一个新插件
2015/05/28 PHP
JavaScript 构造函数 面相对象学习必备知识
2010/06/09 Javascript
JQuery从头学起第三讲
2010/07/06 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
jquery 淡入淡出效果的简单实现
2014/02/07 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
js返回顶部实例分享
2016/12/21 Javascript
使用JavaScript为一张图片设置备选路径的方法
2017/01/04 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
小程序实现tab标签页
2020/11/16 Javascript
Python实现的Kmeans++算法实例
2014/04/26 Python
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
python TCP包注入方式
2020/05/05 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
python palywright库基本使用
2021/01/21 Python
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
cf收人广告词大全
2014/03/14 职场文书
村干部承诺书
2014/03/28 职场文书
大学生毕业评语
2014/12/31 职场文书
公司放假通知怎么写
2015/04/15 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript
vue中data里面的数据相互使用方式
2022/06/05 Vue.js