Java中接口的默认方法

news/2024/5/18 20:34:47

为什么要使用默认方法

当我们把一个程序的接口写完后 用其他的类去实现,此时如果程序需要再添加一个抽象方法的时候我们只有两种选择

  1. 将抽象方法写在原本的接口中 但是这样写会导致其他所有改接口的实现类都需要实现这个抽象方法比较麻烦

  2. 写另一个接口 让需要的实现类再继承这个接口 但是如果频繁的变动不利于代码的可维护性

package day8;
​
public interface FatherInterface {void say1();void say2();public default void say3(){System.out.println("say3");}
}
​

package day8;
​
public class ImplementInterface implements FatherInterface{@Overridepublic void say1() {System.out.println("ImplementInterface say1");}
​@Overridepublic void say2() {System.out.println("ImplementInterface say2");}
​@Overridepublic void say3() {System.out.println("ImplementInterface say3");}
}
​
package day8;
​
public class Test {public static void main(String[] args) {FatherInterface im=new ImplementInterface();im.say1();im.say2();im.say3();}
}
​

其中public default void say3(){ System.out.println("say3"); }是接口的默认方法 实现类可以不实现 也可以实现

使用接口中的默认方法可以实现接口的升级

注意: 默认方法不是抽象方法,,所以不强制被重写,但是可以重写 默认方法中的public可以省略 但是default不可以省略

接口中静态方法和默认方法使用

package day8;
​
public interface FatherInterface {void say1();default void say2(){System.out.println("调用了默认方法");}static void say3(){System.out.println("调用了静态方法");}
}
​
package day8;
​
public class ImplementInterface implements FatherInterface{@Overridepublic void say1() {System.out.println("实现类抽象方法");}
​
}
​
package day8;
​
public class Test {public static void main(String[] args) {FatherInterface im=new ImplementInterface();im.say1();im.say2();FatherInterface.say3();}
}
​

接口中的静态方法只能通过接口调用 实现类也不能调用

因为当实现类实现多个接口的时候 而这些接口中刚好有重名的静态方法时,程序不知道调用哪一个

注意 默认方法可以调用私有的静态方法和非静态方法 静态方法只能调用私有的静态方法


http://www.mrgr.cn/p/76610825

相关文章

MVP+敏捷开发

MVP敏捷开发 1. 什么是敏捷开发? 敏捷开发是一种软件开发方法论,旨在通过迭代、自组织的团队和持续反馈,快速响应需求变化并交付高质量的软件。相较于传统的瀑布模型,敏捷开发强调灵活性、适应性和与客户的紧密合作。敏捷开发方…

13.1 QQ邮箱

1. 邮箱发送 2. 准备工作 3. 整合SpringBoot 3.1 配置 依赖引入 <!-- 邮件服务--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>application.…

部署YUM仓库及NFS共享服务

目录1.YUM仓库服务(1)部署YUM软件仓库(1)准备安装源(2)构建CentOs7软件仓库(3)在软件仓库中加入非官方RPM包组(3)如何搭建本地源仓库、ftp源仓库?2.NFS共享存储服务(1)使用NFS发布共享资源 1.YUM仓库服务 (1)部署YUM软件仓库 YUM 基于RPM包构建的软件更新机制 可…

GLASGOW SMILE: 1.1

靶机描述 靶机地址:https://download.vulnhub.com/glasgowsmile/GlasgowSmile-v1.1.zipDescription Title: Glasgow SmileUsers: 5 Difficulty Level: Initial Shell (Easy) - Privileges Escalation (Intermediate) Hint: Enumeration is the key.If you are a newbie in Pen…

Linux网络-Yum仓库

Yum仓库 1.yum概述 Yum (Yellow dog Updater, Modified) 是一个基于rpm包构建的软件更新机制,能够自动解决软件包之间的依赖关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。节省了日常工作中的大量查找安装依赖包的时间。 2.yum工作原理 yum依赖于环境,…

[NeurIPS-23] GOHA: Generalizable One-shot 3D Neural Head Avatar

[pdf | proj | code] 本文提出一种基于单图的可驱动虚拟人像重建框架。基于3DMM给粗重建、驱动结果&#xff0c;基于神经辐射场给细粒度平滑结果。 方法 给定源图片I_s和目标图片I_t&#xff0c;希望生成图片I_o具有源图片ID和目标图片表情位姿。本文提出三个分支&#xff1a;…

DarkHole: 2

