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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public interface SimpleInterface {

public void doSomeWork();

}

class SimpleInterfaceImplimplements SimpleInterface{

public void doSomeWork() {

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

}

public static void main(String[] args) {

SimpleInterfaceImpl simpObj =new SimpleInterfaceImpl();

simpObj.doSomeWork();

}

}

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

1

2

3

4

public interface SimpleInterface {

public void doSomeWork();

public void 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()in SimpleInterface

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

public interface SimpleInterface {

public void doSomeWork();

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

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

default public void doSomeOtherWork(){

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

}

}

class SimpleInterfaceImplimplements SimpleInterface{

public void doSomeWork() {

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

}

/*

* Not required to override to provide an implementation

* for doSomeOtherWork.

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

*/

public static void main(String[] args) {

SimpleInterfaceImpl simpObj =new SimpleInterfaceImpl();

simpObj.doSomeWork();

simpObj.doSomeOtherWork();

}

}

该程序的输出是:

1

2

Do Some Work implementationin the class

DoSomeOtherWork implementationin the interface

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

更新:

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

1

2

3

4

5

6

7

8

9

10

11

public interface InterfaceWithDefaultMethod {

public void someMethod();

default public void someOtherMethod(){

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

}

}

public interface InterfaceWithAnotherDefMethod {

default public void someOtherMethod(){

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

}

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

public class DefaultMethodSampleimplements

InterfaceWithDefaultMethod, InterfaceWithAnotherDefMethod{

public void someMethod(){

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

}

public static void main(String[] args) {

DefaultMethodSample def1 =new DefaultMethodSample();

def1.someMethod();

def1.someOtherMethod();

}

}

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

java 8 new feature_java 8 new feature --- default method相关推荐

  1. Java 8 - Interface Default Method接口默认方法

    Java 8 相比于Java 7 推出了几大特色(features)(接口默认方法)default methods in interface, (接口静态方法)static method in int ...

  2. java.security.InvalidKeyException: Illegal key size or default parameters

    今天在使用idea打包maven项目时,出现这个错误:java.security.InvalidKeyException: Illegal key size or default parameters ...

  3. 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)

    Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...

  4. 异常java.lang.IllegalArgumentException: Validation failed for query for method public abstract

    出现下列异常信息,异常关键报错:java.lang.IllegalArgumentException: Validation failed for query for method public ab ...

  5. 解决FutureWarning: The default method ‘yw‘ can produce PACF values outside of the [-1,1] interval.

    出现了FutureWarning: The default method 'yw' can produce PACF values outside of the [-1,1] interval. Af ...

  6. Java机器学习库ML之二Feature Selection(特征选择)

    机器学习中训练模型的前提必备工作就是特征选择,起到降维和降低计算开销的目的,当然在获取尽可能小的特征子集的同时,应不显著降低分类精度.不影响类分布.保持特征子集的稳定适应性强等. ML库提供了特征选择 ...

  7. java基础 - 关键字private、protected、default、public、final

    四种访问控制方式 关键字 范围 private 私用模式 本类 protected 保护模式 本类及子类 default(可不写) 默认包模式 包内 public 共用模式 任何地方 Final: 用 ...

  8. java中的访问控制(private、default、protected、public)

    在java中,针对类.成员方法和属性提供了四种访问级别,分别是private.default.protected.public.这四种控制级别有小到大依次为:private–default–prote ...

  9. Java类成员默认访问控制权限是default

    Java类成员中的四种访问权限分别是 :Private.Default.Protected.Public 我们平常都知道Private.Protected.Public却不很关注Default 他们的 ...

最新文章

  1. np.squeeze()函数
  2. ALGORITHM IMPORTANT QUESTIONS
  3. python新手最容易犯的错误_Python新手最容易犯的十大错误
  4. 二十六、深入Python中的time和datetime模块
  5. 13.multi-term-vector请求
  6. Gradle 1.12用户指南翻译——第五十四章. 构建原生二进制文件
  7. C#中的序列化和反序列化
  8. 关于eclipse的一些简单配置
  9. BZOJ 3524: [Poi2014]Couriers【主席树】
  10. R语言入门(2)——R包的安装
  11. win7映射网络驱动器消失了_win7系统映射网络驱动器出现问题的解决方法
  12. 简单易操作Jsp动态网页
  13. 各类图片素材网址汇总,让网站的banner有灵魂!!
  14. 联想笔记本windows10设备管理器找不到蓝牙
  15. 维护外贸客户关系的技巧!
  16. 模拟微信发送文件给好友/群
  17. 用c#实现一个鼠标连点器
  18. Ardupilot 串口代码学习
  19. [开发] RK3328媒体脚本(Rock64,Renegade)-启用视频和3D加速
  20. 影像科dsa为什么必须买维修保险_大型数字减影血管成像系统(DSA)的日常保养和维护...

热门文章

  1. 送你一份后端必备的 Git 分支开发规范指南
  2. docker-compose安装镜像
  3. CentOS 7主机名修改与查看命令详述
  4. 聊聊区块链,虽然我不挖矿!
  5. delphi 一些知识文章地址记录(正则)
  6. spirng整合rmi
  7. UVa 1347 旅行
  8. 转:获得数据库自增长ID(ACCESS)与(SQLSERVER)
  9. Struts向JSP中传值
  10. Android使用软引用和弱引用