Java8新特性之默认方法(default)浅析

 更新时间:2014年06月09日 11:10:15   作者:  
这篇文章主要介绍了Java8新特性之默认方法(default)浅析,默认方法也称为虚拟扩展方法或防护方法,可以让我们修改接口而不破坏原来的实现类的结构,需要的朋友可以参考下

一、什么是默认方法,为什么要有默认方法

简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。

为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。

简单的例子:一个接口A,Clazz类实现了接口A。

复制代码 代码如下:

public interface A {
    default void foo(){
       System.out.println("Calling A.foo()");
    }
}

public class Clazz implements A {
    public static void main(String[] args){
       Clazz clazz = new Clazz();
       clazz.foo();//调用A.foo()
    }
}


代码是可以编译的,即使Clazz类并没有实现foo()方法。在接口A中提供了foo()方法的默认实现。

二、java 8抽象类与接口对比


这一个功能特性出来后,很多同学都反应了,java 8的接口都有实现方法了,跟抽象类还有什么区别?其实还是有的,请看下表对比。。

相同点 不同点

1.都是抽象类型;

2.都可以有实现方法(以前接口不行);

3.都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)

1.抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);

2.抽象类和接口所反映出的设计理念不同。其实抽象类表示的是"is-a"关系,接口表示的是"like-a"关系;

3.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。


三、多重继承的冲突说明

由于同一个方法可以从不同接口引入,自然而然的会有冲突的现象,默认方法判断冲突的规则如下:

1.一个声明在类里面的方法优先于任何默认方法(classes always win)

2.否则,则会优先选取最具体的实现,比如下面的例子 B重写了A的hello方法。

输出结果是:Hello World from B

如果想调用A的默认函数,则用到新语法X.super.m(...),下面修改C类,实现A接口,重写一个hello方法,如下所示:

复制代码 代码如下:

public class C implements A{

    @Override
    public void hello(){
        A.super.hello();
    }

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

输出结果是:Hello World from A

四、总结

默认方法给予我们修改接口而不破坏原来的实现类的结构提供了便利,目前java 8的集合框架已经大量使用了默认方法来改进了,当我们最终开始使用Java 8的lambdas表达式时,提供给我们一个平滑的过渡体验。也许将来我们会在API设计中看到更多的默认方法的应用。

相关文章

  • SpringCloud集成Sleuth和Zipkin的思路讲解

    SpringCloud集成Sleuth和Zipkin的思路讲解

    Zipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以及解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现,这篇文章主要介绍了SpringCloud集成Sleuth和Zipkin,需要的朋友可以参考下
    2022-11-11
  • Java设计模式之浅谈外观模式

    Java设计模式之浅谈外观模式

    这篇文章主要介绍了Java设计模式之外观模式的相关资料,需要的朋友可以参考下
    2022-09-09
  • IDEA自定义pom依赖的步骤详解

    IDEA自定义pom依赖的步骤详解

    这篇文章主要介绍了IDEA自定义pom依赖的步骤详解,本文分步骤通过图文并茂的形式给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 使用SpringBoot发送邮箱验证码的简单实现

    使用SpringBoot发送邮箱验证码的简单实现

    这篇文章主要介绍了使用SpringBoot发送邮箱验证码的简单实现,咱们今天来讲使用QQ邮箱来发送和接收验证码,首先来介绍一下它在SpringBoot项目中的具体应用,需要的朋友可以参考下
    2023-04-04
  • java生成图片验证码示例代码

    java生成图片验证码示例代码

    这篇文章主要为大家详细介绍了java生成图片验证码示例代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Java遍历Json中的key和value问题

    Java遍历Json中的key和value问题

    这篇文章主要介绍了Java遍历Json中的key和value问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • spring mvc中@RequestBody注解的作用说明

    spring mvc中@RequestBody注解的作用说明

    这篇文章主要介绍了spring mvc中@RequestBody注解的作用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • java实战项目之记账软件

    java实战项目之记账软件

    这篇文章主要介绍了java实战项目之记账软件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Java性能调优及排查方式

    Java性能调优及排查方式

    这篇文章主要介绍了Java性能调优及排查方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java获取彩色图像中的主色彩的实例代码

    Java获取彩色图像中的主色彩的实例代码

    这篇文章主要介绍了Java获取彩色图像中的主色彩的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论