Java8 新特性,打破你对接口的认知
Java 8 之前,接口里面只能写抽象方法,不能写实现方法
Java 8 开始是可以有方法实现的,可以在接口中添加默认方法和静态方法
默认方法用 default
修饰,只能用在接口中,静态方法用 static
修饰,并且接口中的默认方法、静态方法可以同时有多个。
为什么要用接口默认方法
举一个很现实的例子:
我们的接口老早就写好了,后面因为各种业务问题,避免不了要修改接口。
在 Java 8 之前,比如要在一个接口中添加一个抽象方法,那所有的接口实现类都要去实现这个方法,不然就会编译错误,
而某些实现类根本就不需要实现这个方法也被迫要写一个空实现,改动会非常大。
所以,接口默认方法就是为了解决这个问题,只要在一个接口添加了一个默认方法,所有的实现类就自动继承,不需要改动任何实现类,也不会影响业务;
另外,接口默认方法可以被接口实现类重写。
为什么要有接口静态方法?
接口静态方法和默认方法类似,只是接口静态方法不可以被接口实现类重写。
接口静态方法只可以直接通过静态方法所在的 接口名
.静态方法名
来调用。
接口默认方法多继承冲突问题
因为接口默认方法可以被继承并重写,如果继承的多个接口都存在相同的默认方法,那就存在冲突问题。
冲突一
interface People {
default void eat() {
System.out.println("人吃饭。");
}
}
interface Man {
default void eat() {
System.out.println("男人吃饭。");
}
}
//Boy 同时继承了 People 和 Man,此时在 IDEA 编辑器中就会报错
interface Boy extends People, Man {
}
//这就是接口多继承带来的冲突问题,Boy 不知道该继承谁的,
//这显然也是个问题,IDEA 也会提示,需要重写这个方法才能解决问题:
interface Boy extends People, Man {
@Override
default void eat() {
People.super.eat(); //在方法里面还能直接调用指定父接口的默认方法
Man.super.eat(); //在方法里面还能直接调用指定父接口的默认方法
System.out.println("男孩吃饭。");
}
}
用实现类测试一下
class Student implements Boy {
public static void main(String[] args) {
Student student = new Student();
student.eat();
}
}
//result
//人吃饭。
//男人吃饭。
//男孩吃饭。
冲突二
我们再换一种写法,把 Man
继承 People
,然后 Man
重写 People
中的默认方法
此时,编辑器不报错了,而 People
的默认方法置灰了,提示没有被用到。
再运行一下上面的示例,输出:
interface People {
default void eat() {
System.out.println("人吃饭。");
}
}
interface Man extends People{
default void eat() {
System.out.println("男人吃饭。");
}
}
interface Boy extends People, Man {
}
//result
//男人吃饭
因为 Man
继承 People
,Man
又重定了默认方法。很显然,这个时候,Boy
知道该继承谁的默认方法了。
注意,此时,如果用 People
通过 super
调用父类的 eat
方法会报错,因为调不到了
interface Boy extends People, Man {
@Override
default void eat() {
People.super.eat(); //People报错
System.out.println("男孩吃饭");
}
}
冲突三
在 Man
接口中新增一个方法:say
,然后在 Boy
接口中新增一个默认方法:say
。
interface Man extends People{
default void eat() {
System.out.println("男人吃饭。");
}
void say(); //IDEA提示,say方法变灰,没有被使用
}
这时候,Man
中的抽象方法居然被忽略了,IDEA
都提示说没用到,这显然是默认方法优先于抽象方法。
总结
介绍了 Java 8 的默认方法和静态方法,以及默认方法的冲突问题解决方案。
如果以后还说接口不能写实现方法,那就太OUT
了。
Java8 新特性,打破你对接口的认知的更多相关文章
- Java8新特性
Java8新特性 Java8主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等. 1.函数式接口 Java 8 引入 ...
- java8 新特性精心整理
前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和 JVM 等方面的十多个新特 ...
- java8 新特性精心整理(全)
前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和 JVM 等方面的十多个新特 ...
- Java8 新特性(三) - 日期时间对象以及一些其他特性
日期时间对象 关于日期时间的操作可以分为两种: 转换:与字符串的互相转换,与时间戳的互相转换 计算:计算两个时间点之间的间隔.时间点与时间段的计算(计算下周N.下个月D日.去年M月D日等等) Java ...
- 【Java8新特性】Lambda表达式基础语法,都在这儿了!!
写在前面 前面积极响应读者的需求,写了两篇Java新特性的文章.有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没 ...
- Lambad表达式--Java8新特性
1.概述 Lambda是一个匿名函数,是java8的一个新特性.可以对接口进行非常简洁的实现.但它要求接口中只能有一个抽象方法,原因是lambda只能实现一个方法.另外,需要在接口上添加注解@Func ...
- java8新特性全面解析
在Java Code Geeks上有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Java ...
- Java系列 - 用Java8新特性进行Java开发太爽了
本人博客文章网址:https://www.peretang.com/using-java8s-new-features-to-coding-is-awesome/ 前言 从开始写博客到现在已经过去3个 ...
- Java8 新特性之Stream----java.util.stream
这个包主要提供元素的streams函数操作,比如对collections的map,reduce. 例如: int sum = widgets.stream() .filter(b -> b.ge ...
- 这可能是史上最好的 Java8 新特性 Stream 流教程
本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...
随机推荐
- 【ASP.NET Core】MVC模型绑定——实现同一个API方法兼容JSON和Form-data输入
在上一篇文章中,老周给大伙伴们大致说了下 MVC 下的模型绑定,今天咱们进行一下细化,先聊聊模型绑定中涉及到的一些组件对象. ------------------------------------- ...
- Python 远程开发环境部署与调试
一.下载相应开发工具 Pycharm :下载地址 二.部署开发机 一般在工作过程中,开发环境并不是本地环境,而是指在开发机:因为,有很多依赖本地部署非常麻烦,而开发机中则内置了很多相关的服务 三.代 ...
- windows 访问 CentOS 的防火墙及其 网关开放
1.防火墙开放端口 firewall-cmd --zone=public --add-port=8848/tcp --permanent firewall-cmd --list-ports 开放cen ...
- kafka producer的batch.size和linger.ms
1.问题 batch.size和linger.ms是对kafka producer性能影响比较大的两个参数.batch.size是producer批量发送的基本单位,默认是16384Bytes,即16 ...
- JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta
JVM监控工具介绍 jstack - 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程 ...
- MiL → SiL → PiL → HiL 是什么?
基于模型的快速原型开发通常分为四个过程:MiL → SiL → PiL → HiL 1. MiL(Model in Loop)模型在环 在PC上基于模型的测试,它的输出是经过验证的控制算法模型.验证 ...
- 模拟web服务器http请求应答
我们在浏览器打开网页,其实是向远端服务器提出页面发送请求,远端服务器在接到请求后,就开始执行请求页面的程序文件,然后将执行结果通过html格式,发送到你的浏览器,再显示出来.以下用百度(www.bai ...
- web前端教程《每日一题》(1-99)完结
第1期(2016年4月6日): (1)js中关闭当前窗口的方法是:window.close(); 第2期(2016年4月7日): (1)js中使字符串中的字符变为小写的方法是:toLowerCase方 ...
- 检查浏览器支持Webp
什么是Webp? Webp 是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8.根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使这 ...
- SQL之总结(一)
导游通项目之总结SQL 1.选择前面的某几个 oracle: select * from tb_article where rownum<5 order by article_id ...