java8之前接口中的方法默认类型都是public abstract,也就是抽象方法,具体实现都交给实现类。而java8对接口功能做了增强,增加了default方法和static方法,也就是说从java8开始接口中的方法不再只能是抽象的,也可以有实现。

其应用也非常简单,如下面的例子所示,在接口中定义default和static方法:

public interface DefaultInterface {
// default方法
default void defaultFunction(){
System.out.println("this is a default function");
}
// static方法
static void staticFunction(){
System.out.println("this is a static funcion");
}
}

在实现类中可以直接调用接口的default方法,通过接口名.方法名调用static方法:

public class DefaultInterfaceImpl implements DefaultInterface{
public static void main(String[] args){
// 调用default方法
new DefaultInterfaceImpl().defaultFunction();
// 调用static方法
DefaultInterface.staticFunction();
}
}

运行结果如下:

注意点:

  • 实现类可以重写default方法,不能重写static方法
  • 如果一个类实现了两个接口,而这两个接口拥有相同方法签名(相同的方法名、参数)、返回类型的default方法时,实现类就必须重写该default方法,否则编译器会因为不知道应该调用哪一个接口中的default方法而报错。重写接口中default方法后,编译器会执行重写后的方法。不过好的编程习惯是明智的选择方法名,避免和其它接口产生冲突。
  • 如果一个类同时继承了一个类和实现了一个或多个接口,而父类中拥有和接口中default方法相同的签名、返回值的方法时,当该类未重写该方法,直接调用时,将会调用父类中的方法。

新特性带来的好处:

  • 增加default方法,可以在不破坏java现有实现架构的情况下能往接口里增加新方法。

    尽管如此,还是不推荐过度使用,如果你大量使用default方法在你的应用接口中,你将很快意识到他没有真正精简代码。因为你不能在接口中提炼default里重复的代码到一个新的普通方法,这与以精简代码为目的的default关键字相冲突。不过这个问题在java9中通过在接口中支持private interface methods得到解决。不过一般公司项目在jdk版本的使用上并不会太激进。

    具体参考链接:https://www.cnblogs.com/wanshiming/p/9011879.html
  • 而static方法除了调用比较方便外还有一个有趣的意义,程序入口main方法也是static,现在在接口也可以运行了。

接口和抽象类:

如此看来接口是不是和类越来越接近了?那么回归到一道基础的面试题:现在接口和抽象类有什么区别呢?

  • 一个类只能继承一个抽象类,却可以实现多个接口。
  • 虽然接口和抽象类都不能被实例化,但是抽象类可以有构造器,接口没有构造器。
  • 抽象类中方法可以有public、protected、默认(包)甚至private范围的方法,接口只能有public范围的方法(即使是default也是public范围的,当然从java9开始接口也可以有private方法 。

参考:

https://blog.csdn.net/zyq_2014/article/details/80964715

java8接口新特性:default、static的更多相关文章

  1. Java8接口新特性

    概述 Java 8中,你可以为接口添加静态方法和默认方法.从技术角度来说,这是完全合法的,只是它看起来违反了接口作为一个抽象定义的理念.猜想设计初衷可能使为了兼容8以下的jdk Java8出来了个函数 ...

  2. java8的新特性以及用法简介

    1. 介绍 2 接口的默认方法 2 lambda表达式 2.1 函数式接口 2.2 方法与构造函数引用 2.3 访问局部变量 2.4 访问对象字段与静态变量 3. 内建函数式接口 3.1 Predic ...

  3. Java8 Stream新特性详解及实战

    Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...

  4. 简单了解JAVA8的新特性

    JAVA8新特性会颠覆整个JAVA程序员的编程习惯 甚至如果您坚守JAVA7之前的编程习惯,今后你看比较年轻的程序员写的JAVA代码都会无法理解 所以为了保证不脱钩,我觉得有必要学习JAVA8的新特性 ...

  5. Java8常用新特性实践

    前言: 时下Oracle开速迭代的Java社区以即将推出Java10,但尴尬的是不少小中企业仍使用JDK7甚至JDK6开发. 从上面列出的JDK8特性中我们可以发现Java8的部分特性很明显的是从Sc ...

  6. Java 接口 新特性(Java8)

    Java8新特性之接口增强 在Java7以及以前的版本中,接口里的方法都是抽象的,并且不存在静态方法,属性默认修饰符是public static final.所有方法的声明都是public [返回类型 ...

  7. java5、java6、java7、java8的新特性

    Java5: 1.泛型 Generics:        引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处. Parameterized Type作为参数 ...

  8. Java8部分新特性的学习

    Java8中的新特性 一.Lambda表达式 Lambda表达式可以理解为一种可传递的匿名函数:它没有名称,但又参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 匿名:和匿名类类似的,它 ...

  9. 深度分析:java8的新特性lambda和stream流,看完你学会了吗?

    1. lambda表达式 1.1 什么是lambda 以java为例,可以对一个java变量赋一个值,比如int a = 1,而对于一个方法,一块代码也是赋予给一个变量的,对于这块代码,或者说被赋给变 ...

  10. Java8的新特性以及与C#的比较

    函数式接口 VS 委托 在C中,可以使用函数指针来存储函数的入口,从而使得函数可以像变量一样赋值.传递和存储,使得函数的调用变得十分灵活,是实现函数回调的基础.然而函数指针不存在函数的签名信息,甚至可 ...

随机推荐

  1. Scratch教程:第1课认识Scratch

    一.Scratch来源 Scratch最初是由麻省理工学院媒体实验室的终身幼儿园研究小组的米切尔雷斯尼克和西摩于2003年发起的. 希望帮助所有的孩子"发现和跟随自己的激情和探索力,敢于尝试 ...

  2. jenkins全局工具配置

  3. 【ABP】项目示例(2)——聚合根和实体

    聚合根和实体 在上一章节中,已经完成了项目搭建的前置准备,在这一章节中,实现领域层的聚合根和实体 创建名称为General.Backend.Domain的标准类库,分别新建名称为Entities.Se ...

  4. Python 潮流周刊#89:Python 3.14 的新型解释器!(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  5. 一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略来了!

    大家好,我是编程乐趣. DeepSeek大火,网络上也看到很多人分享本地部署心得.但想要更细了解,还是要自己本地部署一次. 我这次部署目标,就是在局域网服务器部署,并让局域网其他电脑可以直接访问. 选 ...

  6. jQuery validate验证表单隐藏域

    function validInfoForm(){        return $("#form_password").validate({            ignore : ...

  7. Winform ShowDialog如何让先前Show的窗体可以交互

    背景描述 最近项目中有一个需求,全局有一个共用的窗体,能够打开不同模块的报告,由于需要兼容不同模块,代码复杂,启动速度慢.优化方案为将窗体启动时就创建好,需要查看报告时,使用此单例弹窗加载不同模块下的 ...

  8. 深度研究JDK的各种技术细节

    打算建立一个JDK网站,将目前JDK的各种重要特性都深入分析一下.希望JDK中各种技术实现细节都可以在这个网站上查到.相关的模块以及阅读顺序如下图所示. 没有将一些内容规划进来,Java语言基本语法太 ...

  9. Go配置管理神器—Viper中文教程

    Viper中文教程 Viper是适用于Go应用程序的完整配置解决方案.它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式. 安装 go get github.com/spf13/vip ...

  10. nacos(八): sentinel——基本使用

    一.概要 在微服务的架构中,流控是一个重要的任务.sentinel是阿里开源的流量治理组件,针对访问的"资源"或服务路径进行流控,内置了限流.熔断及系统负载保护等功能. senti ...