在Java SE 8之前,interface只是事物的抽象,用来定义统一的抽象事物和描述事物的抽象行为和属性。

但是在Java SE 8中,增加了可以在interface中增加默认实现的行为和事物的静态行为。

一.为什么?

java迭代了如此多的版本且主要采用的都是演化的思想而非重构(为了保证与历史的兼容性)。

这样就容易出现很多比较难以处理的问题,接口在发布之后就已经被定型,除非我们能够一次性更新所有该接口的实现。比如某个历史接口有很多实现,需要在历史接口中增加一个行为,那么久需要在它的所有实现中去实现了该行为,那么无疑是阻碍了演化,向接口中增加默认方法能使得接口仍能逐步发生演化,这也符合自然事物一直在发展的定律。

而且子啊Java SE 8中引入了函数式接口,使用接口中的默认方法和静态方法 便能够突破函数式接口的单个方法限制。

二.示例

接口中的默认方法

public interface TestDefaultMethodApi {

    default void print(String msg) {
System.out.println(msg);
}
}

接口中的静态方法

public interface TestStaticMethodApi {

    static void utilMethod(String msg) {
System.out.println(msg);
}
}

三.用途

默认方法:

  1. 可以在函数式接口中使用
  2. 可以将公共的行为抽象为默认方法,所有实现中都会有该默认方法——这个可以参考Collection
  3. 可以在已经发布的接口中添加默认方法,让接口具有新的行为,能够继续演化发展

静态方法:

  1. 静态更多属性接口或者类型的本身行为,所已经可将一些近与接口耦合的工具方法作为静态方法,实现高内聚

四.使用的注意点

  • 接口中定义了默认方法,那么其实现中都会有该默认方法,但是默认方法是不需要去实现的,如果实现中没有覆盖接口中定义的默认方法,那么实现中调用默认方法表现出的行为能力即接口中实现的默认方法

  • 具体的实现中可以覆盖默认行为的实现,如:Vector向量覆盖了Collection中的removeIf

  • 默认方法只能定义在接口中,如果被定义在其他地方,则编译错误

参考

深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

最新文章

  1. java工程展示问题
  2. [JBoss] - JBAS015874: JBoss AS 7.1.1.Final "Brontes" started - Eclipse中不能正常启动的解决方法
  3. oralce创建用户
  4. linux文件描述符--转载
  5. String 两种实例化方式的区别
  6. ECSHOP - 二次开发指南---购物车篇
  7. 转载:C++ 虚函数表解析
  8. nginx 一般配置实例 静态页面
  9. OpenCascade
  10. iOS 之UICollectionView 之原理介绍
  11. (light oj 1319) Monkey Tradition 中国剩余定理(CRT)
  12. 技术简历这样写,才能得到BAT面试官的青睐
  13. POJ.2175.Evacuation Plan(消圈)
  14. Javascript中 toFixed
  15. PAT 乙级 1018 锤子剪刀布 (20) C++版
  16. spark使用scala读取Avro数据(转)
  17. PAT 1089 狼人杀-简单版(20 分)(代码+测试点分析)
  18. (18)What a planet needs to sustain life
  19. Active Directoty域服务安装
  20. thinkphp 实现rabbitMq常驻进程消费队列

热门文章

  1. 【微信小程序】动态设置图片大小
  2. maven 学习---部署基于Maven的war文件到Tomcat
  3. 我的第一次diy装机记录——小白的装机篇
  4. [b0012] Hadoop 版hello word mapreduce wordcount 运行(二)
  5. CentOs 7.*中配置安装phpMyAdmin的完整步骤记录
  6. MariaDB设置主从复制
  7. 详解MongDB数据库
  8. django-图形验证码(django-simple-captcha)
  9. linux关闭ACPI电源管理模块
  10. 3-剑指Offer: 连续子数组的最大和