【潜意识Java】Java中深入解析抽象类与接口的差异的完整笔记总结【保姆级详细教程】
目录
一、抽象类和接口的基本概念
(一)抽象类是什么
(二)接口是什么
二、抽象类和接口的设计目的差异
(一)抽象类的设计初衷
(二)接口的设计意图
三、抽象类和接口的语法特性区别
(一)抽象类的语法特点
(二)接口的语法规则
四、抽象类和接口在代码复用与扩展方面的差异
(一)抽象类的复用与扩展方式
(二)接口的复用与扩展机制
五、抽象类和接口在实际应用场景中的选择
(一)抽象类的适用场景
(二)接口的适用场景
六、抽象类和接口的混合使用案例与优势
(一)案例展示
(二)优势分析
七、总结
欢迎来到我的博文,帮我划到文章最下面可以嘛,1s即可,麻烦你了,谢谢哈。
亲爱的家人们,在 Java 编程的学习过程中,我们经常会遇到抽象类和接口这两个重要的概念。它们看起来似乎有些相似,但实际上却有着不少关键的区别,这些区别决定了在不同的场景下我们应该如何选择使用它们来构建更加健壮、灵活和易于维护的代码。今天,我就详细地给你们讲讲抽象类和接口的那些事儿,让你们清楚地了解它们之间的差异,以后在编程时就能更加得心应手。
一、抽象类和接口的基本概念
(一)抽象类是什么
抽象类就像是一个半成品的蓝图,它定义了一些共性的属性和方法,但其中某些方法没有具体的实现,而是留给子类去完成。比如说,我们要开发一个图形绘制的程序,有圆形、矩形、三角形等不同的图形。这些图形都有一些共同的属性,比如颜色、位置,也都有一个共同的行为 —— 绘制自己。但是每个图形绘制的具体方式又不一样。这时候,我们就可以创建一个抽象的 “图形” 类,把这些共同的属性和行为定义在里面,但是具体的绘制方法留给子类去实现。
// 抽象图形类
abstract class Shape {protected String color;protected int x;protected int y;public Shape(String color, int x, int y) {this.color = color;this.x = x;this.y = y;}// 抽象方法,用于绘制图形,没有方法体,由子类实现public abstract void draw();
}
在这个例子中,Shape
类就是一个抽象类,它有颜色、位置等属性,还有一个抽象方法 draw
,这个方法没有具体的实现,因为不同的图形绘制方式不同。
(二)接口是什么
接口则更像是一种契约或者规范,它只定义了一组方法的签名,而不包含任何方法的具体实现。例如,我们有一个 “可打印” 的接口,它规定了任何实现这个接口的类都必须要有一个 “打印” 的方法,但具体怎么打印,每个实现类可以根据自己的情况去决定。
// 可打印接口
interface Printable {void print();
}
这里的 Printable
接口只声明了一个 print
方法,没有方法体,这就是接口的特点。
二、抽象类和接口的设计目的差异
(一)抽象类的设计初衷
抽象类的主要目的是为了提供一个通用的框架,将一些子类共有的属性和行为抽象出来,避免在子类中重复实现。同时,通过抽象方法,让子类能够根据自身的特点来实现特定的行为,从而实现代码的复用和扩展。在图形绘制的例子中,Shape
抽象类将颜色、位置等属性以及绘制这个行为抽象出来,子类只需要专注于实现自己独特的绘制方法,这样既减少了代码的冗余,又使得整个图形绘制系统的结构更加清晰,易于维护和扩展。
(二)接口的设计意图
接口的设计意图是为了定义一组规范或契约,使得不同的类能够遵循相同的接口来实现特定的功能,从而实现解耦和多态性。例如,在一个办公软件系统中,可能有打印机、传真机、复印机等不同的设备,它们都需要实现 “可打印” 接口,这样在系统中,当需要执行打印操作时,只需要调用 “可打印” 接口的 print
方法,而不需要关心具体是哪种设备在执行打印,只要它实现了这个接口,就能够正常工作。这种方式使得不同的类可以在遵循相同接口的前提下,各自独立地进行开发和演化,提高了系统的灵活性和可扩展性。
三、抽象类和接口的语法特性区别
(一)抽象类的语法特点
- 抽象方法:抽象类中可以包含抽象方法,抽象方法使用
abstract
关键字修饰,并且没有方法体。子类必须实现抽象父类中的抽象方法,否则子类也必须被声明为抽象类。例如,在Shape
抽象类中的draw
方法就是抽象方法。- 属性和方法实现:抽象类除了抽象方法外,还可以有属性和具体方法的实现。像
Shape
类中的颜色和位置属性,以及构造函数都是具体的实现部分。- 继承限制:一个子类只能继承一个抽象类,这体现了 Java 中单一继承的特性。
(二)接口的语法规则
- 方法签名:接口中的方法默认都是
public
和abstract
的,虽然不需要显式地声明,但实际上它们只包含方法的签名,没有方法体。例如Printable
接口中的- 常量定义:接口中可以定义常量,这些常量默认是
public static final
的,并且必须在定义时进行初始化。例如:
interface MyConstants {int MAX_VALUE = 100;
}
- 多重实现:一个类可以实现多个接口,这使得一个类能够具备多种不同的行为规范,从而更加灵活地适应不同的需求。
四、抽象类和接口在代码复用与扩展方面的差异
(一)抽象类的复用与扩展方式
抽象类通过子类继承的方式来实现代码的复用和扩展。子类继承抽象类后,可以获得抽象类中的属性和具体方法,同时需要实现抽象类中的抽象方法来完成自己独特的功能。例如,我们创建圆形和矩形子类继承自 Shape
抽象类:
// 圆形类,继承自 Shape 类
class Circle extends Shape {private int radius;public Circle(String color, int x, int y, int radius) {super(color, x, y);this.radius = radius;}// 实现父类的抽象方法 draw@Overridepublic void draw() {System.out.println("在坐标 (" + x + ", " + y + ") 绘制一个 " + color + " 的圆形,半径为 " + radius);}
}// 矩形类,继承自 Shape 类
class Rectangle extends Shape {private int width;private int height;public Rectangle(String color, int x, int y, int width, int height) {super(color, x, y);this.width = width;this.height = height;}// 实现父类的抽象方法 draw@Overridepublic void draw() {System.out.println("在坐标 (" + x + ", " + y + ") 绘制一个 " + color + " 的矩形,宽为 " + width + ",高为 " + height);}
}
在这个例子中,圆形和矩形子类复用了 Shape
抽象类中的颜色、位置属性和构造函数等代码,同时通过实现 draw
抽象方法扩展了自己的绘制功能。这种方式在具有明显的 “is-a” 关系(继承关系)的类层次结构中非常有效,能够清晰地表达类之间的共性和个性,方便代码的管理和维护。
(二)接口的复用与扩展机制
接口通过类实现接口的方式来实现代码的复用和扩展。一个类可以实现多个接口,从而获取多个接口中定义的功能规范。例如,我们有一个 “可显示” 接口和一个 “可存储” 接口:
// 可显示接口
interface Displayable {void display();
}// 可存储接口
interface Storable {void store();
}
然后我们有一个 “文档” 类,它既可以被显示,也可以被存储:
class Document implements Displayable, Storable {@Overridepublic void display() {System.out.println("显示文档内容");}@Overridepublic void store() {System.out.println("将文档存储到硬盘");}
}
通过实现多个接口,Document
类复用了不同接口定义的功能,而不需要从多个不同的父类中继承这些功能(Java 不支持多重继承)。这种方式使得类可以更加灵活地组合不同的功能,适用于那些不具有明显继承关系,但具有某些共同行为特征的类,能够提高代码的复用性和灵活性,增强系统的扩展性。
五、抽象类和接口在实际应用场景中的选择
(一)抽象类的适用场景
- 具有共性和部分实现的类层次结构:当我们有一组类,它们具有一些共同的属性和行为,并且其中一部分行为可以在抽象类中进行通用的实现,而另一部分行为则因类而异,需要子类去实现时,抽象类是一个很好的选择。例如,在图形绘制系统中,各种图形都有颜色、位置等共性属性,以及绘制这个共同行为,但绘制的具体方式不同,所以使用抽象类来抽象这些共性和部分实现是合适的。
- 需要对子类进行一定约束和规范的情况:抽象类可以通过抽象方法来约束子类必须实现某些特定的行为,从而保证子类的一致性和完整性。例如,在一个游戏角色的抽象类中,定义了抽象的 “攻击” 方法,子类必须实现这个方法,以确保每个游戏角色都具有攻击能力,这样可以使整个游戏角色系统的设计更加严谨和规范。
(二)接口的适用场景
- 定义不同类之间的共同行为规范:当我们希望不同的类能够遵循相同的行为规范,而这些类之间又没有明显的继承关系时,接口是最佳选择。比如,在一个智能家居系统中,有各种不同品牌和类型的智能设备,如智能灯泡、智能窗帘、智能音箱等,它们都可以实现一个 “智能控制” 接口,这样系统就可以通过这个接口来统一管理和控制这些设备,而不需要关心它们的具体类型和实现细节。
- 实现松耦合的系统架构:接口能够帮助我们实现系统的松耦合设计,使得各个模块之间的依赖关系更加灵活和易于维护。例如,在一个电商系统中,订单处理模块可能需要调用支付模块和物流模块的功能,通过定义支付接口和物流接口,订单处理模块只依赖于接口,而不依赖于具体的支付和物流实现类,这样当需要更换支付方式或物流合作伙伴时,只需要实现新的接口,而不需要修改订单处理模块的代码,大大提高了系统的可维护性和可扩展性。
六、抽象类和接口的混合使用案例与优势
(一)案例展示
在一个图形编辑软件中,我们可以定义一个抽象的 “图形元素” 类,它包含一些通用的属性和方法,如位置、颜色、大小等,同时定义一些抽象方法,如绘制、缩放等:
// 抽象图形元素类
abstract class GraphicElement {protected int x;protected int y;protected String color;protected int size;public GraphicElement(int x, int y, String color, int size) {this.x = x;this.y = y;this.color = color;this.size = size;}// 抽象方法,用于绘制图形元素public abstract void draw();// 抽象方法,用于缩放图形元素public abstract void scale(int factor);
}
然后,我们可以定义一些接口来扩展图形元素的功能,比如 “可旋转” 接口和 “可填充” 接口:
// 可旋转接口
interface Rotatable {void rotate(int degrees);
}// 可填充接口
interface Fillable {void fill(String pattern);
}
接着,我们创建具体的图形元素子类,如圆形类,它可以实现这些接口来增强自己的功能:
// 圆形类,继承自 GraphicElement 类并实现 Rotatable 和 Fillable 接口
class Circle extends GraphicElement implements Rotatable, Fillable {private int radius;public Circle(int x, int y, String color, int size, int radius) {super(x, y, color, size);this.radius = radius;}// 实现父类的抽象方法 draw@Overridepublic void draw() {System.out.println("在坐标 (" + x + ", " + y + ") 绘制一个 " + color + " 的圆形,半径为 " + radius + ",大小为 " + size);}// 实现父类的抽象方法 scale@Overridepublic void scale(int factor) {radius *= factor;}// 实现 Rotatable 接口的方法@Overridepublic void rotate(int degrees) {System.out.println("将圆形旋转 " + degrees + " 度");}// 实现 Fillable 接口的方法@Overridepublic void fill(String pattern) {System.out.println("用 " + pattern + " 填充圆形");}
}
在这个案例中,通过抽象类和接口的混合使用,我们既利用了抽象类来提取图形元素的共性和部分实现,又通过接口为图形元素提供了灵活的功能扩展机制,使得整个图形编辑软件的代码结构更加清晰、易于维护和扩展。
(二)优势分析
- 增强代码的复用性:抽象类中的共性代码可以被多个子类复用,而接口中的方法定义可以被多个不同的类实现,从而进一步提高了代码的复用程度,减少了代码的冗余。
- 提高系统的灵活性和扩展性:接口的存在使得类可以方便地实现不同的功能扩展,而不需要修改抽象类的层次结构。同时,通过混合使用,我们可以根据具体的需求,灵活地选择是在抽象类中添加新的抽象方法还是通过接口来定义新的行为规范,从而更好地适应系统的变化和发展。
- 清晰的代码结构和职责划分:抽象类和接口各自承担不同的职责,抽象类主要负责定义类的共性和部分实现,接口主要负责定义行为规范和功能扩展点。这种清晰的划分使得代码的结构更加易于理解和维护,开发人员可以更容易地定位和修改代码,提高了开发效率。
七、总结
亲爱的家人们,通过以上详细的介绍和案例分析,相信你们对 Java 中的抽象类和接口的区别有了一个全面而深入的了解。抽象类和接口虽然都能帮助我们实现代码的复用和扩展,但它们的设计目的、语法特性和应用场景都有所不同。在实际编程中,我们需要根据具体的需求和情况,合理地选择使用抽象类还是接口,或者将它们混合使用,以构建出更加高效、灵活、易于维护的 Java 程序。希望你们在今后的学习和实践中,能够熟练掌握这两个重要的概念,让它们成为你们编程路上的得力助手,创造出更加优秀的代码作品。
相关文章:

