接口(interface)中定义 `default` 方法

在 Java 8 及以后版本中,接口(interface)中可以定义 default 方法。default 方法允许接口提供一个默认的实现,使得接口不仅仅是方法签名的集合,也可以包含方法的具体实现。这一特性提供了更大的灵活性和向后兼容性。以下是 default 方法的详细作用和使用场景:

default 方法的作用

  1. 向后兼容

    • 当接口需要添加新方法时,使用 default 方法可以避免破坏实现该接口的现有类。这意味着不需要修改所有实现类来实现新添加的方法。
  2. 提供默认实现

    • default 方法允许接口提供一个默认的实现,具体的实现类可以选择使用默认实现或者重写它。
  3. 增强接口的能力

    • default 方法使接口可以携带行为,实现更强大的设计模式,如策略模式(Strategy Pattern)等。

使用场景

  1. 扩展接口

    • 当需要在接口中添加新方法时,可以通过 default 方法提供一个默认实现,从而保持与现有代码的兼容性。
  2. 提供通用行为

    • 在接口中定义一些通用的行为,这些行为对所有实现类都有意义,可以通过 default 方法实现。

语法和示例

定义 default 方法
public interface MyInterface {// 抽象方法void abstractMethod();// 默认方法default void defaultMethod() {System.out.println("This is a default method.");}
}
实现接口的类
public class MyClass implements MyInterface {// 实现抽象方法@Overridepublic void abstractMethod() {System.out.println("This is an abstract method implementation.");}// 可以选择重写默认方法@Overridepublic void defaultMethod() {System.out.println("This is a overridden default method.");}
}
使用接口和默认方法
public class Main {public static void main(String[] args) {MyClass myClass = new MyClass();myClass.abstractMethod();  // 调用抽象方法myClass.defaultMethod();   // 调用重写的默认方法}
}
不重写默认方法的情况
public class AnotherClass implements MyInterface {@Overridepublic void abstractMethod() {System.out.println("This is another implementation of the abstract method.");}
}public class Main {public static void main(String[] args) {AnotherClass anotherClass = new AnotherClass();anotherClass.abstractMethod();  // 调用抽象方法anotherClass.defaultMethod();   // 调用接口中的默认方法}
}

注意事项

  1. 多重继承冲突

    • 如果一个类实现了多个接口,并且这些接口都有同名的 default 方法,则必须在该类中重写该方法来解决冲突。
    public interface InterfaceA {default void myMethod() {System.out.println("InterfaceA myMethod");}
    }public interface InterfaceB {default void myMethod() {System.out.println("InterfaceB myMethod");}
    }public class MyClass implements InterfaceA, InterfaceB {@Overridepublic void myMethod() {// 必须明确指定调用哪一个接口的默认方法,或者提供自己的实现InterfaceA.super.myMethod();InterfaceB.super.myMethod();// 或者// System.out.println("MyClass myMethod");}
    }
    
  2. default 关键字

    • default 关键字只能用于接口中的方法,不能用于类中的方法。

结论

default 方法在 Java 8 中引入,为接口提供了向后兼容性和行为定义的能力。它使接口可以在不破坏现有实现的情况下演化和扩展,增强了接口的灵活性和可用性。在设计接口时,可以充分利用 default 方法来提供默认行为和实现通用功能。
联系我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

张量分解(2)——张量运算(内积、外积、直积、范数)

🍅 写在前面 👨‍🎓 博主介绍:大家好,这里是hyk写算法了吗,一枚致力于学习算法和人工智能领域的小菜鸟。 🔎个人主页:主页链接(欢迎各位大佬光临指导) ⭐️近…

MATLAB贝叶斯线性回归模型案例

采用辛烷值数据集“spectra_data.mat”(任意数据集均可),介绍贝叶斯线性回归模型的构建和使用流程。 运行结果如下: 训练集预测精度指标如下: 训练集数据的R2为: 1 训练集数据的MAE为: 0.00067884 训练集数据的RMSE为: 0.0008893…

STM32点灯闪烁

stm32c8t6引脚图 开发板引脚图 GPIO端口的每个位可以由软件分别配置成 多种模式。 ─ 输入浮空 ─ 输入上拉 ─ 输入下拉 ─ 模拟输入 ─ 开漏输出 ─ 推挽式输出 ─ 推挽式复用功能 ─ 开漏复用功能 配置GPIO端口步骤:开启时钟->使用结构体设置输出模式…

水仙花数算法

一、水仙花的传说 希腊神话故事 传说希腊神话里,美少年纳西索斯(Narcissus)是希腊最俊美的男子,无数的少女对他一见倾心,可他却自负地拒绝了所有的人。这当中包括美丽的山中仙女伊可(Echo)。伊可…

分享一些提升效率的办公、学习神器!

分享一些提升效率的办公、学习神器! 文章目录 分享一些提升效率的办公、学习神器! 一、 ✅ 文件搜索工具 Everything:1.1 Everything 主要功能:1.2 Everything 下载地址: 二、 ✅ 文件压缩解压工具 7 - Zip&#xff1a…

AI免费英语学习在线工具:Pi;gpt;其他大模型AI 英语学习智能体工具

1、pi(强烈推荐:可以安卓下载使用) https://pi.ai/talk (网络国内使用方便) 支持实时聊天与语音对话 2、chatgpt(强烈推荐:可以安卓下载使用) https://chat.openai.com/ (网络国内使用不方便&#xf…

2028年企业云存储支出翻倍,达到1280亿美元

根据Omdia的研究,到2028年,企业云存储支出将从去年的570亿美元翻一番以上,达到1280亿美元。该研究分析了基础设施即服务(IaaS)和平台即服务(PaaS)数据中心的收入,作为年度存储数据服…

C++初学者指南-4.诊断---valgrind

C初学者指南-4.诊断—Valgrind Valgrind(内存错误检测工具) 检测常见运行时错误 读/写释放的内存或不正确的堆栈区域使用未初始化的值不正确的内存释放,如双重释放滥用内存分配函数内存泄漏–非故意的内存消耗通常与程序逻辑缺陷有关&#xf…

Halcon 背景网格产品刮伤缺陷检测

* 关闭窗口 dev_close_window ()*关闭程序计数器,图形变量更新,窗口图形更新 dev_update_off ()*设置图像路径 Path : lcd/mura_defects_blur_*读取一张图像 read_image (Image, Path 01)*获取图像大小 get_image_size (Image, Width, Height)*创建一个新窗体 dev_open_window…

Apache Seata应用侧启动过程剖析——注册中心与配置中心模块

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata应用侧启动过程剖析——注册中心与配置中心模块 前言 在Seata的应用侧&#xf…

SpringBoot Elasticsearch painless 查询某个属性是否存在的复杂判断for循环判断,深入理解Painless脚本查询

在使用Spring Boot与Elasticsearch结合进行搜索应用开发时,我们经常会遇到需要对文档中的数组或列表类型字段进行复杂查询的情况。Elasticsearch的Painless脚本语言提供了一种强大的方式来执行这类查询,允许开发者在查询时执行自定义的逻辑判断。 深入理…

强化训练:day13(牛牛冲钻五、最长无重复子数组、重排字符串)

文章目录 前言1. 牛牛冲钻五1.1 题目描述1.2 解题思路1.3 代码实现 2. 最长无重复子数组2.1 题目描述2.2 解题思路2.3 代码实现 3. 重排字符串3.1 题目描述3.2 解题思路3.3 代码实现 总结 前言 1. 牛牛冲钻五   2. 最长无重复子数组   3. 重排字符串 1. 牛牛冲钻五 1.1 题…

【Scrapy】深入了解 Scrapy 中间件中的 process_spider_output 方法

准我快乐地重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 再去做没流着情泪的伊人 假装再有从前演过的戏份 重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 你纵是未明白仍夜深一人 穿起你那无言毛衣当跟你接近 🎵 陈慧娴《傻女》 Scrapy 是…

使用Python连接本地MySQL数据库并创建表

一、使用Python连接本地MySQL数据库并创建表 端口号:3307 用户名:root 密码:lms123456 数据库:test_01 from orm import *# 数据库连接对象 db MySQLDatabase(host"localhost",port3307,user"root",pas…

CUDA Install--Configure

CUDA环境正确设置 要确保你的系统环境变量正确设置,以包含CUDA 12.2的路径,可以按照以下步骤操作 步骤1:编辑.bashrc文件 打开并编辑你的.bashrc文件,以确保环境变量正确设置。 nano ~/.bashrc 在文件末尾添加以下内容&#xff…

LeetCode 35, 242, 994

目录 35. 搜索插入位置题目链接标签思路代码 242. 有效的字母异位词题目链接标签思路代码 994. 腐烂的橘子题目链接标签思路代码 35. 搜索插入位置 题目链接 35. 搜索插入位置 标签 数组 二分查找 思路 本题与 704. 二分查找 十分相似,只不过本题在找不到 tar…

llama2阅读: logits是什么?

Logits是一个在深度学习中,几乎一直都有的概念,它意味着模型unnormalized final scores. 然后你可以通过softmax得到模型针对你class的概率分布。 而在llama2的代码中,同样有logits的使用,那么针对llama2,logits的作用…

centos7.9安装redis

安装redis mkdir redis sudo yum install epel-release -y sudo yum update -y sudo yum install redis -y sudo systemctl start redis sudo systemctl enable redis redis-cli ping sudo yum install gcc make -y wget http://download.redis.io/releases/redis-6.0.9.tar.…

CF构造题

1900-2100 1.Arithmancy (Easy) 注意题目要求唯一对应,也就是不能存在两种选择使得这两种选择的"power"都是一样的 Ans && Conclusion

零知识证明;电路,编码,多项式是什么;零知识验证流程

目录 零知识证明怎么应用到神经网络模型不变的验证中 应用背景 应用过程 举例说明 技术挑战与解决方案 实际应用案例 零知识中,电路,编码,多项式是什么 电路(Circuit) 编码(Coding) 多项式(Polynomial) 零知识中涉及的概念 零知识验证流程 零知识证明怎么…