8. Java8新特性-默认方法(default method)

JDK8提供的接口默认方法 在以往的编写代码中,例如我们会定义三层架构,包含 controller,service,mapper等。service中,我们会详细的分为 ***Service 和 ***ServiceImpl的形式。 ​​​​​​​​​​​​​​ 在JDK8以前,interface接口方法只能定义常量 和 抽象方法默认的修饰词为public staticfinal 和 pub... 阅读详情

传统上(< JDK8)接口中定义的方法都是public abstract的,都是没有实现的,实现接口的类必须为接口中定义的每一个方法提供实现,否则会有编译错误。

但一旦库的设计者需要更新接口,向其中加入新的方法,这种方式就会出现问题。 因为现存的实现类都不在库设计者的控制范围内,当项目升级JDK版本后,这些实体类为了适配更改后的接口,需要再修改,尤其是JDK8是非常重要的版本更新增加了大量方法。

所以库设计者为了避免出现大规模更改代码,方便大家升级到JDK8,引入了新的机制,即JDK8之后接口现在支持声明方法的同时提供实现,打破了接口中方法都是public abstract的约定

通过两种方式可以完成这种操作:

  1. 允许在接口中声明静态方法。
  2. 允许定义默认方法(default)。

接口的实现类如果不显式的提供默认方法的具体实现,就会自动继承默认的实现。

之前学习Stream API可以用了很多default 方法,典型的是:

  1. List接口定义的sort方法
default void sort(Comparator<? super E> c){ 
    Collections.sort(this, c); 
}
  1. Collection接口定义的stream方法
default Stream<E> stream() { 
    return StreamSupport.stream(spliterator(), false); 
}
静态方法和接口

同时定义接口和工具辅助类是Java语言常用的一种模式,工具类定义了许多和接口实例协作的静态方法,典型的如:Collection接口和Collections工具类。现在接口本身就能定义静态类,为了保持向后的兼容性,这些类还是会存在。

解决冲突的规则

Java语言中一个类只能继承一个父类,但是一个类可以实现多个接口。随着默认方法在Java 8中引入,有可能出现一个类继承了多个方法而它们使用的却是同样的函数签名。当发生这样的情况时,JDK会如何处理冲突?

示例:

public interface A { 
   default void hello() { 
       System.out.println("Hello from A"); 
   } 
} 

public interface B extends A { 
   default void hello() { 
       System.out.println("Hello from B"); 
   } 
} 

public class C implements B, A { 
   public static void main(String[] args) { 
       new C().hello(); 
   } 
}

// 打印结果是什么?

解决该问题的三个规则
  1. 类中的方法优先级最高。即类中或父类中声明的方法优先级高于default方法
  2. 如果第一点无法判断,则子接口的优先级更高,即如果B继承了A,则B接口中方法优先级更高(上面示例的情况即是如此,所以会打印:Hello from B)
  3. 如果依然无法判断,继承了多个接口的类必须通过显式覆盖和调用期望的方法,来显式的选择一个default方法实现。

第三点举个示例:

public interface A { 
   default void hello() { 
       System.out.println("Hello from A"); 
   } 
} 

public interface B { 
   default void hello() { 
       System.out.println("Hello from B"); 
   } 
} 

public class C implements B, A { 
   
   void hello() {
       B.super.hello();
   }

   public static void main(String[] args) { 
       new C().hello(); 
   } 
}

// 如上所示,当出现第三种情况时,需要显式复写冲突的方法,可在方法体中调用父接口的实现(B.super.hello())
小结

Java 8中的接口可以通过默认方法和静态方法提供方法的代码实现。

  1. 默认方法的开头以关键字default修饰,方法体与常规的类方法相同。
  2. 默认方法的出现能帮助库的设计者以后向兼容的方式演进API。
  3. 我们有办法解决由于一个类从多个接口中继承了拥有相同函数签名的方法而导致的冲突。
PEMFC电化学入门:从电流密度到Tafel公式的实战计算指南 本文详细介绍了PEMFC电化学的基础知识,从电流密度计算到Tafel公式的应用,提供了实战计算指南。通过代码示例和常见问题排查,帮助工程师快速掌握燃料电池性能优化的关键参数,如交换电流密度和活化损失计算,适用于汽车动力和分布式发电等领域。 阅读详情