靶机描述 靶机地址:https://download.vulnhub.com/darkhole/darkhole_2.zipDescription Difficulty:Hard This works better with VMware rather than VirtualBox Hint: Dont waste your time For Brute-Force信息收集 主机发现 利用arp-scan -l命令扫描靶机IP arp-scan -l开放…

Hackable: III

靶机描述 靶机地址:https://download.vulnhub.com/hackable/hackable3.ovaDescription Focus on general concepts about CTF Difficulty: Medium This works better with VirtualBox rather than VMware.信息收集 nmap探测详细端口信息 nmap -sS -sV -A -p- 192.168.56.106探…

Hackable: II

靶机描述 靶机地址:https://download.vulnhub.com/hackable/hackableII.ovaDescription Difficulty: easy This works better with VirtualBox rather than VMware信息收集 端口扫描 通过nmap扫描目标主机发现开放了3个端口 nmap -A -p 1-65535 192.168.56.101FTP发现Web发现 …

开源博客项目Blog .NET Core源码学习(20:App.Hosting项目结构分析-8)

本文学习并分析App.Hosting项目中后台管理页面的个人资料页面、修改密码页面。 个人资料页面 个人资料页面用于显示和编辑个人信息&#xff0c;支持从本地上传个人头像。整个页面使用了layui中的表单、日期与时间选择、上传等样式或模块&#xff0c;通过layui.css文件设置样式…

CORROSION: 1

靶机描述 靶机地址:https://www.vulnhub.com/entry/corrosion-1,730/Description Difficulty: Easy A easy box for beginners, but not too easy. Good Luck. Hint: Enumerate Property.信息收集 利用arp-scan -l命令扫描靶机IP arp-scan -l端口扫描 nmap -sS -p 1-65535 -sV…

React Router、And、Redux动态菜单和动态路由

前言 动态菜单和动态路由的逻辑在登录完成之后,用useEffect监听dispatch把菜单和路由的数据初始化,渲染菜单,redux将路由的静态资源修改。数据结构后端数据符合前端需要的数据结构即可,mock后端接口返回数据 import Mock from mockjs;Mock.mock(/api, get, {code: 200,data…

微服务之SpringCloud AlibabaSeata处理分布式事务

一、概述 1.1背景 一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用&#xff0c;就会产生分布式事务问题 but 关系型数据库提供的能力是基于单机事务的&#xff0c;一旦遇到分布式事务场景&#xff0c;就需要通过更多其他技术手段来解决问题。 全局事务&#xff1a;…

WPF 高仿360功能界面

WPF 高仿360功能界面,如图:XAML TabControl 控件<TabControl Style="{StaticResource TabControlStyle}"><TabItem Header="资源共享" Style="{StaticResource TabItemStyle}"><TabItem.Background><ImageBrush ImageSou…

Django后台项目开发实战五

完成两个功能&#xff1a; HR 可以维护候选人信息面试官可以录入面试反馈 第五阶段 创建 interview 应用&#xff0c;实现候选人面试评估表的增删改功能&#xff0c;并且按照页面分组来展示不同的内容&#xff0c;如候选人基础信息&#xff0c;一面&#xff0c;二面的面试结…

软件设计师:操作系统知识

操作系统层次进程管理 顺序执行真题标记并发执行

软考备考

p5,https://www.bilibili.com/video/BV1Qc411G7fB?p=6&vd_source=1a563cd2b3f3fdeb2a16cbbf18022d2f第一章 计算机组成原理与体系结构基础知识(6) 信息化世界是由计算机/手机通过计算机网络与其他的计算机/手机连接的,其中,计算机/手机由三部分组成,从底层到上层分别…

Mybatis-Plus扩展接口InnerInterceptor

InnerInterceptor 接口就是 MyBatis-Plus 提供的一个拦截器接口&#xff0c;用于实现一些常用的 SQL 处理逻辑&#xff0c;处理 MyBatis-Plus 的特定功能,例如PaginationInnerInterceptor、OptimisticLockerInnerInterceptor 等,都实现了 InnerInterceptor 接口&#xff0c;并添…

【Python基础】进程

文章目录 [toc]程序与进程的区别与联系同步任务示例 并行任务示例进程调度的“随机性” 进程属性与方法process_object.start()方法process_object.join()方法process_object.daemon属性没有设置守护进程的情况设置守护进程的情况 process_object.current_process()方法 进程通…

力扣例题(接雨水)

链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 思路&#xff1a; 判断一块地方是否可以接到雨水&#xff0c;只需要判断他是否有左右边界使他可以接到水 左右边界分别为此处左侧的最高点和右侧的最高点 同时此处可接雨水的高度为左右两…