Java 8新特性——default方法(defender方法)介绍

转载自 Java 8新特性——default方法(defender方法)介绍

 

我们都知道在Java语言的接口中只能定义方法名,而不能包含方法的具体实现代码。接口中定义的方法必须在接口的非抽象子类中实现。下面就是关于接口的一个例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

publicinterface SimpleInterface {

  publicvoid doSomeWork();

}

 

classSimpleInterfaceImpl implementsSimpleInterface{

  @Override

  publicvoid doSomeWork() {

    System.out.println("Do Some Work implementation in the class");

  }

 

  publicstatic void main(String[] args) {

    SimpleInterfaceImpl simpObj = newSimpleInterfaceImpl();

    simpObj.doSomeWork();

  }

}

那么,如果我们在SimpleInterface里面添加一个新方法,会怎样呢?

1

2

3

4

publicinterface SimpleInterface {

  publicvoid doSomeWork();

  publicvoid doSomeOtherWork();

}

如果我们尝试编译上面的这段代码,会得到如下结果:

1

2

3

4

5

6

$javac .\SimpleInterface.java

.\SimpleInterface.java:18: error: SimpleInterfaceImpl is not abstract and does not

override abstract method doSomeOtherWork() inSimpleInterface

class SimpleInterfaceImpl implements SimpleInterface{

^

1 error

因为接口有这个语法限制,所以要直接改变/扩展接口内的方法变得非常困难。我们在尝试强化Java 8 Collections API,让其支持lambda表达式的时候,就面临了这样的挑战。为了克服这个困难,Java 8中引入了一个新的概念,叫做default方法,也可以称为Defender方法,或者虚拟扩展方法(Virtual extension methods)。

Default方法是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。接下来,让我们看一个例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

publicinterface SimpleInterface {

  publicvoid doSomeWork();

 

  //A default method in the interface created using "default" keyword

  //使用default关键字创在interface中直接创建一个default方法,该方法包含了具体的实现代码

  defaultpublic void doSomeOtherWork(){

    System.out.println("DoSomeOtherWork implementation in the interface");

  }

}

 

classSimpleInterfaceImpl implementsSimpleInterface{

  @Override

  publicvoid doSomeWork() {

    System.out.println("Do Some Work implementation in the class");

  }

  /*

   * Not required to override to provide an implementation

   * for doSomeOtherWork.

   * 在SimpleInterfaceImpl里,不需要再去实现接口中定义的doSomeOtherWork方法

   */

 

  publicstatic void main(String[] args) {

    SimpleInterfaceImpl simpObj = newSimpleInterfaceImpl();

    simpObj.doSomeWork();

    simpObj.doSomeOtherWork();

  }

}

该程序的输出是:

1

2

Do Some Work implementation inthe class

DoSomeOtherWork implementation inthe interface

以上是对default方法的一个非常简要的介绍。如果有兴趣的话,还可以通过看这篇文档,来获取更深层次的理解。

更新:

现在大家问得比较多的一个问题是:如果一个类实现了两个接口(可以看做是“多继承”),这两个接口又同时都包含了一个名字相同的default方法,那么会发生什么情况? 在这样的情况下,编译器会报错。让我用例子来解释一下:

1

2

3

4

5

6

7

8

9

10

11

publicinterface InterfaceWithDefaultMethod {

  publicvoid someMethod();

  defaultpublic void someOtherMethod(){

    System.out.println("Default method implementation in the interface");

  }

}

publicinterface InterfaceWithAnotherDefMethod {

  defaultpublic void someOtherMethod(){

    System.out.println("Default method implementation in the interface");

  }

}

然后我们定义一个类,同时实现以上两个接口:

1

2

3

4

5

6

7

8

9

10

11

12

13

publicclass DefaultMethodSample implements

  InterfaceWithDefaultMethod, InterfaceWithAnotherDefMethod{

 

  @Override

  publicvoid someMethod(){

    System.out.println("Some method implementation in the class");

  }

  publicstatic void main(String[] args) {

    DefaultMethodSample def1 = newDefaultMethodSample();

    def1.someMethod();

    def1.someOtherMethod();

  

}

如果编译以上的代码,会得到一个编译器错误,如下所示。因为编译器不知道应该在两个同名的default方法中选择哪一个,因此产生了二义性。

原文链接: blog.sanaulla.info 翻译: ImportNew.com 黄小非
译文链接: http://www.importnew.com/7302.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于高并发的理解及实践方案

目录01 如何理解高并发?02 高并发系统设计的目标是什么?2.1标题宏观目标高并发绝不意味着只追求高性能,这是很多人片面的理解。2.2 微观目标2.2.1 性能指标2.2.2 可用性指标2.2.3 可扩展性指标03 高并发的实践方案有哪些?3.1 通用…

ubuntu ifconfig_Ubuntu 设置固定 IP 最简单的方法!

因为鼠标共享软件需要使用网络连接,台式机的 IP 总是变化导致笔记本每次重启都要重新配置 IP,所以我给 ubuntu 设置了固定 IP,方法很简单,直接再系统设置里面配置就可以了。1. 查看默认网络配置打开系统「Setting」,打…

rabbitmq-发布订阅模式

【README】 本文po出 mq的发布订阅模式,及代码示例; 【1】intro 1) 角色: 有4个角色, 包括 生产者,消费者, 交换机 exchange(X), 队列; 2&#…

深入Java类型信息:RTTI和反射

转载自 「深入Java」类型信息:RTTI和反射 1.RTTI Run-Time Type Infomation 运行时类型信息 为什么需要RTTI? 越是优秀的面向对象设计,越是强调高内聚低耦合,正如依赖倒转原则所说:“无论是高层模块还是低层模块&#…

设计费收费标准2002修订_@设计师,2019景观园林设计收费标准,注意查收!

From:景观邦(ID:LA_bang)一、设计费量的定制:设计费在10万以上的(包括10万)省外工程方能承接。其工作内容有:景观概念规划设计、方案设计、初步设计、施工图设计、效果图绘制及多媒体制作等。二、设计费的取费标准:居住区、道路、…

rabbitmq-路由模式-routingkey

【README】 本文po出 rabbitmq路由模式; 【1】intro to 路由模式 特点1)队列与交换机的绑定,不能是任意绑定, 而是指定一个路由key-routingkey; 特点2)消息的发送方向在向 exchange-交换机发送消息时&…