【潜意识Java】Java中深入解析抽象类与接口的差异的完整笔记总结【保姆级详细教程】
目录 一、抽象类和接口的基本概念 (一)抽象类是什么 (二)接口是什么 二、抽象类和接口的设计目的差异 (一)抽象类的设计初衷 (二)接口的设计意图 三、抽象类和接口的语法特性…...
【Flink运行时架构】系统构架
SMP架构 数据处理系统的架构最简单的实现方式就是单节点,但是随着数据量的增大,为了使单节点的机器性能更加强大,需要增加CPU数量和加大内存来提高吞吐量。这就是所谓的SMP(Symmetrical Multi Processing,对称多处理)架构。 但是这种架构带来…...

uni-ui样式修改
因为之前官网uni-ui有些组件的样式不好看,所以要做一些调整,做个记录。用分段器举例~ 官网原生样式 调整后的 首先找到我们的static文件夹,里面一般存着项目的全局样式文件,没有的话自己创一个 uniui.scss /deep/ .segmented-con…...

【linux板卡】lubancat通过vnc远程访问桌面
鲁班猫开发板通过远程VNC连接桌面: 硬件:lubancat2,网线 软件:ssh软件,vnc viewer 参考链接:https://training.eeworld.com.cn/video/38821 1、ssh连接lubancat2 ,输入ifconfig查看ip 2、输入 …...

