转载自 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

Java 8新特性——default方法(defender方法)介绍相关推荐

  1. Java 8新特性——default方法(defenece方法)介绍

    为什么80%的码农都做不了架构师?>>>    本文由 ImportNew - 黄小非 翻译自 blog.sanaulla.info.如需转载本文,请先参见文章末尾处的转载要求. 我 ...

  2. Java 8新特性探究(二)深入解析默认方法

    转载自 Java 8新特性探究(二)深入解析默认方法 什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. ...

  3. Java 8 新特性之默认方法

    1. 简介   默认方法就是接口可以有实现方法, 而且不需要实现类去实现其方法, 默认方法的实现只需要在方法名的前面加一个default关键字即可实现默认方法. 2. 默认方法语法 public in ...

  4. 【Java 8 新特性】Java Stream 通过skip()方法跳过前N个子元素

    [Java 8 新特性]Java Stream 通过skip方法跳过前N个子元素 1.skip() 示例 2.skip() vs limit() 参考文献 本页将介绍 Stream.skip方法示例. ...

  5. java8新特性(2)--- 方法引用

    java8新特性(2)- 方法引用 新增语法双冒号(::) package com.common.jdk8;import java.util.Arrays; import java.util.List ...

  6. Java 8新特性终极指南

    在Java Code Geeks上已经有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Ja ...

  7. 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局

    转载自   跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局 恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同 ...

  8. Java 8 新特性:扩展注解(类型注解和重复注解)

    转载自  Java 8 新特性:扩展注解(类型注解和重复注解) (注:先回顾下JDK1.5版本出现的注解 ,然后再解释JDK 8的注解 更新内容.) 一.注解(JDK1.5) 1.注解(@): 注解就 ...

  9. Java 9 新特性概述

    转载自 Java 9 新特性概述 Java 9 正式发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化.其中最重要的改动是 ...

最新文章

  1. Win2000 DDK 附带例子概览(图解)
  2. 超越Swin,Transformer屠榜三大视觉任务!微软推出新作:Focal Self-Attention
  3. idea main和System快捷键
  4. Skype一国通套餐不再提供无限制拨打中国大陆地区通知
  5. 如何在sh的字符串中包含换行符?
  6. Android使用adb命令
  7. ActiveMQ官方文档翻译-内嵌消息中间件
  8. CorelDRAWX8试用到期了怎么免费使用?cdrX8
  9. 解决: 小程序涉及提供天气查询等相关服务,请选择:工具-天气类目。微信小程序修改类目
  10. 基于javaweb酒店管理系统
  11. PHP获得某天某星期某月的开始结束时间
  12. TCP/IP 工作模型
  13. 为什么美国大城市里不修二环三环四环五环?
  14. 分享一个强大的在线写API接口文档的工具showdoc
  15. 怎么批量下载哗哩哗哩B站视频
  16. java.lang.SecurityException: getDeviceId: The user 10158 does not meet the requirements to access de
  17. 了解流辰信息框架开发平台服务商
  18. 老调重弹——你存储的密码做Hash了吗?
  19. Ubuntu软件仓库源类型:官方源、第三方源、本地源
  20. 00 -- 鸢尾花数据集获取

热门文章

  1. 《C++ Primer》7.1.3节练习
  2. Bound Found POJ - 2566(尺取法+前缀和创造区间变化趋势)
  3. 法国 计算机金融 大学,捷报|GPA3.0,计算机转申金融,斩获法国顶级商学院录取!...
  4. linux下Qt编写串口调试助手,如何在linux下用QT写一个简单的串口调试助手
  5. word List 14
  6. Java写一个简单的静态文件的HTTP服务器(基于Socket)
  7. Java多线程的4种实现方式
  8. B. Product(2019ICPC西安邀请赛)(杜教筛)
  9. P4396 [AHOI2013]作业 cdq分治
  10. 【ARC103D】Distance Sums【树论】【构造】