一文理清HashMap的实现及细节

前言 最近阅读了许多HashMap实现及源码分析的文章,特意此文记录HashMap的知识点。 HashMap 底层由 数组 链表 组成,在 jdk1.7 和 1.8 中具体略有不同。 JDK1.7的HashMap 数据结构:图片来源 核心成员变量 图片来源 初始化桶大小&…

java提高篇之详解内部类

转载自 java提高篇之详解内部类内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二)。第一次见面内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类。123456789101112…

rabbitmq-通配符模式

【README】 本文介绍 通配符模式,及代码示例 【1】intro to rabbitmq通配符模式 0)通配符模式-交换机类型为 Topic; 1)与路由模式相比,相同点是 两者都可以通过 routingkey 把消息转发到不同的队列; 不同…

中海达手部链接电脑安装软件_山东水文局:较大含沙量条件下中海达ADCP外接测深仪测流系统试验成功...

近日,黄委山东水文水资源局与中海达海洋公司联合,在黄河泺口水文站较大含沙量环境下进行了ADCP外接测深仪、GNSS测流试验,试验取得了圆满成功。泺口水文站简介1泺口水文站概况泺口水文站位于山东省济南市天桥区黄河泺口浮桥南岸,隶…

一文搞懂ThreadLocal及相关的内存泄露问题

首先,看一张整体的结构图,来帮助理解 什么是ThreadLocal ThreadLocal用于创建线程局部变量,如果创建一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,…

resnet50加入fpn_FPN+SSD同时兼顾速度和精度的检测器(二)

本文首发于知乎专栏“人工智能从入门到逆天杀神”,本文以及本专栏所有算法源代码都可以在神力AI平台获取,如果你没有GPU但需要预训练模型或者你想获取更多开箱即用的AI算法,欢迎加入我们的会员,一杯咖啡即可带你入门AI&#xff0c…

Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单(转)

转自: https://juejin.cn/post/6844903903130042376 文末有源代码,非常棒 摘要: 本篇博文是“Java秒杀系统实战系列文章”的第十篇,本篇博文我们将采用RabbitMQ的死信队列的方式处理“用户秒杀成功生成订单后,却迟…

主流Java数据库连接池比较及前瞻

转载自 主流Java数据库连接池比较及前瞻主流数据库连接池 常用的主流开源数据库连接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等 C3p0: 开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibern…

有序数组中查找第一个比target大的数

思路&#xff1a;二分法 时间复杂度&#xff1a;O(logn) 空间复杂度&#xff1a;O(1) 代码&#xff1a; public class Solution{public int search(int[] nums, int target){int lf0, rtn.length-1;while(lf<rt){int mid lf(rt-lf)/2;if(n[mid]>t){rt mid-1;}else{lf…

2020最新Java线程池入门(超详细)

转 https://blog.csdn.net/weixin_43893397/article/details/104361154 【1】代码示例 /*** 线程池测试-自定义线程池创建方式* since 2021/03/23 */ public class ThreadPoolMain2 {public static void main(String[] args) throws Exception {newMethod();}public static…

HDFS的诞生

转载自 HDFS的诞生 1牛刀小试 张大胖找了个实习的工作&#xff0c; 第一天上班Bill师傅给他分了个活儿&#xff1a;日志分析。张大胖拿到了师傅给的日志文件&#xff0c;大概有几十兆&#xff0c;打开一看&#xff0c; 每一行都长得差不多&#xff0c;类似这样&#xff1a;212.…

项目背景怎么描述_产品经理写简历,如何让「项目经验」更出众?

项目经验怎么写更出众&#xff1f;时间长但效果一般的项目经验要不要写&#xff1f;没有项目经验怎么办&#xff1f;本文凭借作者自己长期招聘产品、阅读大量简历所积累的经验解答了这三个问题&#xff0c;希望对你有所帮助。产品经理写简历时&#xff0c;都会通过项目案例来证…

一致性Hash算法原理

前言 当在需要将数据分发到多个数据库/缓存&#xff0c;或将请求分发给多个服务节点时&#xff0c;不可避免的会遇到以下问题&#xff1a; 如何将数据均匀的分散到各个节点中&#xff0c;并且尽量的在加减节点时能使受影响的数据最少。 选择节点的方法 随机放置 从多个节点…

转: java多线程-ThreadPoolExecutor的拒绝策略RejectedExecutionHandler

转自&#xff1a; https://blog.csdn.net/qq_25806863/article/details/71172823 概述 原文地址 http://blog.csdn.net/qq_25806863/article/details/71172823 在分析ThreadPoolExecutor的构造参数时&#xff0c;有一个RejectedExecutionHandler参数。 RejectedExecutionH…