第十一章 抽象类与接口
一、抽象类和抽象方法
抽象类:使用abstract修饰的类
抽象方法:在类中没有方法体的方法,称为抽象方法,抽象方法用abstract修饰
抽象类中可以没有抽象方法,包含抽象方法的类必是抽象类
如果子类没有实现父类中的全部抽象方法,子类也必是抽象类
没有抽象构造方法,抽象类不能被实例化
抽象类中可以有非抽象构造方法,创建子类的实例时可以调用
抽象类和非抽象子类间也能存在多态性
抽象类中可以有非抽象方法
抽象类可以继承,但是包含抽象方法的抽象类,在继承的时候会报错,因为类中有抽象方法,解决报错的方法有两种,第一种将子类也定义成抽象类,另一种是重写抽象类中所有的抽象方法。
抽象类不能创建对象,但是可以创建抽象类类型的对象,由子类对象赋值
如果一个方法只有存在的意义没有实现的意义,这个方法可以定义成抽象方法,包含抽象方法的类必然是一个抽象类
抽象类存在的意义就是被继承,抽象方法存在的意义就是被重写
抽象类和抽象方法就是为多态服务的,所以抽象类和非抽象之间也存在多态性
二、abstract关键字与其它修饰符
1.abstract和修饰符static不能联用,没有抽象静态方法
2.abstract和修饰符private不能联用,abstract与权限修饰符联用时没有顺序要求,abstract类中不可以有private的额成员
3.abstract和修饰符final不能联用,abstract不能与final同时修饰同一个类
static修饰方法;final修饰;private修饰
不能 重写 重写 继承
三、接口
1.接口:
概念性接口:系统对外提供的所有服务
用关键字interface定义的接口,也称为接口类型
定义接口使用的关键字是interface,类使用class修饰
接口实际上是由常量和抽象方法构成的特殊类
2.组成
静态常量
抽象方法(只有定义,没有实现)
3.定义接口
(1)一般形式
[public] interface 接口名 [extends 父接口名]
{
[pubic] [static] [final] 类型 常量字段名=值;
……
[public] [abstract] 返回类型 方法名(参数列表);
……
}
(2)接口只能用权限修饰符public和默认修饰(一种特殊的抽象类)
(3)每一个接口文件可以包含多个类和接口,但只能有一个文件名和相同的public接口
(4)接口中的常量默认用public static final修饰
(5)接口中的方法默认用public abstract修饰
4.接口的实现
[public] class 类名 [extends 祖先类名]
implements 接口名[,其它 接口名……]
{
//类的实现代码
……
}
5.接口与接口的关系
继承:接口可以继承一个或多个其它接口,并添加新的属性、方法
6.接口与类的关系:
(1)类实现接口:多个(无关)类可以实现同一接口,多个(无关)接口也可以被一个类实现(多对多的关系)
(2)与子类继承抽象类相似,当非抽象类实现接口时必须实现接口中的所有(抽象)方法,否则定义为抽象类
(3)一个类只能继承一个直接父类,但能实现一个或多个接口;
(4)类在继承其他类的同时也可以实现一个或多个接口,但要保证关键字extends在implements前使用
7.接口无构造方法,不能创建接口的实例,但可以定义接口类型的引用变量,该变量的引用是这个接口的实现类的实例
8.接口与实现类之间也存在多态性
jdk1.8之后接口中可以有非抽象的方法
一个接口文件中可以包含多个接口和多个类
可以有0个或一个由public修饰的接口
public修饰的接口的名字要跟文件的名字一样
接口与接口之间是存在继承关系的,但是是多继承关系
类和类之间存在继承关系,是单继承关系
接口和类之间没有关系,接口在前类在后
类和接口之间是实现的关系,使用implements关键字表示实现关系,而且是多实现关系,类在前接口在后
一个类可以同时继承一个类实现多个接口,但是要求继承在实现之前
类实现接口的时候需要重写接口中所有的抽象方法,否则要把该类定义成抽象类否则编译报错
接口不能创建对象
可以创建接口类型的对象,由实现类赋值
接口也可以存在多态
在继承接口的类中通常要给出接口中定义的抽象方法的具体实现
四、抽象类与接口
对比1:
类只能继承一个抽象类
类可以实现多个接口
对比2:
抽象类可以有部分方法的实现,防止子类的重复实现,介于实现与抽象间的“半成品”
接口中没有方法的实现,完全是“抽象的”
对比3:
抽象类可扩展性好:可以加入属性和非抽象方法
接口要求稳定:加入的方法都是抽象方法,(如果扩展)实现类可能会出现问题
对比4:
抽象类中的抽象方法必须加abstract关键字
抽象类中的抽象方法可以不加abstract关键字(接口中的方法都是抽象方法)
五、工厂模式
1.工厂(方法)模式:是一种创建模式,实例化同一接口(父类)的多令工厂个类
2.设计:定义创建产品对象的工厂类,由工厂类创建实现(继承)同-接口(父类)的多个类对象
3.分类:
工厂方法:一个工厂方法,通过字符串判断,创建不同类的对象
多个工厂方法:多个工广方法,通过不同方法创建不同类的对象
静态工厂方法(简单工厂方法):多个静态方法
4.何时使用:
大量需要实例的类
实现(继承)同一接口(父类)
六、适配器模式
1.适配器模式(Adapter Pattern)
也叫包装器模式(Wrapper Pattern)
定义:将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作
2.分类
类的适配器模式:用于对类进行适配 何时使用:类转换成满足另一接口时
对象的适配器模式:用于对对象进行包装 何时使用:类转换成满足另一接口时
接口的适配器模式:用于对接口抽象化 何时使用:当不希望实现一个接口的所有方法
3.三个角色
源角色(220V电源):需要适配的目标类或接口
目标角色(计算机的电源接口):期望得到的接口
适配器角色(计算机电源变压器):用于把源角色转换成目标角色
4.何时使用
系统需要使用现有的类,而这些类的接口不符合系统的需要
七、适配器模式优缺点
适配器模式的优点如下:
1.将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无需修改原有代码
2.增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
3.灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”
4.由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强
对象适配器模式的缺点如下:
与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂
相关文章:
第十一章 抽象类与接口
一、抽象类和抽象方法 抽象类:使用abstract修饰的类 抽象方法:在类中没有方法体的方法,称为抽象方法,抽象方法用abstract修饰 抽象类中可以没有抽象方法,包含抽象方法的类必是抽象类 如果子类没有实现父类中的全部…...
请问企业的八大金刚系统是哪些?有什么共同点和区别?
我的理解的八大金刚包括:MES、ERP、WMS、OMS、CRM、SCM、SRM、PLM。 这些系统的主要功能及运用领域是哪些方面?他们互相之前有什么区别?选择时哪些是企业可能根据自身需求选择的必选项目或可选项目? 由于某些系统的必选性取决于企业的具体业…...
【入门】配置 Java 应用程序的完整指南
前言: Java 是一种广泛使用的编程语言,具备跨平台的特性,使得其应用程序可以在多种环境中高效运行。本文将介绍如何将 Java 应用程序从开发环境部署到生产环境,确保其能够稳定、稳定地运行运行。 确定运行环境 Java程序可以运行…...
flutter widget 设置GestureDetector点击无效
有可能是被上层的widget挡住了,虽然你看得到这个widget,但是操作不到。使用相对布局Stack要特别注意,这种布局会和Android一样,先写的布局放在下层,后写的,如果范围较大的话,会盖在之前的widget…...
基于SpringBoot的在线教育平台的设计与实现
文未可获取一份本项目的java源码和数据库参考。 选题的背景与意义: 随着互联网时代信息技术的不断发展,线下已经产生了很多IT技术的培训机构,但是价格却十分昂贵并且需要人们持续不断的去具体培训地点学习,因此更需要一个课程优…...
Django_Vue3_ElementUI_Release_004_使用nginx部署
1. nginx安装配置 1.1 下载nginx Download nginx 1.2 测试一下 1.3 进入nginx用命令操作 2. 部署 2.1 前端部署 2.1.1 修改nginx监听配置 …conf/nginx.conf http {... # 这里不进行修改server {listen 8010; # 监听 80 端口server_name 192.168.10.24; # 输入服务器 ip…...
Java抽象类的案例
抽象类的特点总结 不能实例化:抽象类不能直接创建实例。它只能被继承。即,你不能用 new 关键字创建抽象类的对象。 可以包含抽象方法:抽象类可以包含一个或多个抽象方法(没有方法体),这些方法必须在子类中…...
运维工程师面试整理-数据库
在运维工程师的面试中,数据库管理和优化是一个非常重要的环节。面试官可能会通过数据库相关的问题来评估你在数据库部署、管理、备份、性能优化以及故障排除方面的能力。以下是关于数据库部分的详细内容,帮助你更好地准备面试。 1. 数据库基础 ● 常见数据库类型 ○ 关系型数…...
comfyui一键抠图工作流:让你告别PS!
前言 本文涉及的工作流和插件,需要的朋友请扫描免费获取哦~ 在当今的数字时代,图像处理已经成为许多行业的日常需求。无论是电商产品展示、广告设计,还是个人照片编辑,去除背景都是一个常见且重要的步骤。 然而,使用…...
【Hot100】LeetCode—4. 寻找两个正序数组的中位数
目录 1- 思路题目识别二分 2- 实现⭐4. 寻找两个正序数组的中位数——题解思路 3- ACM 实现 原题链接:4. 寻找两个正序数组的中位数 1- 思路 题目识别 识别1 :给定两个数组 nums1 和 nums2 ,找出数组的中位数 二分 思路 将寻找中位数 —…...
【LLM text2sql】浅看大模型用于text2sql的综述
前言 之前笔者分享了text2sql & LLM & KG的有机结合实现KBQA的问答, 《【LLM & RAG & text2sql】大模型在知识图谱问答上的核心算法详细思路及实践》、 《【开源分享】KBQA核心技术及结合大模型SPARQL查询生成问答实践》。 我们再来看看大模型在te…...
Node js介绍
目录 概要**对Node的认识****Node的概念理解****Node和浏览器区别****Node的架构图** **Node的应用场景****Node的安装****安装Node的LTS版本****Node的版本管理工具nvm(了解)** **Node的输入和输出**Node程序传递参数Node的输出 **Node的全局对象****特殊的全局对象****其他的…...
企业编辑抖音百科词条有什么用?
企业编辑抖音百科词条有什么用? 百科词条创建对企业,品牌以及个人的重要性!#百科词条创建#百科营销#百科词条费用# 企业编辑百科词条主要是有以下这些好处,首先是丰富企业在网络上的信息,提高企业的知名度。 百科词条…...
数据结构-链式二叉树-四种遍历
博客主页:【夜泉_ly】 本文专栏:【数据结构】 欢迎点赞👍收藏⭐关注❤️ 数据结构-链式二叉树-四种遍历 1.前言2.前、中、后序遍历2.1前序遍历2.1中、后序遍历 3.层序遍历3.1递归实现3.2队列实现关于在Pop之后为什么还能用tmp访问节点&#x…...
【YashanDB知识库】数据库获取时间和服务器时间不一致
本文转自YashanDB官网,具体内容可见数据库获取时间和服务器时间不一致 【问题分类】功能使用 【关键字】服务器时间、数据库时间 【问题描述】数据库获取的时间和服务器时间不一致。 【问题原因分析】YashanDB并没有时区的概念,数据库的时间以数据库启…...
十大排序之:冒泡排序
目录 一、简介 实现过程 时间复杂度 二、代码实现 函数声明 Swap函数 单趟 多趟 测试 优化 一、简介 冒泡排序是一种简单的排序算法,它重复地比较相邻的两个元素,如果顺序错误就交换它们,直到没有元素需要交换为止。这个过程类…...
【MPC】无人机模型预测控制复现Data-Driven MPC for Quadrotors项目(Part 1)
无人机模型预测控制复现Data-Driven MPC for Quadrotors项目 参考链接背景和问题方法与贡献实验结果安装ROS创建工作空间下载RotorS仿真器源码和依赖创建Python虚拟环境下载data_driven_mpc仓库代码下载并配置ACADO求解器下载并配置ACADO求解器的Python接口下载并配置rpg_quadr…...
微信小程序开发——比较两个数字大小
在这里我们使用的工具是 需要自行安装和配置。 在微信小程序中比较两个数字大小有以下几种方式: 一、普通条件判断 在小程序的.js 文件中,先定义两个数字,如let num1 5; let num2 3;。通过if - else if - else语句,根据num1与…...
Java多线程3
1.有序性在并发编程中的含义。 有序性在并发编程中指的是在多线程环境下,程序的执行顺序应与单线程情况下保持一致,以避免出现不确定或错误的执行结果。 2.为何需要使用多线程进行程序设计? 使用多线程可以提高程序的效率,利用…...
node+Vue项目环境创建
nodeVue项目环境创建 使用淘宝镜像源使用官方镜像源()清除缓存取消取消ssl验证安装vue 使用淘宝镜像源 npm config set registry https://registry.npm.taobao.org/使用官方镜像源() 由于国内网络问题,安装报错 npm install -g cnpm --registryhttps://registry.…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
