我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java8为什么会有默认方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java8为什么会有默认方法

这篇文章将为大家详细讲解有关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为什么会有默认方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java8为什么会有默认方法

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

下载Word文档

猜你喜欢

Java8为什么会有默认方法

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

Java8的默认方法是什么

这篇文章主要介绍了Java8的默认方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java8的默认方法是什么文章都会有所收获,下面我们一起来看看吧。什么是默认方法默认方法是接口中用default修饰的方
2023-06-29

Java8默认方法会破坏用户的代码吗

这篇文章主要讲解了“Java8默认方法会破坏用户的代码吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java8默认方法会破坏用户的代码吗”吧!起初看来,默认方法给Java虚拟机的指令集带来
2023-06-17

Python函数为什么会默认返回None

本篇内容主要讲解“Python函数为什么会默认返回None”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python函数为什么会默认返回None”吧!在正式开始之前,我们就用之前讨论过的 pas
2023-06-16

React不能将useMemo设置为默认方法原因是什么

这篇文章主要介绍了React不能将useMemo设置为默认方法原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React不能将useMemo设置为默认方法原因是什么文章都会有所收获,下面我们一起来看看吧
2023-07-02

Redis为什么默认有16个数据库问题

这篇文章主要介绍了Redis为什么默认有16个数据库问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-16

ubuntu恢复默认源的方法是什么

要恢复Ubuntu的默认软件源,可以通过以下步骤进行操作:1. 打开终端(Ctrl+Alt+T)。2. 编辑 `/etc/apt/sources.list` 文件。可以使用命令 `sudo nano /etc/apt/sources.lis
2023-10-12

android设置默认launcher的方法是什么

要设置默认的launcher,可以按照以下步骤进行操作:1. 打开手机的设置菜单。2. 在设置菜单中,找到并点击“应用”或“应用管理”。3. 在应用管理中,找到并点击“默认应用”或“默认应用程序”。4. 在默认应用程序列表中,找到“桌面”或
2023-09-22

mysql默认值设置的方法是什么

在 MySQL 中设置默认值的方法是在创建表时,在字段定义后使用 DEFAULT 关键字,并指定默认值。例如:CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(50),depa
mysql默认值设置的方法是什么
2024-04-09

tomcat默认目录修改的方法是什么

要修改Tomcat默认目录,可以按照以下步骤操作:打开Tomcat的配置文件,通常是在Tomcat安装目录下的conf文件夹中,可以找到server.xml文件。找到以下配置项,可以修改Tomcat的默认目录:tomcat默认目录修改的方法是什么
2024-03-11

mysql设置字段默认值的方法是什么

在MySQL中,可以使用ALTER TABLE语句来设置字段的默认值。具体步骤如下:打开MySQL命令行或者MySQL客户端工具。连接到目标数据库。使用ALTER TABLE语句来修改表结构并设置字段的默认值。语法如下:ALTER TAB
mysql设置字段默认值的方法是什么
2024-02-29

Win8系统设置默认输入法的方法是什么

Win8系统设置默认输入法的方法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在win8系统就自带有微软的输入法,一般来说会设置成默认输入法。有的用户习惯
2023-06-28

sql语句添加默认约束的方法是什么

在SQL中,添加默认约束可以通过ALTER TABLE语句来实现。具体的方法如下:1. 添加默认约束的语法如下:ALTER TABLE 表名ALTER COLUMN 列名 SET DEFAULT 默认值;2. 示例:假设有一个名为stude
2023-09-05

Springsession redis修改默认的序列化方法是什么

本篇内容介绍了“Springsession redis修改默认的序列化方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、配置Spr
2023-07-05

win10默认安装路径修改的方法是什么

要修改Windows 10的默认安装路径,可以按照以下步骤进行操作:1. 打开“设置”应用程序。你可以在开始菜单中搜索“设置”并点击打开。2. 在“设置”应用程序中,点击“系统”。3. 在“系统”选项卡中,选择“存储”。4. 在“存储”选项
2023-09-18

电脑默认打开程序的修改方法是什么

电脑默认打开程序的修改方法可以通过以下步骤进行操作:1. 在Windows系统中,右键单击要修改默认打开程序的文件,选择“属性”选项。2. 在属性对话框中,点击“更改”按钮。3. 在“打开方式”对话框中,选择要作为默认打开程序的程序,并点击
2023-09-11

C++ 函数的默认参数的使用方法是什么?

默认参数允许函数在调用时指定默认值,简化代码并提高维护性。默认参数的语法为:type function_name(parameter_list, type parameter_name = default_value)。其中,type 为参
C++ 函数的默认参数的使用方法是什么?
2024-04-19

为什么Windows8不能搜索文件内容(windows8默认搜索选项修改方法)

当你从Windows XP升级到Windows8后,你会发现在Windows XP使用“搜索”功能时,能够以文件中的内容作为关键字进行查找,然而在Windows8中,当你在“搜索”框中键人关键
2022-06-04

有什么办法可以阻止默认的golang程序完成

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《有什么办法可以阻止默认的golang程序完成》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多
有什么办法可以阻止默认的golang程序完成
2024-04-05

云服务器ssh修改默认端口的方法是什么

修改云服务器SSH默认端口的方法有以下几种:1. 修改SSH配置文件:登录到云服务器,找到SSH配置文件(一般是/etc/ssh/sshd_config),用文本编辑器打开文件,找到"Port"行,并将默认端口号修改为你想要的新端口号。保存
2023-08-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录