相关推荐

孟德尔随机化(三)—— 再也不用担心网络或其他各种报错啦 | 从数据库下载数据到本地的数据处理方法

很多小伙伴们反映在使用代码下载数据时会遇到各种网络或其他报错问题,令人头大的那种!不要慌!从数据库下载数据到本地的数据处理方法这就来啦!

weixin_43843918的博客 2万+

接口default method , 多继承

1.什么是default method? interface 中的default method就是一个具体方法。在扩展接口时,为了满足向后兼容,采用default method。 比如,List接口中的sort方法default void sort(Comparator<? super E> c){ Collections.sort(this, c); } 方法的调用 再比如,Collection里的stream: default Stream<E>

greywolf5的博客 688

默认方法Default Methods)是Java 8引入的一项新功能,它允许在接口中定义具有默认实现方法

它允许我们在接口中添加新方法,而不会破坏默认方法Default Methods)是Java 8引入的一项新功能,它允许在接口中定义具有默认实现方法。这使得在已有的接口中添加新方法时,不会破坏已有的实现类,因为它们可以继承默认方法实现。需要注意的是,如果一个类实现了多个接口,而这些接口中包含同名的默认方法,那么实现类必须在自己的类中重写该方法,以消除冲突。需要注意的是,如果一个类实现了多个接口,而这些接口中包含同名的默认方法,那么实现类必须在自己的类中重写该方法,以消除冲突。来调用接口中的默认实现

TechWhiz的博客 421

linux下获取IP地址的N种方法

第一种方法:ifconfig|grep inet |awk '{print $2}'|sed '2d'|awk -F : '{print $2}' 第二种方法:ifconfig|grep inet|sed -n '1p' |awk '{print $2}'|awk -F : '{print $2}' 第三种方法:ifconfig|grep "inet addr"|grep -v "127.0.

WOOOLILI 1191

java8新特性系列】默认方法

接口中定义了一个default methodmyMethod(),它提供了默认方法实现

wang2leee的博客 455

Spring 4.2新特性-java8默认方法(default method)定义Bean的支持

2.1 默认方法(default method) java8引入了一个default medthod; 用来扩展已有的接口,在对已有接口的使用不产生任何影响的情况下,添加扩展 使用default关键字 Spring 4.2支持加载在默认方法里声明的bean 2.2 将要被声明成bean的类 public class DemoService { public...

汪云飞记录本 871

java8新特性_Java8

Java8没有安排释放,直到2014年3月,但早期发行版本已经可用了一段时间。 一些最有趣的新功能是: 流 功能接口 默认方法 Lambdas Java时间 流 新的java.util.stream软件包包含“支持元素流上的功能样式操作的类”。 流不是新的集合类型,并且不替换任何现有的集合,例如列表和队列。 相反,它们提供了一种与现有集合进行交互的方式,并且在这...

最佳 Java 编程 208

Java1.8新的语言特性——默认方法Default Methods)

Java1.8新的语言特性——默认方法Default Methods): (原版)很详细的解析,分享一下http://ebnbin.com/2015/12/20/java-8-default-methods/

一点一滴 478

接口的介绍

在抽象类中,抽象方法本质上是定义接口规范,而接口是一种规则(给部分类的一种通道)。public interface 接口名。

m0_74081418的博客 112

Java 8 接口新特性默认方法与静态方法实战

Java 8 引入了接口默认方法Default Methods),这是自 Java 面世以来对接口概念的重大扩展。默认方法允许开发者在接口中添加新方法的同时,不会破坏已有的实现类。本章将简要概述这一特性,并探究其背后的设计动机及对现有代码库可能产生的影响。在 Java 8 之前,接口仅能声明方法签名,而具体的实现则由实现接口的类来完成。这导致一旦接口有更新,所有实现类都可能需要做相应的调整。这种设计模式在新的编程范式下显得不够灵活,比如在需要引入新方法以适应 lambda 表达式的场景下。

weixin_42596214的博客 680

