接口和抽象类的区别?解析接口和抽象类的特点和用法
接口和抽象类的区别?解析接口和抽象类的特点和用法
引言
在面向对象编程中,接口和抽象类是两个非常重要的概念。它们都可以用于定义一组相关的方法,但在实际使用中有一些差异。本文将探讨接口和抽象类的区别,并通过示例代码和测试代码加强对这些概念的理解。
摘选自我的个人博客:https://refblogs.com/article/397
接口的定义和特点
接口是一种用于声明一组方法的类型,它只定义了方法的签名而没有具体的实现。接口的定义使用interface
关键字,如下所示:
public interface MyInterface {void method1();void method2();
}
接口中的方法默认都是抽象方法,不需要使用abstract
关键字进行修饰。接口还可以包含常量字段,这些字段默认都是public static final
类型的。接口可以被其他类实现,并通过实现接口的方式来声明自己具备接口中定义的方法。接口的特点如下:
- 接口只能包含抽象方法和常量字段,不能定义具体的方法实现。
- 一个类可以实现多个接口,从而具备多个接口中定义的方法。
- 接口之间可以有继承关系,一个接口可以继承自另一个接口。
- 接口不能被实例化,只能被其他类实现。
- 接口中的方法默认是
public
访问权限的,实现类必须将这些方法定义为public
。
示例代码:接口的使用
下面通过一个示例代码来演示接口的使用:
public interface Animal {void eat();void sleep();
}public class Dog implements Animal {public void eat() {System.out.println("Dog is eating.");}public void sleep() {System.out.println("Dog is sleeping.");}
}
在上面的示例中,我们定义了一个Animal
接口,它包含了eat()
和sleep()
两个方法。然后我们创建了一个Dog
类,并通过implements
关键字实现了Animal
接口。Dog
类必须提供对应接口中定义的方法的具体实现。在Dog
类的eat()
和sleep()
方法中,我们分别输出了"Dog is eating."和"Dog is sleeping."的信息。
抽象类的定义和特点
抽象类是一种不能被实例化的类,它可以包含抽象方法和具体方法的定义。抽象类的定义使用abstract
关键字,如下所示:
public abstract class MyAbstractClass {public abstract void method1();public void method2() {System.out.println("This is method2 in abstract class.");}
}
抽象类中的抽象方法没有具体的实现,子类必须提供对应抽象方法的实现。抽象类中的具体方法可以有默认的实现,子类可以选择重写这些方法。抽象类的特点如下:
- 抽象类可以包含抽象方法和具体方法,抽象方法没有具体的实现。
- 一个类只能继承一个抽象类,但可以实现多个接口。
- 抽象类不能被实例化,只能用于派生子类。
- 抽象类中的抽象方法必须在子类中被实现,具体方法可以选择是否重写。
示例代码:抽象类的使用
下面通过一个示例代码来演示抽象类的使用:
public abstract class Shape {public abstract double getArea();public void printArea() {System.out.println("Area: " + getArea());}
}public class Circle extends Shape {private double radius;public Circle(double radius) {this.radius = radius;}public double getArea() {return Math.PI * Math.pow(radius, 2);}
}
在上面的示例中,我们定义了一个抽象类Shape
,它包含了一个抽象方法getArea()
和一个具体方法printArea()
。然后我们创建了一个Circle
类并继承了Shape
类。Circle
类必须提供对应抽象方法getArea()
的具体实现。在Circle
类的getArea()
方法中,我们计算并返回了圆的面积。在Shape
类的printArea()
方法中,我们调用了getArea()
方法并输出了面积的信息。
接口和抽象类的区别?解析接口和抽象类的特点和用法
接口和抽象类都可以用于定义一组相关的方法,但它们在实际使用中有一些差异。下面是接口和抽象类的主要区别:
- 实现方式不同:接口使用
implements
关键字进行实现,抽象类使用extends
关键字进行继承。 - 方法实现方式不同:接口中的方法都是抽象方法,没有具体的实现;抽象类中的方法可以是抽象方法或具体方法。
- 单继承和多实现:一个类只能继承一个抽象类,但可以实现多个接口。
- 对象的含义不同:接口表示一种行为或能力,用于定义方法的契约;抽象类表示一种类的关系或继承关系,用于定义类的共性。
- 可见性不同:接口中的方法默认是
public
的,实现类必须将这些方法定义为public
;抽象类中的方法可以有不同的可见性,子类可以继承或重写这些方法。
总结
接口和抽象类在面向对象编程中扮演着重要的角色,它们都可以用于定义一组相关的方法。接口主要用于规范行为和能力,抽象类主要用于表示类的关系和继承关系。接口和抽象类之间的区别主要体现在实现方式、方法实现方式、继承与实现方式、对象的含义和可见性等方面。
通过本文的介绍,相信读者对接口和抽象类的区别有了更清晰的了解。在实际开发中,根据具体的需求和设计目标选择合适的接口或抽象类,可以提高代码的可扩展性和重用性,从而提高开发效率。
相关文章:
接口和抽象类的区别?解析接口和抽象类的特点和用法
接口和抽象类的区别?解析接口和抽象类的特点和用法 引言 在面向对象编程中,接口和抽象类是两个非常重要的概念。它们都可以用于定义一组相关的方法,但在实际使用中有一些差异。本文将探讨接口和抽象类的区别,并通过示例代码和测…...
vscode-vue项目格式化
一、插件要求 Prettier Vetur 二、配置文件 {"workbench.startupEditor": "newUntitledFile","files.autoSave": "off", // 关闭文件自动保存,避免开发时候页面变化"editor.tabSize": 2, // tab距离"ve…...

SAP MM学习笔记26- SAP中 振替转记(转移过账)和 在库转送(库存转储)1- 移动Type间振替转记
SAP 中在库移动 不仅有入库(GR),出库(GI),也可以是单纯内部的转记或转送。 1,振替转记(转移过账) 2,在库转送(库存转储) 1ÿ…...

SAP SPL(Special Ledger)之注释行项目-Noted Items
财务凭证过账里常见的SPL特殊总账标识根据业务主要有三种,BoE-billing of exchange: 汇票业务,包括商业汇票和银行汇票;Down Payment,预付款业务,包括供应商和客户预付款和申请;其它,一般是保证…...

学习平台助力职场发展与提升
近年来,随着互联网技术的发展,学习平台逐渐成为了职场发展和提升的必备工具。学习平台通过提供丰富的课程内容、灵活的学习时间和个性化的学习路径,帮助职场人士更好地提升自己的技能和知识储备,为职场发展打下坚实的基础。 学习…...

有没有免费格式转换工具推荐?PDF转化为PPT的方法
在当今职场生活中,掌握文件格式转换技能变得异常重要。将PDF文档转换为PPT格式可以在演讲、报告等场合更好地展示和传达信息,为我们的专业形象增添亮点,接下来我们可以一起来看一下“有没有免费格式转换工具推荐?PDF转化为PPT的方法”相关的…...
【LeetCode-经典面试150题-day12】
20.有效的括号 题意: 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括…...
TCP机制-延迟应答,捎带应答
在看本篇博客前推荐先看TCP中窗口和滑动窗口的含义以及流量控制 延迟应答和捎带应答都是TCP用于提高网络传输效率的机制 延迟应答 当发送端发送数据给接收端了以后,按道理接收端的内核会立即返回ACK(应答报文)给发送端,而且ACK&a…...

【Redis从头学-8】Redis中的ZSet数据类型实战场景之用户积分榜
🧑💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:Re…...
Springboot内嵌SQLite配置使用
版本号 MacOS Apple M1 | Jdk17 | Maven 3.8.5 | SpringBoot 2.6.9 | SQLite 3.42.0.0 pom.xml <dependencies><dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.42.0.0</version&g…...

【微服务学习笔记】认识微服务
【微服务学习笔记】认识微服务 单体架构 分布式架构 微服务架构 SpringCloud 服务拆分和注意事项 服务拆分的案例demo 各个服务之间的数据库都是相互独立的,你不能直接访问对方的数据库,只能从一个服务像另外一个服务发起远程调用 在订单模块的服务中 …...
基于Android R快速编译recovery-ramdisk.img
Android默认没有单编recovery-ramdisk.img的命令,我们可以自己修改Makefile实现 修改:build/core/Makefile 添加: .PHONY: recovery-ramdisk-nodeps recovery-ramdisk-nodeps: $(MKBOOTFS) | $(COMPRESSION_COMMAND_DEPS)echo "make …...

Redis分布式缓存
分布式缓存 -- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题: 1.Redis持久化 Redis有两种持久化方案: RDB持久化 AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件)&#x…...
最大公约数和最小公倍数
最大公约数: 概念: 公约数中最大的称为最大公约数。 对任意的若干个正整数,1总是它们的公因数。 公约数与公倍数相反,就是既是A的约数同时也是B的约数的数,12和15的公约数有1,3,最大公约数就是…...

