Java 8 默认接口实现及其他语言特性

BytePulse
• 阅读 1545

一、为什么有默认接口实现

1、由于Java 8的API在现存的接口上引入了非常多的新方法(如List接口上的sort方法)。在原有语法基础上,如Guava和Apache Commons这样的框架都需要修改实现了List接口的所有类。

2、为了解决这个问题,Java 8中的接口现在支持在声明方法的同时提供实现。主要有两种方式:

1)、Java 8允许在接口内声明静态方法。
2)、Java 8引入了一个新功能,叫默认方法,通过默认方法你可以指定接口方法的默认实现。
这种机制可以使你平滑地进行接口的优化和演进

二、冲突解决

我们知道Java语言中一个类只能继承一个父类,但是一个类可以实现多个接口。随着默认方法在Java 8中引入,有可能出现一个类继承了多个方法而它们使用的却是同样的函数签名。这种情况下,类会选择使用哪一个函数?
public interface InterfaceA {
    
    default void hello(){
        System.out.println("Hello from A");
    }

}




public interface InterfaceB extends InterfaceA{

    default void hello(){
        System.out.println("Hello from B");
    }
}



public class ClassC implements InterfaceA,InterfaceB{

    public static void main(String[] args) {
        new ClassC().hello();
    }
}




public class ClassC implements InterfaceA,InterfaceB{

    public static void main(String[] args) {
        new ClassC().hello();
    }
}




result:Hello from B

如果一个类使用相同的函数签名从多个地方(比如另一个类或接口)继承了方法,通过三条规则可以进行判断。
(1) 类中的方法优先级最高。类或父类中声明的方法的优先级高于任何声明为默认方法的优先级。
(2) 如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体。
(3) 最后,如果还是无法判断,继承了多个接口的类必须通过显式覆盖和调用期望的方法,

一、重复注解Java 8 默认接口实现及其他语言特性

二、集合类新增方法Java 8 默认接口实现及其他语言特性

三、CompletableFutureJava 8 默认接口实现及其他语言特性

四、ConcurrentHashMapJava 8 默认接口实现及其他语言特性

五、StringJava 8 默认接口实现及其他语言特性

六、 FilesJava 8 默认接口实现及其他语言特性

七、 精简JRE

Java8提供了三种紧凑的JRE,分别是compact1、compact2、compact3,他们的关系是compact1<compact2<compact3,他们包含的API如下图所示

Java 8 默认接口实现及其他语言特性

八、 删除PermGen space

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域这一部分用于存放Class和Meta的信息。Java8使用本地内存来存储类元数据信息并称之为:元空间( Metaspace),默认情况下,类元数据只受可用的本地内存限制。

Java 8 默认接口实现及其他语言特性

九、Nashorn

Java 8 默认接口实现及其他语言特性

本文作者:魂皓轩 欢迎关注公众号
Java 8 默认接口实现及其他语言特性

本人保留所有权益,转载请注明出处。
欢迎有故事、有想法的朋友和我分享,可发送至 e-mail: lwqforit@163.com

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Easter79 Easter79
3年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
JOptionPane修改图标
1.在Linux平台下.JOptionPane会显示Java默认的图标,在window平台不显示图标,如何替换这个图标了?2JOptionPane.setIcon(Icon)修改的是内容区域的icon,而不是左上角的Icon.所以需要通过修改Jdialog/Frame的图标来达到修改默认图标的问题.3.代码:if(JOptio
Stella981 Stella981
3年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
Wesley13 Wesley13
3年前
Java 8 接口里的默认方法特性研究
这篇文章我们将要探讨Java 8中接口里的默认方法特性。Java8指出“默认方法使得新功能被添加到库中的接口里面,同时又能保证与这些接口老版本代码的二进制兼容性。这些年Java进化升级了很多,在Java库中引入的接口需要添加新的功能。在没有默认方法特性时,当你往接口中添加新方法时,接口内部所有实现的类都要历经一些修改。这将导致上千行的代码修改工作量。为了
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(