SQLiteDataBase数据库
XML界面设计 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_paren…...
STM32 高级 物联网通讯之蓝牙通讯
目录 蓝牙基础知识 蓝牙概述 蓝牙产生背景 蓝牙发展历程 蓝牙技术类型 经典蓝牙(BR/EDR和AMP) 低功耗蓝牙(BLE) 市场上常见蓝牙架构 SOC蓝牙单芯片方案 SOC蓝牙+MCU方案 蓝牙host+controller分开方案 蓝牙协议栈 蓝牙芯片架构 BLE低功耗蓝牙协议栈框架 物理…...

react中实现拖拽排序
效果图:如下 效果说明: 1. 点击“选择”按钮,打开弹窗 2. 左侧数据是调接口回显来的 3. 点击左侧某条数据,这条被点击的数据就会被添加到右侧 4. 右侧的数据可以上下拖动换位置 5. 右侧有数据时,点击"确定"…...
【华为OD-E卷-AI处理器组合100分(python、java、c++、js、c)】
【华为OD-E卷-AI处理器组合100分(python、java、c、js、c)】 题目 某公司研发了一款高性能AI处理器。每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。 编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另…...

语音识别基础算法——动态时间规整算法
前言 动态时间规整算法,Dynamic Time Wraping,缩写为DTW,是语音识别领域的一个基础算法。 算法的提出 DTW 的提出是为了解决或尽量解决在语音识别当中的孤立词识别不正确的问题。该问题简单描述为:在识别阶段,将输入…...

