当前位置: 首页 > news >正文

抽象类实现接口的意义

文章目录

  • 前言
  • 一、抽象类和接口对比
  • 二、举例说明三种情况
    • 1.接口实现类
      • 接口
    • 2.抽象类实现类
      • 抽象类
      • 实现类(子类)
    • 3.抽象类实现接口
      • 接口
      • 抽象类
      • 三个实现类
  • 总结


前言

抽象类和接口其实都是抽象的一种,那么他俩有何异同呢?
抽象类实现接口的意义何在?


一、抽象类和接口对比

  1. 接口大家比较熟悉,它其实是一种规范,规定了方法的入参,反参等,一种抽象, 关键字是 interface;
  2. 抽象类是用 abstract 修饰的类,可以包含抽象方法,也可以不包含抽象方法,可以有普通方法
  3. 一般来说接口中的方法都是抽象的,无方法体的,但是java8之后,增加了default (大家课后了解下),它让接口也可以有方法体了,那么其实这里的default 就增强了接口的功能,不逊于抽象类了;
  4. 接口是用来实现的,而且实现一个接口的时候,子类必须实现接口中的所有方法
  5. 抽象类是用来被继承的,抽象类中的抽象方法可以在子类中选择性实现,这就是抽象类的灵活性
  6. 那么当我用抽象类实现接口,我可以选择某些方法我在抽象类中实现,某些方法我不实现,而是继续在抽象类的子类中实现,那么这个方法我虽然实现了,但是还是一个抽象方法(你以为我实现了,然后并没有)

没有代码,仅讲解的的博主相当于耍流氓,接下来进入代码环节

二、举例说明三种情况

1.接口实现类

使用场景: 我又两种支付方式,微信/支付宝, 为了统一对外逻辑,我弄成一个接口对外暴露,方便统一调用

接口

