Java新特性之Java8的那些事儿-接口默认方法

什么是接口默认方法

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

设计接口默认方法好处

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

接口默认方法语法定义

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

接口默认方法使用

  • 定义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 接口

1553218527709.png
1553218563670.png

这里可以看到,在实现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();
    }
}

打印结果: 
这是一部小米手机
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 本文是Java基础回炉文集的第三篇,关于文集可通过《Java基础回炉和提升暨文集开篇》了解。 今天我们将从接...
    TimeReview阅读 3,704评论 0 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,887评论 1 32
  • 本文结合Java8,重新整理了接口和抽象类的区别,以及如何理解接口的设计目的。并且分析了Java8的接口新特性:d...
    _Zy阅读 7,662评论 0 7
  • 今天妈妈上街带回来了一个存钱罐。这个存钱罐是小鸡形状的,看上去非常可爱。 这个小鸡形状的存钱罐刚买回来我就一眼...
    龙族阅读 3,251评论 0 1
  • 纪录片最打动人的地方,就是真实。 1、 《生门》讲得是女人生孩子的事情。不过跟中国人长久的关注点不一样的是,这次的...
    笔下长青阅读 4,183评论 0 2

友情链接更多精彩内容