zoukankan      html  css  js  c++  java
  • 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 接口

    img

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

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

    最全的学习资料 → 卫星:lezijie007(暗号:66)

    多个默认方法情况

    使用 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();
      	}
    }
    
    打印结果: 
    这是一部小米手机
    

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

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

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

    
    
    
    jdk8 已经发布很久了,而且毫无疑问,java8 是自 java5(2004年发布)之后的最重要的版本。其中包括语言、编译器、库、工具和 JVM 等诸多方面的新特性。
  • 相关阅读:
    AppDelegate动态加载StoryBoard
    带交互的 iOS 产品原型可以用什么软件制作?
    day06.1-module模块和包介绍
    day05.2-一个文件的增删改查实例
    day05.1-文件处理
    day04.4-装饰器
    day04.3-生成器
    day04.2-迭代器
    day04.1-三元表达式与列表解析
    day03.2-内置函数的使用
  • 原文地址:https://www.cnblogs.com/lezijie/p/13411755.html
Copyright © 2011-2022 走看看