乐字节-Java8新特性-接口默认方法

Elastic
• 阅读 1941

总概

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

Java8 新特性列表如下:

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

接下来乐字节将会带大家一一讲以上Java8新特性详细讲解,作为Java8新特性系列文章连载。

一、接口默认方法

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、接口默认方法使用

1)、定义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);
  }

2)、子类实现

定义MathOperationImpl子类 实现IMathOperation 接口
乐字节-Java8新特性-接口默认方法

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

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

3)、多个默认方法情况

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

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

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

示例代码如下:

/**
 * 定义手机接口  提供默认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();
    }
}

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

乐字节原创,转载请先联系,谢谢阅读。
这是乐字节Java8新特性连载文章之一,欢迎继续关注看下一篇Java8新特性介绍。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
Java8 默认方法 default method
Java8引入了新的语言特性——默认方法(DefaultMethods)。Defaultmethodsenablenewfunctionalitytobeaddedtotheinterfacesoflibrariesandensurebinarycompatibilitywithcodewritte
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
Java8特性
Java8又称jdk1.8。主要新特性:Lambda表达式 −Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。方法引用 −方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
Wesley13 Wesley13
3年前
Java8新特性
前言: Java8已经发布很久了,很多报道表明Java8是一次重大的版本升级。在JavaCodeGeeks上已经有很多介绍Java8新特性的文章,例如 PlayingwithJava8–LambdasandConcurrency(https://www.oschina.net/action/GoToLink?
Wesley13 Wesley13
3年前
Java 8中你可能没听过的10个新特性
lambda表达式,lambda表达式,还是lambda表达式。一提到Java8就只能听到这个,但这不过是其中的一个新功能而已,Java8还有许多新的特性——有一些功能强大的新类或者新的用法,还有一些功能则是早就应该加到Java里了。这里我准备介绍它的10个我个人认为非常值得了解的新特性。总会有一款适合你的,开始来看下吧。default方法
Wesley13 Wesley13
3年前
Java8 新特性
Java8新特性一、Java8新特性简介1\.简介Java8(又称为jdk1.8)是Java语言开发的一个主要版本。Java8是orecle公司于2014年3月发布,可以看成是自Java5以来最具革命性的版本。Java8为Java语言、编译器、类库、开发工具与
Wesley13 Wesley13
3年前
Java8—一万字的Lambda表达式的详细介绍与应用案例
  基于Java8详细介绍了lambda表达式的语法与使用,以及方法引用、函数式接口、lambda复合等Java8的新特性!文章目录1Lambda的概述2函数式接口2.1Consumer消费型接口2.2Supplier供给型接口2.3Function<T,R函数型接口
Wesley13 Wesley13
3年前
Java8新特性学习
1简述公司自年初终于开始使用java8作为项目的标准jdk,在开发过程中,逐渐认识到java8的很多新特性,确实很方便.其中内容的核心,在于函数式编程,即将函数本身作为对象参数去处理.其中涉及到三个关键新特性:1.lambda表达式(及函数式接口)2.stream3.方法引用这三个新特性的使用是相辅相
Wesley13 Wesley13
3年前
Java笔记——Java8特性之Lambda、方法引用和Streams
转自: https://www.cnblogs.com/Fndroid/p/6087380.htmlJava8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂。这里涉及三个重要特性:Lambda方法引用
Wesley13 Wesley13
3年前
Java8 新特性 函数式接口
什么是函数式接口  函数式接口是Java8引用的一个新特性,是一种特殊的接口:SAM类型的接口(SingleAbstractMethod)。但是它还是一个接口,只是有些特殊罢了。  函数式接口的出现主要是为了配合Java8的另一个新特性Lamdba表达式来使用。接口中只有一个抽象方法接口
Wesley13 Wesley13
3年前
Java 8 接口里的默认方法特性研究
这篇文章我们将要探讨Java 8中接口里的默认方法特性。Java8指出“默认方法使得新功能被添加到库中的接口里面,同时又能保证与这些接口老版本代码的二进制兼容性。这些年Java进化升级了很多,在Java库中引入的接口需要添加新的功能。在没有默认方法特性时,当你往接口中添加新方法时,接口内部所有实现的类都要历经一些修改。这将导致上千行的代码修改工作量。为了