数据结构——二叉搜索树(附带C++实现版本)
文章目录 二叉搜索树概念 二叉树的实际应用二叉树模拟实现存储结构二叉搜索树构成二叉搜索树的查找插入操作中序遍历二叉树的删除循环(利用左子树最右节点)递归(利用右子树根节点) 二叉树拷贝二叉树资源的销毁 二叉树实现完整代码总结 二叉搜索树 概念 二叉搜索树…...
C++(3)C++对C的扩展Extension
类型增强 1、类型更加严格 不初始化,无法通过编译;C不初始化,则随机赋值 #include <iostream> #include <stdlib.h>int main() {const int a 100; //真正的const,无法修改 // int *p &a; 报错const int *p…...
在vscode(idea)使用GitHub账号、Copilot异常
在idea使用GitHub账号、Copilot异常 登录GitHub显示 Invalid authentication data.Connection refused: connect或者副驾驶显示 Failed to initiate the GitHub login process. Please try again.一般网上的方法推荐使用token登录,或者降级副驾驶 经过研究&#x…...

新的后端渲染:服务器驱动UI
通过API发送UI是一种彻底的新方法,将改变传统的UI开发。 一项正在改变我们对用户界面 (UI) 的看法的技术是通过 API 发送 UI,也称为服务器驱动UI。这种方法提供了新水平的活力和灵活性,正在改变 UI 开发的传统范例。 服务器驱动 UI 不仅仅是…...

Postman如何做接口自动化测试?
前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试,模拟人去操作软件界面,把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码,属于一种软件开发工作,已经开发完…...

excel文本函数篇2
本期主要介绍LEN、FIND、SEARCH以及后面加B的情况: (1)后缀没有B:一个字节代表一个中文字符 (2)后缀有B:两个字节代表一个中文字符 1、LEN(text):返回文本字符串中的字符个数 2、…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...