public interface PayService {/*** 获取支付具体实现** @return*/String getType();/*** 具体支付方法** @param order* @param money* @return*/String toPay(String order, Integer money);
}### 实现类
```java 
@Service
public class AliPayServiceImpl implements PayService {/*** 获取支付具体实现** @return*/@Overridepublic String getType() {return "Ali";}/*** 具体支付方法** @param order* @param money* @return*/@Overridepublic String toPay(String order, Integer money) {System.out.println("阿里支付用支付宝,优惠一元");return "Ali支付 订单号: " + order + " 金额: " + (money - 1);}
}// =======================================================@Service
public class WxPayServiceImpl implements PayService {/*** 获取支付具体实现** @return*/@Overridepublic String getType() {return "Wx";}/*** 具体支付方法** @param order* @param money* @return*/@Overridepublic String toPay(String order, Integer money) {System.out.println("微信支付,原价支付");return "Wx支付 订单号: " + order + " 金额: " + money;}
}

2.抽象类实现类

使用场景: 依然是第一个支付场景,我这里简单改造下;抽象类还能有普通方法,这里我增加一个支付打印

抽象类

public abstract class PayService {/*** 获取支付具体实现** @return*/abstract String getType();/*** 具体支付方法** @param order* @param money* @return*/abstract String toPay(String order, Integer money);/*** 支付成功打印*/public void sout(){System.out.println("我支付成功了");}
}

实现类(子类)

@Service
public class AliPayServiceImpl extends PayService {/*** 获取支付具体实现** @return*/@Overridepublic String getType() {return "Ali";}/*** 具体支付方法** @param order* @param money* @return*/@Overridepublic String toPay(String order, Integer money) {System.out.println("阿里支付用支付宝,优惠一元");return "Ali支付 订单号: " + order + " 金额: " + (money - 1);}
}// =========================================================
@Service
public class WxPayServiceImpl extends PayService {/*** 获取支付具体实现** @return*/@Overridepublic String getType() {return "Wx";}/*** 具体支付方法** @param order* @param money* @return*/@Overridepublic String toPay(String order, Integer money) {System.out.println("微信支付,原价支付");return "Wx支付 订单号: " + order + " 金额: " + money;}
}

这里看完是不是觉得抽象比接口强大,那为什么还要接口呢?

  • 接口可以解决多重继承问题,提供更灵活的扩展和维护
  • Java中的抽象类和接口各有其应用场景,抽象类和接口都可以定义规范,但实现规范的方式不同。抽象类是具体实现的规范,而接口是行为的规范。
  • 抽象类可以解决单继承局限,避免多继承带来的复杂性和低效性

3.抽象类实现接口

使用场景: 仍然是支付场景,接口中定义了四个方法 (abcd),有三个实现类 A B C ;
其中A 需要实现 ab d, B需要实现 bc d, C需要实现ca d
也就是A B C 三个实现类不需要实现接口中的所有方法,但是都需要实现d方法,而且是一个逻辑
这里d方法在每个子类中都实现一遍没必要,重复代码,咋办呢? 我们在接口和实现类之间加一个 抽象类

接口

public interface PayService {/*** 获取支付具体实现** @return*/String getType();/*** 具体支付方法** @param order* @param money* @return*/String toPay(String order, Integer money);/*** 扣减库存* @param num 购买数量* @return*/int decreaseStash(int num);/*** 打印成支付*/void sout();}

抽象类

public abstract class PayAbstract implements PayService{/*** 获取支付具体实现** @return*/@Overridepublic String getType() {return null;}/*** 具体支付方法** @param order* @param money* @return*/@Overridepublic String toPay(String order, Integer money) {return null;}/*** 扣减库存** @param num 购买数量* @return*/@Overridepublic int decreaseStash(int num) {return 0;}/*** 打印成支付*/@Overridepublic void sout() {System.out.println("支付成功");}
}

三个实现类

@Service
public class AliPayServiceImpl extends PayAbstract {/*** 获取支付具体实现** @return*/@Overridepublic String getType() {return "Ali";}/*** 具体支付方法** @param order* @param money* @return*/@Overridepublic String toPay(String order, Integer money) {System.out.println("阿里支付用支付宝,优惠一元");return "Ali支付 订单号: " + order + " 金额: " + (money - 1);}
}// ============================================================
@Service
public class WxPayServiceImpl extends PayAbstract {/*** 具体支付方法** @param order* @param money* @return*/@Overridepublic String toPay(String order, Integer money) {System.out.println("微信支付,原价支付");return "Wx支付 订单号: " + order + " 金额: " + money;}/*** 扣减库存** @param num 购买数量* @return*/@Overridepublic int decreaseStash(int num) {return num;}
}// ============================================================@Service
public class JUHEPayServiceImpl extends PayAbstract {/*** 获取支付具体实现** @return*/@Overridepublic String getType() {return "JUHE";}/*** 扣减库存** @param num 购买数量* @return*/@Overridepublic int decreaseStash(int num) {return num;}
}

这样在接口和抽象类之间又做了一层抽象,抽象层提取了公共的方法d (sout),而且让每个实现类都更加灵活的实现方法


总结

抽象类实现接口的意义在于提供了一种灵活且层次分明的代码结构,有助于实现模块化和可维护性。

具体来说,抽象类可以作为继承层次结构中的基础类,提供一些公共方法和属性,子类可以继承和扩展。而接口则定义了一组相关的方法规范,约束了实现这些方法的类或抽象类的行为。这有助于确保代码的模块化,提高代码的可重用性和可维护性。

抽象类相当于在原有抽象的基础上,再次抽象,提取了一些公共方法;

相关文章:

抽象类实现接口的意义

文章目录 前言一、抽象类和接口对比二、举例说明三种情况1.接口实现类接口 2.抽象类实现类抽象类实现类(子类) 3.抽象类实现接口接口抽象类三个实现类 总结 前言 抽象类和接口其实都是抽象的一种,那么他俩有何异同呢? 抽象类实现接口的意义何在? 一、抽象类和接口对比 接口…...

什么是接口测试,如何做接口测试?

比起点点点的功能测试,“接口测试”显得专业又高大上,也因此让有些初级测试人员“望而生畏”。别担心,其实接口测试也是功能测试的一种,它是针对接口进行的功能测试。 写在前面:本文参考了茹炳晟老师的《测试工程师 全…...

Keil 编译 Debug

# 头文件无法导入进来 # 导入头文件,只有函数声明,但缺少函数实现 已经导入了air32f10x_gpio.h但是没有导入 .c,就导致 编译出错出现undefined symbol (某个函数),这时候按照下面的操作,导入外设模块就好。...

【通用消息通知服务】0x3 - 发送我们第一条消息(Websocket)

【通用消息通知服务】0x3 - 发送我们第一条消息 项目地址: A generic message notification system[Github] 实现接收/发送Websocket消息 Websocket Connection Pool import asyncio from asyncio.queues import Queue from asyncio.queues import QueueEmpty from contextli…...

Eclipse打jar包与JavaDOC文档的生成

补充知识点——Eclipse打jar包与JavaDOC文档的生成 1、Eclipse如何打jar包,如何运行jar包 Java当中编写的Java代码,Java类、方法、接口这些东西就是项目中相关内容,到时候我们需要把代码提供给甲方、或者是我们需要运行我们编写的代码&…...

力扣:80. 删除有序数组中的重复项 II(Python3)

题目: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下…...

linux:需要注意docker和aws的rds的mysql默认是UTC而不是中国时区

问题: 如题 解决办法: docker参考: mysql时间不对,修改时区_set global time_zone 无效_《小书生》的博客-CSDN博客 aws参考: https://www.youtube.com/watch?vB-NaqV-A1BY mysql - AWS修改RDS时区 - 个人文章 - Segm…...

访问 GitHub 方法

访问 GitHub 方法 方法一:最常见的就是 fq,但这个是违法的行为,自己私下搞可以,不能教你们。 方法二:利用加速器,这是正规合法操作。这里推荐一个免费的加速器,下载安装 Watt Toolkit加速器,原名…...

旅游APP外包开发注意事项

旅游类APP通常具有多种功能,以提供给用户更好的旅行体验。以下分享常见的旅游类APP功能以及在开发和使用这些APP时需要注意的问题,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 常见功能…...

ROS机器人编程---------(二)ROS中的核心概念

ROS机器人编程 ROS中的核心概念 ROS的通信机制 在ROS中结点是最小单元,比如说机器人的遥控器可以作为一个控制结点,机器人上的摄像头也可以看作一个结点,ROS通过协调各个结点来实现 在启动任何ROS结点之前,都必须先启动ROS Mas…...

Python学习教程:进程的调度

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 要想多个进程交替运行,操作系统必须对这些进程进行调度, 这个调度也不是随即进行的,而是需要遵循一定的法则,由此就有了进程的调度算法。 python更多源码/资料/解答/教程等 …...

ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案

ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案 本文是ElasticSearch第三讲,在了解ElaticSearch之后,我们还要了解Elastic背后的生态 即我们常说的ELK;与此同时,还会给你展示ElasticSearch的案例场景&…...

基于Java+SpringBoot+Vue前后端分离农商对接系统设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...

【模方ModelFun】实景三维建模和修模4.0.7最新版安装包以及图文安装教程

模方ModelFun 具有多种功能,旨在帮助用户进行实景三维建模和修模。以下是一些主要功能的简要介绍: 实景三维建模:【模方ModelFun】提供了自动化的实景三维重建功能,可以从实景图像中提取几何形状和纹理信息,生成高质量…...

介绍几个搜索引擎

Google:全球最大的搜索引擎,提供全面的搜索服务,包括网页、图片、视频、新闻、地图等。 Baidu:中国最大的搜索引擎,提供类似于Google的全面搜索服务,同时也有网盘、知道等功能。 Bing:微软公司…...

iPhone 隔空投送使用指南:详细教程

本文介绍了如何在iPhone上使用隔空投送,包括如何在iOS 11到iOS 14的iPhone上启用它、发送文件以及接受或拒绝AirDrop发送给你的文件。对于iOS 7以上的旧款iPhone,提供了另一种方法。 如何打开隔空投送 你可以通过以下两种方式之一启动隔空投送功能:在“设置”应用程序或控…...

百度文心一言GPT免费入口也来了!!!

文心一言入口地址:文心一言能力全面开放 文心一言是百度全新一代知识增强大语言模型,文心大模型家族的新成员,能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。 文心一言的技…...

线程调度和线程控制

在Java中,线程调度和线程控制是多线程编程中重要的概念,它们用于管理和控制线程的执行。以下是关于线程调度和线程控制的一些重要概念和技术: **1. 线程调度(Thread Scheduling): ** 线程调度是操作系统或Java虚拟机决定哪个线程在何时执行的过程。Java提供了多种线程调度…...

laravel excel导入导出

一、安装第三方 composer require maatwebsite/excel版本2.1和现在版本 有所不一样 二、导入 <?php namespace App\Import; use Maatwebsite\Excel\Concerns\ToCollection;class TestImport implements ToCollection {public function __construct(){}public function c…...

Windows无法删除分区怎么办?

我们知道Windows系统内置的磁盘管理工具是一个很实用的程序&#xff0c;可以帮助我们完成很多磁盘分区相关的基础操作&#xff0c;比如当我们想要删除硬盘上的某一个分区时&#xff0c;先想到的可能会是磁盘管理工具。但是当我们准备在磁盘管理工具中删除某个分区时&#xff0c…...

BilibiliDown终极指南:快速上手B站视频下载器

BilibiliDown终极指南&#xff1a;快速上手B站视频下载器 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibi…...

网页时光回溯器:数字记忆的守护者与探索工具

网页时光回溯器&#xff1a;数字记忆的守护者与探索工具 【免费下载链接】wayback-machine-webextension A web browser extension for Chrome, Firefox, Edge, and Safari 14. 项目地址: https://gitcode.com/gh_mirrors/wa/wayback-machine-webextension 在信息爆炸的…...

Ubuntu24.04上快速部署Odoo18开发环境的完整指南

1. 为什么选择Ubuntu24.04作为Odoo18开发环境 作为一个在ERP领域摸爬滚打多年的开发者&#xff0c;我强烈推荐使用Ubuntu24.04作为Odoo18的开发平台。这不仅仅是因为官方文档的建议&#xff0c;更是来自实际项目中的血泪教训。记得去年接手一个企业ERP项目时&#xff0c;客户坚…...

别只玩文生图了!手把手教你用Stable Diffusion 1.4的VAE模型,无损压缩和重构你的本地图片

解锁Stable Diffusion VAE的隐藏技能&#xff1a;从AI绘画到专业图像处理实战 你是否曾为海量图片的存储空间发愁&#xff1f;或是苦恼于传统图像处理工具的繁琐流程&#xff1f;今天&#xff0c;我们将颠覆你对Stable Diffusion的认知——它的VAE模型远不止是AI绘画的配角&…...

ContextMenuManager:高效管理Windows右键菜单的全方案

ContextMenuManager&#xff1a;高效管理Windows右键菜单的全方案 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager Windows右键菜单是我们日常操作电脑时最常用的…...

VectorBT:量化交易分析的高性能解决方案

VectorBT&#xff1a;量化交易分析的高性能解决方案 【免费下载链接】vectorbt Find your trading edge, using the fastest engine for backtesting, algorithmic trading, and research. 项目地址: https://gitcode.com/gh_mirrors/ve/vectorbt 在金融市场的快速变化…...

Audacity:5分钟快速掌握免费音频编辑的终极指南

Audacity&#xff1a;5分钟快速掌握免费音频编辑的终极指南 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 想要专业级的音频编辑能力却不想支付高昂的费用&#xff1f;Audacity正是你寻找的解决方案&#xff01;…...

Qwen2.5-VL-7B-Instruct保姆级:SSH远程部署+ngrok内网穿透共享演示

Qwen2.5-VL-7B-Instruct保姆级&#xff1a;SSH远程部署ngrok内网穿透共享演示 想不想在远程服务器上部署一个能“看图说话”的AI助手&#xff0c;还能随时随地通过网页访问它&#xff1f;今天&#xff0c;我就带你手把手搞定这件事。 我们将一起完成两个核心任务&#xff1a;…...

告别卡顿!Win11Debloat开源系统优化工具让Windows 11性能提升200%

告别卡顿&#xff01;Win11Debloat开源系统优化工具让Windows 11性能提升200% 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更…...

Nanbeige4.1-3B vLLM模型水印:输出内容可追溯的版权保护技术实现

Nanbeige4.1-3B vLLM模型水印&#xff1a;输出内容可追溯的版权保护技术实现 1. 引言&#xff1a;当AI生成内容遇上版权难题 你有没有想过&#xff0c;如果AI帮你写了一篇文章、一段代码或者一个创意方案&#xff0c;这份成果的“所有权”到底归谁&#xff1f;随着像Nanbeige…...