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

第十一章 抽象类与接口

一、抽象类和抽象方法

抽象类:使用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.…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...