hi ! 我是小小,我们又见面了,今天是本周的第五篇,本篇将会着重的讲解一个Java8的新特性。

前言

从一道面试题说起

A:接口里可以写方法吗?

B:可以的,默认就是抽象方法。

A:那接口里可以写实现方法吗?

B:不可以,所有的方法必须是抽象的。

A:你确定?

B:确定。。。。

好吧。这的的确确让人有点怀疑,所以本文就从这开始着手,

这里介绍一个Java8的新特性,接口增强

静态方法和默认方法

我们可以在Comparator接口的源码中,看到大量类似下面这样的方法声明。

//default关键字修饰的默认方法default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor) {return thenComparing(comparingInt(keyExtractor));}//Comparator接口中的静态方法public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;}

其中thenComparingInt()就是一个默认方法,它使用 default 关键字修饰。这是Java8引入的新功能,接口中的可以声明默认方法和静态方法。

默认方法带来的多继承问题

在此之前,Java中的类只支持多重继承,不支持多继承,现在有了默认方法,你可以以另外一种方式实现类的多继承行为,即,一个类实现多个接口,而这几个接口都有声明自己的默认方法。

这里面引发了一个多继承问题,设想一下,假如一个类从多个接口中继承了它们声明的默认方法,而这几个默认方法使用的都是相同的函数签名,那么程序运行时,类会选择调用那个方法

第一份代码

