Default Methods实例解析

 更新时间:2017年09月18日 15:10:01   作者:星星的专栏  
这篇文章主要介绍了Default Methods实例解析,介绍了默认方法的相关问题,以及与普通方法的区别,具有一定参考价值,需要的朋友可以了解下。

Oracle官网是这样介绍默认方法的,使用默认方法,可以达到往接口里面增加新的功能,而且保持与老版本代码兼容,也就是原来的实现类可以不需要被动修改。所以,默认方法位置是在接口里面;默认方法具有实现,不会强制具体类来现。Java 8要充分利用Lambda,需要增强大量的类库,但是又希望做到兼容性,只能用默认方法这个大招。

默认方法

默认方法与普通的接口方法相比,最前面增加default关键字,参数列表之后接大括号,实现该方法,再后面没有分号。

如果翻看jdk源码的interface,会发现多了default关键词。

简单介绍下。

default使我们能够在不中断实现该接口的类的情况下向接口添加新的功能。 让我们来看看下面的例子。

public class MyClass implements InterfaceA {
 /**
  * @param args the command line arguments
  */
 public static void main(String[] args) {
  // TODO code application logic here
 }
 @Override
 public void saySomething() {
  System.out.println("Hello World");
 }
}
interface InterfaceA {
 public void saySomething(); 
 
}

上面的代码显示了类MyClass实现InterfaceA的方法saySomething()。 现在我们给InterfaceA添加一个名为sayHi()的新方法。 通过这样做,我们向类MyClass引入一个问题,因为它不会编译,直到我们提供方法sayHi()的实现。

这时Default就有用了。 通过在方法的访问修饰符之前添加关键字default,我们不必为类MyClass中的方法sayHi()提供实现。

在最严格的意义上,default是倒退一步,因为它们允许你用代码“污染”你的接口。 但它们提供了最优雅和实用的方式来允许向后兼容性。 它使jdk更容易更新所有Collections类,并为您改装现有的Lambda代码。(其实这就是default产生最初原因)

public class MyClass implements InterfaceA {
 /**
  * @param args the command line arguments
  */
 public static void main(String[] args) {
  // TODO code application logic here
 }
 @Override
 public void saySomething() {
  System.out.println("Hello World");
 }
}
interface InterfaceA {
 public void saySomething();
 default public void sayHi() {
  System.out.println("Hi");
 }
}

注意,我们必须提供所有default方法的实现。 因此,default方法为我们提供了在接口中实现方法的灵活性。 如果具体类不提供该方法的实现,那么实现将被用作默认值。

多接口冲突

由于java中的类可以实现多个接口,可能会有一个情况,其中两个或更多的接口有一个default方法具有相同的名称,因此导致冲突,因为java不知道一次使用什么方法。 这将导致编译错误:类MyClass从类型InterfaceA和InterfaceB继承default sayHi()
让我们来看看下面的例子。

public class MyClass implements InterfaceA, InterfaceB {
 /**
  * @param args the command line arguments
  */
 public static void main(String[] args) {
  // TODO code application logic here
 }
 @Override
 public void saySomething() {
  System.out.println("Hello World");
 }
}
interface InterfaceA {
 
 public void saySomething();
 
 default public void sayHi() {
  System.out.println("Hi from InterfaceA");
 }
}
interface InterfaceB {
  default public void sayHi() {
  System.out.println("Hi from InterfaceB");
 }
}

为了解决这样的情况,我们必须在类MyClass中提供sayHi()方法的实现,因此覆盖InterfaceA和InterfaceB中的两个方法。

public class MyClass implements InterfaceA, InterfaceB {
 /**
  * @param args the command line arguments
  */
 public static void main(String[] args) {
  // TODO code application logic here
 }
 @Override
 public void saySomething() {
  System.out.println("Hello World");
 }
 @Override
 public void sayHi() {
  System.out.println("implemetation of sayHi() in MyClass");
 }
}
interface InterfaceA {
 
 public void saySomething();
 
 default public void sayHi() {
  System.out.println("Hi from InterfaceA");
 }
}
interface InterfaceB {
  default public void sayHi() {
  System.out.println("Hi from InterfaceB");
 }
}

如果我们想要在InterfaceA或InterfaceB中专门调用一个sayHi()方法,我们也可以这样做:

public class MyClass implements InterfaceA, InterfaceB {
 /**
  * @param args the command line arguments
  */
 public static void main(String[] args) {
  // TODO code application logic here
 }
 @Override
 public void saySomething() {
  System.out.println("Hello World");
 }
 @Override
 public void sayHi() {
  InterfaceA.super.sayHi();
 }
}
 
interface InterfaceA {
 
 public void saySomething();
 
 default public void sayHi() {
  System.out.println("Hi from InterfaceA");
 }
}
 
interface InterfaceB {
  default public void sayHi() {
  System.out.println("Hi from InterfaceB");
 }

总结

以上就是本文关于Default Methods实例解析的全部内容,希望对大家能够有帮助。

相关文章

  • Java之Scanner.nextLine()读取回车的问题及解决

    Java之Scanner.nextLine()读取回车的问题及解决

    这篇文章主要介绍了Java之Scanner.nextLine()读取回车的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringBoot集成drools的实现示例

    SpringBoot集成drools的实现示例

    本文主要介绍了SpringBoot集成drools的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • idea切换git地址并刷新右下角git分支

    idea切换git地址并刷新右下角git分支

    这篇文章主要介绍了idea切换git地址并刷新右下角git分支,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • MYSQL批量插入数据的实现代码

    MYSQL批量插入数据的实现代码

    非常的实现原理,代码较多,建议大家仔细看看。
    2008-10-10
  • Maven提示jdk版本不正确的问题

    Maven提示jdk版本不正确的问题

    这篇文章主要介绍了Maven提示jdk版本不正确的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • IDEA中Spring Initializr没有Java8选项的解决办法

    IDEA中Spring Initializr没有Java8选项的解决办法

    在使用IDEA中的Spring Initializr创建新项目时,Java 版本近可选择Java17,21 ,不能选择Java8;SpringBoot 版本也只有 3.x,所以本文给大家介绍了IDEA中Spring Initializr没有Java8选项的解决办法,需要的朋友可以参考下
    2024-06-06
  • Java Map集合用法详解

    Java Map集合用法详解

    Map用于保存具有映射关系的数据,Map集合里保存着两组值,一组用于保存Map的ley,另一组保存着Map的value;Map集合和查字典类似,通过key找到对应的value,通过页数找到对应的信息。用学生类来说,key相当于学号,value对应name,age,sex等信息。用这种对应关系方便查找
    2021-10-10
  • java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性代码示例

    java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性代码示例

    在Java开发中我们处理JSON数据时经常会遇到空值(null)的情况,这篇文章主要给大家介绍了关于java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • 基于Java编写一个神奇的代码恢复工具

    基于Java编写一个神奇的代码恢复工具

    这篇文章主要为大家详细介绍了如何基于Java编写一个神奇的代码恢复工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • 了解Maven的<relativePath/>标签用法

    了解Maven的<relativePath/>标签用法

    这篇文章主要介绍了了解Maven的<relativePath/>标签用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04

最新评论