JDK8新特性default、扩展注解、反射方法参数、hashmap性能提升

JDK8新特性之optional详解1 接口default 方法2 扩展注解支持2.1 增加FunctionalInterface注解2.2 对元注解的增强2.3 增加Repeatable 元注解 1 接口default 方法   接口方法默认使用public abstract修饰, 接口中字段默认使用public static final修饰.   在 JDK8 中对接口进行增强, 可...

ChengZi~ 1038

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

我们都知道在Java语言接口中只能定义方法名,而不能包含方法的具体实现代码。接口中定义的方法必须在接口的非抽象子类中实现。下面就是关于接口的一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public interfa...

chuituoyi7265的博客 130

函数式接口接口default默认方法JDK8

函数式接口 当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。 这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。 如下: @FunctionalInterface public interface Runnable { public abstract void run(); } @FunctionalInterfa...

空杯 1436

()JDK8接口default方法和static方法使用

看到一篇文章,里面详细介绍了如何在接口中使用 default 方法和 static 方法,转载一下. 原文链接 Static and Default Methods in Interfaces in Java 1.概述 Java 8 引入了几个新的特性,包括 lambda 表达式, 函数式接口(functional interfaces),方法引用(method references),Stream API, Optional 类, 以及接口中定义默认(default)方法和静态(static)方法,我.

sinat_34067387的博客 636

Java8 default methods 默认方法的概念与代码解析

2014-04-10 18:00 cloud-coder oschina 我要评论(0) 字号:T | T Java 8引入default method,或者叫virtual extension method,目的是为了让接口可以事后添加新方法而无需强迫所有实现接口的类都提供新方法实现。也就是说它的主要使用场景可能会涉及代码演进。 AD:51CTO开启企业运维技术盛

zhuhai__yizhi的专栏 825

Java接口中的默认方法Default Methods)

Java 8发布之后,接口的功能得到了显著增强,其中最引人注目的特性之一就是默认方法默认方法允许接口提供带有实现方法,这不仅不会破坏现有代码的兼容性,还能为所有实现了该接口的类直接提供新功能。

小李同学的博客 2643

Java 8default方法详解

Java 8default方法详解作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszsJava 8新增了default方法,它可以在接口添加新功能特性,而且还不影响接口实现类。下面我们通过例子来说明这一点。public class MyClass implements InterfaceA { public static void main(Strin

chszs的专栏 1万+

Java 8(五):默认方法Default Methods)

文章目录1、简介2、java 8中的默认方法是什么?3、为什么java 8中需要默认方法?4、调用默认方法时如何解决冲突? 1、简介 Java 程序的接口是将相关方法按照约定组合到一起的方式。实现接口的类必须为接口中定义的每个方法提供具体的实现,或者从父类中继承它。但是,一旦接口更新,现有的实体类为了适配接口也需要进行更新。 Java 8为了解决这一问题引入了一种新的机制。Java 8中的接口现在...

码客 1210

JDK8接口新增的默认方法和静态方法

jdk8之前,在接口interface中是不能写默认方法的,都只能是抽象方法,当这个接口有多个实现类的时候,在接口中新增一个抽象方法,则每个实现类都要实现方法,不利于扩展。 而默认方法可以写在接口中,并且有方法体,不用每个实现类都去实现实现类可以直接调用或者重写: 1.接口默认方法使用方式一:实现类直接调用: 运行结果如下: 2.接口默认方法使用方式二:重写 当默认方法觉得默认方法不太行的时候也可以去重写,自己实现: 二、接口中的静态方法默认方法的修饰符defualt改为statis即可 三、

初夏0811的博客 2万+

JESD22标准PC、TC、TS、HTOL、HTRB、HBM、CDM、MM等与IPC/JESD J-STD-020标准详细解读文章对应标准

JESD22标准PC、TC、TS、HTOL、HTRB、HBM、CDM、MM等与IPC/JESD J-STD-020标准详细解读对应标准源文件

上一篇: 7. Java8新特性-并行数据处理(parallel)
下一篇: 9. Java8新特性-Optional
elegent Developer
博客等级 码龄12年 17粉丝 · 81原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值