iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Java8为什么会有默认方法
  • 426
分享到

Java8为什么会有默认方法

2023-06-06 18:06:25 426人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关Java8为什么会有默认方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言在Java 8之前,默认情况下,接口中的所有方法都是公共的和抽象的。但是这一限制在Java 8中被

这篇文章将为大家详细讲解有关Java8为什么会有默认方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

前言

在Java 8之前,默认情况下,接口中的所有方法都是公共的和抽象的。但是这一限制在Java 8中被打破了,Java 8允许开发人员在接口中添加新方法,而无需在实现这些接口的类中进行任何更改。

为什么会有默认方法?

主要是为了方便扩展已有接口;如果没有默认方法,假如给Java中的某个接口添加一个新的抽象方法,那么所有实现了该接口的类都得修改,影响将非常大。

举个例子,Sortable <T>接口以及实现该接口的类SortableNumberCollection和SortableStrinGCollection。该接口有两种方法:void sort(); 和T peek()。

public interface Sortable<T> { void sort(); T peek();}

sort()方法用于对象排序,T peek()用于获取指定元素,另外需要一个比较器类ObjectComparator来对对象进行排序。

public class ObjectComparator implements Comparator<Comparable> { @Override public int compare(Comparable o1, Comparable o2) {  return o1.compareTo(o2); }}

SortableStringCollection是一个自定义集合类可以进行排序,并查看字符串指定元素,代码如下:

public class SortableStringCollection implements Sortable<String> { private List<String> items = new ArrayList<>(); public void add(String item) {  items.add(item); } @Override public void sort() {  items.sort(new ObjectComparator()); } @Override public String peek() {  return items.get(0); }}

同样,SortableNumberCollection是一个自定义集合类,其中包含可以使用接口方法进行排序和查看的数字列表指定元素,代码如下:

public class SortableNumberCollection implements Sortable<Integer> { private List<Integer> items = new ArrayList<>(); public void add(Integer item) {  items.add(item); } @Override public void sort() {  items.sort(new ObjectComparator()); } @Override public Integer peek() {  return items.get(0); }}

在Java8之前如果对接口Sortable<T>添加新方法:T sortAndPeek(),那么SortableStringCollection和

SortableNumberCollection都必须实现T sortAndPeek()方法。

Java8之后提供了一种新的实现方式,默认方法 default method,我们可以对Sortable<T>进行如下改造:

public interface Sortable<T> { void sort(); T peek(); default T sortAndPeek(){ // New 'default method' added in the interface  sort();  return peek(); }}

同时SortableStringCollection和SortableNumberCollection类不需要任何更改。这样可以减少我们对原有代码的改动。同时如果需要,还可以在实现此接口的任何类中重写该方法T sortAndPeek()的默认实现。

在下图中我们看到default Method不通的标识:

Java8为什么会有默认方法

在多继承中使用默认方法问题

如果两个或多个接口具有相同的默认方法签名,并且一个类实现了这两个接口,则将引发编译时错误。例如:

public interface Interface1 { void methodOne(String str); default void newMethod(){  System.out.println("Interface1: Newly added method"); }}public interface Interface2 { void methodTwo(String str); default void newMethod(){  System.out.println("Interface2: Newly added method"); }}public class InterfaceImplementation implements Interface1, Interface2{ @Override public void methodOne(String str) {  System.out.println("Overridden methodOne: " + str); } @Override public void methodTwo(String str) {  System.out.println("Overridden methodTwo: " + str ); }}

此时代码会提示如下异常:

InterfaceImplementation inherits unrelated defaults for newMethod() from types Interface1 and Interface2

要解决此问题,我们将必须重写类InterfaceImplementation中的方法:

public class InterfaceImplementation implements Interface1, Interface2{ @Override public void methodOne(String str) {  System.out.println("Overridden methodOne: " + str); } // newMethod implemented to resolve the conflict. @Override public void newMethod() {  System.out.println("InterfaceImplementation: Newly added method"); } @Override public void methodTwo(String str) {  System.out.println("Overridden methodTwo: " + str ); }}

我们总结一下:

  • 类中的方法优先级最高。类或父类中声明的方法的优先级高于任何声明为默认方法的优先级。

  • 如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体。

