java8新特性之接口默认方法示例详解

 更新时间:2020年08月16日 14:21:48   作者:嘎嘎嘎9803  
这篇文章主要给大家介绍了关于java8新特性之接口默认方法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

JAVA8 已经发布很久,而且毫无疑问,java8 是自 java5(2004年发布)之后的最重要的版本。其中包括语言、编译器、库、工具和 JVM 等诸多方面的新特性。Java8 新特性列表如下:

  • 接口默认方法
  • 函数式接口
  • Lambda 表达式
  • 方法引用
  • Stream
  • Optional 类
  • Date API
  • Base64
  • 重复注解与类型注解

接口默认方法

1、什么是接口默认方法

从 Java8 开始,程序允许在接口中包含带有具体实现的方法,使用 default 修饰,这类方法就是默认方法。默认方法在接口中可以添加多个,并且 Java8 提供了很多对应的接口默认方法。

2、设计接口默认方法好处

使用接口编程的好处是的开发是面向抽象而不再是面向具体来编程,使得程序变得很灵活,缺陷是,当需要修改接口时候,此时对应需要修改全部实现该接口的类,举个例子, java 8 之前对于我们常用的集合框架没有 foreach 方法,通常能想到的解决办法是在 JDK 里给相关的接口添加新的方法及实现。从 Java8 开始,引入了接口默认方法,这样的好处也是很明显的,首先解决了 Java8 以前版本接口兼容性问题,同时对于我们以后的程序开发,也可以在接口子类中直接使用接口默认方法,而不再需要再各个子类中各自实现响应接口方法。

3、默认方法

jdk8 中,接口可以包含实现方法,需要使用 default 修饰,此类方法称为默认方法。默认方法在接口中必须提供实现,在实现类中可以按需重写。默认方法只能在实现类中或通过实现类对象调用。注意:当多个父接口中存在相同的默认方法时,子类中以就近原则继承。

public interface IMathOperation {
  /**
  * 定义接口默认方法 支持方法形参
  */
  default void print(){
    System.out.println("这是数值运算基本接口。。。");
   }
}

4、静态方法

静态方法即通过 static 修饰的方法。接口中静态方法页也必须实现,提供了可以直接通过接口调用方法的方式。

public interface IMathOperation {
  /**
  * 定义接口默认方法 支持方法形参
  */
    default void print(){
    System.out.println("这是数值运算基本接口。。。");
  }
  
  /**
  * 定义静态默认方法
  */
    static void version(){
    System.out.println("这是1.0版简易计算器");
   }  
}

5、接口默认方法使用

定义 IMathOperation 接口并提供默认打印方法

public interface IMathOperation {
  /**
  * 定义接口默认方法 支持方法形参
  */
    default void print(){
    System.out.println("这是数值运算基本接口。。。");
   }
  
  /**
  * 定义静态默认方法
  */
    static void version(){
    System.out.println("这是1.0版简易计算器");
   }

  /**
  * 整数加法运算方法
  * @param a
  * @param b
  * @return
  */
    public int add(int a,int b);
}

子类实现

定义 MathOperationImpl 子类 实现 IMathOperation 接口

这里可以看到,在实现 IMathOperation 接口时可以选择实现(也可以不实现 ,在子类方法中直接使用)接口默认方法。

public class MathOperationImpl implements IMathOperation {
  @Override
  public int add(int a, int b) {
    // 子类中可以直接调用父类接口默认方法
    IMathOperation.super.print();
    // 调用父类静态默认方法
    IMathOperation.version();
    return a+b;
   }
}

多个默认方法情况

使用 Java8 开发应用程序是,子类实现多个接口时,对于接口默认方法定义可能会出现多个默认方法,并且接口默认方法可能会出现同名情况,此时对于子类在实现或者调用时通常遵循三条原则:

1、类中的方法优先级最高

2、如果第一条无法进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体

3、如果还是无法判断,继承了多个接口的类必须通过显示覆盖和调用期望的方法,显示地选择使用哪一个默认方法的实现

示例代码如下:

/**
* 定义手机接口 提供默认info方法
*/
public interface Phone {
  default void info(){
    System.out.println("这是一部手机");
   }
}


/**
* 定义MiPhone子接口 并继承 Phone 父接口 同时也提供info方法
*/
public interface MiPhone extends Phone{
  default void info(){
    System.out.println("这是一部小米手机");
   }
}


/**
* 实现 Phone MiPhone 接口
*/
public class M2sPhone implements Phone,MiPhone {

  public static void main(String[] args) {
    new M2sPhone().info();
   }
}

打印结果: 
这是一部小米手机

jdk8 已经发布很久了,而且毫无疑问,java8 是自 java5(2004年发布)之后的最重要的版本。其中包括语言、编译器、库、工具和 JVM 等诸多方面的新特性。

总结

到此这篇关于java8新特性之接口默认方法的文章就介绍到这了,更多相关java8新特性接口默认方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Kotlin 高阶函数 与 Lambda 表达式

    详解Kotlin 高阶函数 与 Lambda 表达式

    这篇文章主要介绍了详解Kotlin 高阶函数 与 Lambda 表达式的相关资料,需要的朋友可以参考下
    2017-06-06
  • java中的日期时间类Date和SimpleDateFormat

    java中的日期时间类Date和SimpleDateFormat

    这篇文章主要介绍了java中的日期时间类Date和SimpleDateFormat,Date类的对象在Java中代表的是当前所在系统的此刻日期时间,说白了就是你计算机上现实的时间,需要的朋友可以参考下
    2023-09-09
  • Java类加载器ClassLoader源码层面分析讲解

    Java类加载器ClassLoader源码层面分析讲解

    ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了
    2022-09-09
  • Java中的ArrayList类常用方法和遍历

    Java中的ArrayList类常用方法和遍历

    这篇文章主要介绍了Java中的ArrayList类常用方法和遍历,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • mybatis-plus-boot-starter包与mybatis-plus-generator的冲突解决

    mybatis-plus-boot-starter包与mybatis-plus-generator的冲突解决

    本文主要介绍了mybatis-plus-boot-starter包与mybatis-plus-generator的冲突解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • SpringBoot如何通过devtools实现热部署

    SpringBoot如何通过devtools实现热部署

    这篇文章主要介绍了SpringBoot如何通过devtools实现热部署,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java Annotation详解及实例代码

    Java Annotation详解及实例代码

    这篇文章主要介绍了Java Annotation详解及实例代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • java项目中读取jdbc.properties文件操作

    java项目中读取jdbc.properties文件操作

    这篇文章主要介绍了java项目中读取jdbc.properties文件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Kotlin基础教程之控制流(顺序,分支,循环)

    Kotlin基础教程之控制流(顺序,分支,循环)

    这篇文章主要介绍了Kotlin基础教程之控制流的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java使用itext5实现PDF表格文档导出

    Java使用itext5实现PDF表格文档导出

    这篇文章主要介绍了Java使用itext5实现PDF表格文档导出,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01

最新评论