@Testpublic void test2() {new C().hello();//result: hello from D}interface A {default void hello() {System.out.println("heelo from A");}}interface B extends A {default void hello() {System.out.println("heelo from B");}}class D implements A{public void hello() {System.out.println("hello from D");}}class C extends D implements A, B{}

这份代码输出的结果是 hello from D,可以看到 C 类的父类D,父接口A,父接口B都定义了一个相同函数签名的hello(),最后实际调用的是父类D中声明的方法。

第二份代码

 @Testpublic void test4() {new I().hello();//result: heelo from G}class I implements G, H { }interface G extends E {default void hello() {System.out.println("heelo from G");}}interface H extends E { }interface E {default void hello() {System.out.println("heelo from E");}}

代码清单二的输出结果是 hello from G,可以看到 I 类的父接口 G,父接口E都定义了一个相同函数签名 hello(),最后实际调用的是父类接口G中声明的方法。

第三份代码

 @Testpublic void test3() {new F().hello(); //result: heelo from E}interface A {default void hello() {System.out.println("heelo from A");}}interface E {default void hello() {System.out.println("heelo from E");}}class F implements A, E {public void hello() {//这里接口A和E不再具有继承关系,需显式的选择调用接口E或A中的方法,否则无法通过编译E.super.hello();}}

第三份代码,类F必须显式的覆盖父接口的hello方法,否则无法通过编译器的检测,因为编译器无法确定父接口A和父接口E中的默认方法哪一个优先。这种情况下,如果你想调用某个父接口的默认方法,可以使用 接口名.super.默认方法名这种方式进行调用。

总结

Java8的新特性:接口中可以声明默认方法和静态方法。另外,接口默认方法带来的多继承问题,即,如果一个类使用相同的函数签名从多个地方继承了方法,通过这三种规则可以判断

  1. 类中的方法优先级最高。类或父类中声明的方法的优先级高于任何声明为默认方法的优先级。

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

  3. 最后, 如果还是无法判断, 继承了多个接口的类必须通过显式覆盖和调用期望的方法, 显式地选择使用哪一个默认方法的实现(调用语法:  接口名.super.默认方法名 )。

关于作者

我是小小,一个生于二线,活在一线城市的程序猿,我是小小,我们下期再见。

小明菜市场

推荐阅读

● MySql | 为什么大家都在说 Select * 效率低

● k8s | 搞不明白为什么大家都在学习 k8s

● 对战 | RabbitMq 大战 kafka

● 执行流程 | 你真的了解Spring AOP的执行顺序吗?

● 吊打面试官 | Java到底是值传递还是引用传递

给我个好看再走好吗?

新特性 | Java8 的这个特性,用起来真的很爽!相关推荐

  1. Java 8 的这个新特性,用起来真的很爽!

    作者 | 小明菜市场 来源 | 小明菜市场(ID:fileGeek) 头图 |  CSDN 下载自东方IC 前言 从一道面试题说起 A:接口里可以写方法吗? B:可以的,默认就是抽象方法. A:那接口 ...

  2. Clion新UI体验,墙裂推荐,用起来真的好爽啊!

    Clion新UI体验 效果展示 学生认证过了JetBrains全家桶之后,发现全家桶是真香啊,最近用Clion的时候发现了新的UI可以用,特此分享. 看一下展开的图,相当漂亮, 工具栏挪到了左上角,看 ...

  3. Atitit.jdk java8的语法特性详解 attilax 总结

    Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不 ...

  4. OpenCV4.0-alpha发布!新增多个深度学习特性

    OpenCV4.0-alpha发布!新增多个深度学习特性 (欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) 本定于2018年7月发布的OpenCV4.0再次跳票,昨 ...

  5. JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK9特性讲解】

    JDK各个版本特性讲解-JDK9特性 lecture:波哥 一.JDK版本特性   JAVA8 及之前,版本都是特性驱动的版本更新,就是有重大的特性产生,然后进行更新   JAVA9开始,JDK开始以 ...

  6. 第十一节:特性(常见的特性标签、自定义特性、特性的使用案例)

    一. 基本概念 1. 什么是特性? MSDN官方给出的定义时:公共语言运行时允许添加类似关键字的描述声明,叫做特性,它对程序中的元素进行标注,如类型.字段.方法和属性等.Attribute和Micro ...

  7. C++11特性及其它常用特性

    文章目录 C++11特性及其它常用特性 1. explicit 关键字 2. 左值和右值的概念 3. 函数返回值当引用 4. C++11 新增容器 - array array容器概念 array特点 ...

  8. [C#]Attribute特性(2)——方法的特性及特性参数

    上篇博文[C#]Attribute特性介绍了特性的定义,类的特性,字段的特性,这篇博文将介绍方法的特性及特性参数相关概念. 3.方法的特性 之所以将这部分单列出来进行讨论,是因为对方法的特性查询的反射 ...

  9. modern php笔记---2.1、特性(命名空间、特性、性状)

    modern php笔记---2.1.特性(命名空间.特性.性状) 一.总结 一句话总结: legend2是真的非常好用,资质起码提升5倍,也就是学习效率提升了起码5倍 1.命名空间实质? 从技术层面 ...

最新文章

  1. 英特尔:谁说深度学习已死?AI任务挑大梁的是CPU,不是GPU
  2. 安装和使用花生壳(linux)
  3. 如果《赛博朋克2077》走进现实,人类如何摆脱AI的支配?
  4. 从挂起到实现,你知道内核是如何实现的?
  5. MySQL datetime类型字段的毫秒四舍五入
  6. 成吉思汗:“世界之鞭”还是“人类之王”?
  7. SpringBoot 记录操作日志
  8. 从新手到Flutter架构师,一篇就够!吐血整理
  9. iostat -x命令诊断
  10. 计算机网络---分层结构、协议、接口、服务
  11. python web框架哪个好_盘点:9款流行Web框架及其优缺点
  12. 2017-2018-1 20155229 实验五 《通讯协议设计》
  13. GNS3 1.5.2 无法上传文件的解决办法
  14. java item 类型参数_Java8中对Lambda表达式中方法参数的类型推断(一)
  15. 模块化的机器学习系统就够了吗?Bengio师生告诉你答案
  16. 语音信号处理及特征提取
  17. git clone 码云仓库项目报错fatal: Authentication failed for ‘https://gitee.com/...‘
  18. 用友汽车IPO过会:拟募资5.6亿 高瓴刚参与母公司定增
  19. 手机关机的java代码_Android关机界面代码
  20. 基于PyQT5制作一个二维码生成器

热门文章

  1. Contiki 2.7 Makefile 文件(五)
  2. Markdown简介
  3. Android 代码混淆(一)
  4. 领导再也不会因为模型刷新不出来批评我啦---论IE扩内存(转载)
  5. JAVA连接Mysql事例
  6. C#ADO.NET操作数据代码汇总
  7. 算法高级(26)-在Java8中为什么要使用红黑树来实现的HashMap?
  8. ACKRec:注意力异构图卷积深度知识推荐器 SIGIR 2020
  9. Python学习笔记——输入与输出用法
  10. css转化成stylus,stylus