  • 最后,如果还是无法判断,继承了多个接口的类必须通过显式覆盖和调用期望的方法,显式地选择使用哪一个默认方法的实现。

在Java 8中添加静态方法

接口定义的静态方法独立于任何对象调用。所以,在调用静态方法时,不需要实现接口,也不需要接口的实例,

就像“默认方法”一样,“静态方法”也可以添加到接口中。例如,我们可以添加一个静态方法Direction getDefaultDirection(),该方法将返回默认Direction,例如:

public interface Sortable<T> { Direction defaultDirection = Direction.DESC; enum Direction {  ASC,  DESC }; void sort(); T peek(); static Direction getDefaultDirection(){ // 'static method' added to the interface.  return defaultDirection; }}

在上面的示例中,可以使用类引用来调用静态Direction getDefaultDirection()方法:

Sortable.getDefaultDirection()

对默认方法和静态方法的一点思考

接口是设计模式中一种开闭原则的体验,而java8赋予了接口新的特性,使得接口使用起来更加的得心应手了,这也有助于我们更加内聚自己的代码结构了。Java源码中也有很多场景使用到了默认方法,例如:Iterator接口,我们在开发中可以多使用一些新的特性从而提高开发效率及增加代码的健壮性。

public interface Iterable<T> { Iterator<T> iterator();  default void forEach(Consumer<? super T> action) {  Objects.requireNonNull(action);  for (T t : this) {   action.accept(t);  } }  default Spliterator<T> spliterator() {  return Spliterators.spliteratorUnknownSize(iterator(), 0); } }

关于“Java8为什么会有默认方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Java8为什么会有默认方法

本文链接: https://www.lsjlt.com/news/248193.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java8为什么会有默认方法
    这篇文章将为大家详细讲解有关Java8为什么会有默认方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言在Java 8之前,默认情况下,接口中的所有方法都是公共的和抽象的。但是这一限制在Java 8中被...
    99+
    2023-06-06
  • Java8的默认方法是什么
    这篇文章主要介绍了Java8的默认方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java8的默认方法是什么文章都会有所收获,下面我们一起来看看吧。什么是默认方法默认方法是接口中用default修饰的方...
    99+
    2023-06-29
  • Java8默认方法会破坏用户的代码吗
    这篇文章主要讲解了“Java8默认方法会破坏用户的代码吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java8默认方法会破坏用户的代码吗”吧!起初看来,默认方法给Java虚拟机的指令集带来...
    99+
    2023-06-17
  • Java8 接口默认方法和静态方法
    目录1、默认接口方法2、静态接口方法3、两者的场景差异前些日有同学问我Java接口中为什么要增加一个默认方法。在Java 8 中不单单增加了默认接口方法还增加了静态接口方法。今天就来...
    99+
    2024-04-02
  • Java8新特性之默认方法详解
    目录简介正文什么是默认方法为啥要提供默认方法呢?如果不提供呢?主要针对谁?实现了默认方法的接口和抽象类有区别吗是不是可以说Java现在也实现了多重继承?总结简介 在Java之前,我们...
    99+
    2024-04-02
  • Python函数为什么会默认返回None
    本篇内容主要讲解“Python函数为什么会默认返回None”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python函数为什么会默认返回None”吧!在正式开始之前,我们就用之前讨论过的 pas...
    99+
    2023-06-16
  • Java8接口之默认方法与静态方法详解
    目录前言为什么选择默认方法?Java 8示例:接口中的默认方法Java 8示例:接口中的静态方法Java 8 - 抽象类与接口总结前言 在Java8之前,java中的接口只能有抽象方...
    99+
    2024-04-02
  • 详解Java8中接口的默认方法和静态方法
    目录一、基本语法二、使用场景三、作用四、使用案例三、总结Java 8是Java语言的一个重要版本,其中引入了许多新特性和改进,其中一个值得关注的特性是接口的默认方法和静态方法。这篇文...
    99+
    2023-05-20
    Java8接口默认方法 Java8接口静态方法 Java8接口 Java8新特性
  • 如何理解Java8接口中的默认方法和静态方法
    本篇内容介绍了“如何理解Java8接口中的默认方法和静态方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.接口中的默认方法和静态方法Ja...
    99+
    2023-06-25
  • Java8新特性之接口中的默认方法和静态方法详解
    目录一、前言二、为什么在 Java 接口中使用默认方法?三、为什么在 Java 接口中使用静态方法?四、场景一:接口中的默认方法五、场景二:接口中的静态方法六、情景三:多重继承 - ...
    99+
    2024-04-02
  • React不能将useMemo设置为默认方法原因是什么
    这篇文章主要介绍了React不能将useMemo设置为默认方法原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React不能将useMemo设置为默认方法原因是什么文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-02
  • Redis为什么默认有16个数据库问题
    目录16个数据库的由来正确理解Redis的“数据库”概念集群情况下是否支持一个实例多个db?总结在实际项目中Redis常被应用于做缓存,分布式锁、消息队列等。...
    99+
    2023-02-16
    Redis数据库 Redis默认数据库 Redis16个数据库
  • ubuntu恢复默认源的方法是什么
    要恢复Ubuntu的默认软件源,可以通过以下步骤进行操作:1. 打开终端(Ctrl+Alt+T)。2. 编辑 `/etc/apt/s...
    99+
    2023-10-12
    ubuntu
  • android设置默认launcher的方法是什么
    要设置默认的launcher,可以按照以下步骤进行操作:1. 打开手机的设置菜单。2. 在设置菜单中,找到并点击“应用”或“应用管理...
    99+
    2023-09-22
    android
  • Java8新特性之接口中默认方法和静态方法的示例分析
    这篇文章给大家分享的是有关Java8新特性之接口中默认方法和静态方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言Java 8 引入了默认方法以及可以在接口中定义的静态方法。默认方法是一个普通的...
    99+
    2023-06-15
  • mysql默认值设置的方法是什么
    在 MySQL 中设置默认值的方法是在创建表时,在字段定义后使用 DEFAULT 关键字,并指定默认值。例如: CREATE TAB...
    99+
    2024-04-09
    mysql
  • 深入理解Java8新特性之接口中的默认方法和静态方法
    1.接口中的默认方法和静态方法 Java 8中允许接口中包含具有具体实现的方法,该方法称为 “默认方法” ,默认方法使用 default 关键字修饰。 接口默认方法的 ” 类优先 ”...
    99+
    2024-04-02
  • MySQL5.7中sql_mode默认值会带来什么问题
    这篇文章主要介绍MySQL5.7中sql_mode默认值会带来什么问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在正常项目开发过程中,如果MySQL版本从5.6升级到5.7版本。...
    99+
    2024-04-02
  • 为什么Linux默认页大小是 4KB
    这期内容当中小编将会给大家带来有关为什么Linux默认页大小是 4KB,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。为什么这么设计(Why&rsquo;s THE  Design)是一系...
    99+
    2023-06-16
  • 在navicat中为datetime设置默认值的方法
    小编给大家分享一下在navicat中为datetime设置默认值的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在使用navicat设计表的字段时,是可以给字段设置默认值的,但是dat...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作