模型工作流:自动化的模型内部三角面剔除
1. 关于自动减面 1.1 自动减面的重要性及现状 三维模型是游戏、三维家居设计、数字孪生、VR/AR等几乎所有三维软件的核心资产,模型的质量和性能从根本上决定了三维软件的画面效果和渲染性能。其中,模型减面工作是同时关乎质量和性能这两个要素的重要工…...
解读一个新建的 Spring Boot 项目
解读一个新建的 Spring Boot 项目。 1. 创建 Spring Boot 2.5.6 项目 步骤 1: 使用 Spring Initializr 创建项目 可以使用 Spring Initializr(https://start.spring.io/)来快速生成一个 Spring Boot 项目。 在 Spring Initializr 中选择以下配置&…...

Vue多页面路由与模版解析
上篇文章中我们成功打包并输出了多页文件,而构建一个多页应用能够让我们进一步了解项目配置的可拓展性,可以对学习 Vue 和 webpack 起到强化训练的效果,本文将在此基础上主要针对多页路由及模板的配置进行系列的介绍。 本案例代码地址&#…...

Python爬虫(二)- Requests 高级使用教程
文章目录 前言一、Session 对象1. 简介2. 跨请求保持 Cookie3. 设置缺省数据4. 方法级别参数不被跨请求保持5. 会话作为上下文管理器6. 移除字典参数中的值 二、请求与响应1. 请求与响应对象1.1 获取响应头信息1.2 获取发送到服务器的请求头信息 三、SSL 证书验证1. 忽略 SSL 证…...

并联带阻滤波器带通滤波器对幅值和相位的影响(IIR)
一、背景 输入信号input分别经过bp(带通滤波器)和bs(带阻滤波器)处理后相加输出。分析输出信号的幅值和相位受到的影响。 根据上图公式推导可知,并联滤波器对输出的影响可以直接分析,带通滤波器与带阻滤波器在频域上的加和。 二、…...

攻防世界web新手第五题supersqli
这是题目,题目看起来像是sql注入的题,先试一下最常规的,输入1,回显正常 输入1‘,显示错误 尝试加上注释符号#或者–或者%23(注释掉后面语句,使1后面的单引号与前面的单引号成功匹配就不会报错…...

vue3学习笔记(10)-$subscribe,store组合式写法
1.$subscribe订阅,监视vuex中数据得修改 2.localStorage里面穿的都是字符串,关掉浏览器数据还在 只能获取字符串,用ts语法写明,作为字符串使用 3.组合式写法...

操作系统论文导读(八):Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个
Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个关键性规范的零星任务的可调度性分析 目录 一、论文核心思想 二、基本定义 2.1 关键性指标 2.2 任务及相关参数定义 2.3 几个基础定义 三、可调度性分析 3.1 调度算法分…...
计算机网络与通信复习
因特网的核心部分(电路交换与分组交换的不同点,分组交换的优点) 核心部分:路由器、交换机 我们假如数据就是一个货物,比如说一千公斤的大米,电路交换要有专用通道,不管从起点到终点经过多少个…...

【Scala】图书项目系统代码演练3.1/BookService
package org.app package serviceimport models.{BookModel, BorrowRecordModel}import org.app.dao.{BookDAO, BorrowRecordDAO}import java.time.LocalDateTime import scala.collection.mutable.ListBuffer// 图书业务逻辑层 class BookService {private val bookDAO new B…...

人工智能基础软件-Jupyter Notebook
简介: Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。 Jupyter Notebook是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...