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

黑马Java零基础视频教程精华部分_11_面向对象进阶(3)_抽象类、接口、适配器

《黑马Java零基础视频教程精华部分》系列文章目录

黑马Java零基础视频教程精华部分_1_JDK、JRE、字面量、JAVA运算符
黑马Java零基础视频教程精华部分_2_顺序结构、分支结构、循环结构
黑马Java零基础视频教程精华部分_3_无限循环、跳转控制语句、数组、方法
黑马Java零基础视频教程精华部分_4_对象、封装、this关键字、构造方法、对象内存图、成员变量、局部变量、标准JavaBean
黑马Java零基础视频教程精华部分_5_面向对象综合练习
黑马Java零基础视频教程精华部分_6_字符串
黑马Java零基础视频教程精华部分_7_ArrayList集合
黑马Java零基础视频教程精华部分_8_学生管理系统
黑马Java零基础视频教程精华部分_9_面向对象进阶(1)_static、继承
黑马Java零基础视频教程精华部分_10_面向对象进阶(2)_多态、包、final、权限修饰符、代码块
黑马Java零基础视频教程精华部分_11_面向对象进阶(3)_抽象类、接口、适配器
黑马Java零基础视频教程精华部分_12_面向对象进阶(4)_内部类


文章目录

  • 《黑马Java零基础视频教程精华部分》系列文章目录
  • 一、抽象类
    • 1、为什么要有抽象类?
    • 2、抽象方法
    • 3、抽象类
    • 4、抽象类和抽象方法定义格式
    • 5、注意事项
  • 二、接口
    • 1、为什么会有接口?
    • 2、接口和抽象类的异同
    • 3、接口的定义和使用
    • 4、接口中成员的特点
    • 5、接口和类之间的关系
    • 6、实战:编写带有接口和抽象类的标准Javabean类
    • 7、JDK8开始 接口中新增的方法
      • 有方法体的方法
      • 默认方法
      • 静态方法
    • 8、JDK9接口中新增的方法
    • 9、接口的应用
  • 三、适配器设计模式
    • 总结:


一、抽象类

1、为什么要有抽象类?

我们之前定义的类可以对对其父类进行重写,但是如果我没有重写,而父类有想要子类必须进行重写的话,我们就需要使用抽象类。

2、抽象方法

将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样所以,在父类中不能确定具体的方法体该方法就可以定义为抽象方法。

3、抽象类

如果一个类中存在抽象方法,那么该类就必须声明为抽象类。

4、抽象类和抽象方法定义格式

抽象方法的定义格式:

public abstract 返回值类型 方法名(参数列表);//不写方法体,直接写分号

抽象类的定义格式:

public abstract class 类名{}

5、注意事项

在这里插入图片描述
虽然抽象类不能创建对象,但是写了构造方法以后,编写子类的构造方法时,可以调用父类(抽象类)的构造方法,那么就实现了在创建子类对象时通过构造方法可以进行对属性(父类也就是抽象类中定义的被子类继承下来的属性)的赋值。

二、接口

1、为什么会有接口?

如下图所示,我们不能把游泳这个方法定义为抽象方法放在动物类中,因为兔子类是不会游泳的,那么我们就需要一种新的思路来让青蛙类和狗类以及学生类和老师类都需要实现游泳方法时可以把游泳提取出来,因为游泳是他们四个类的公共点。
在这里插入图片描述

2、接口和抽象类的异同

抽象类是一类事务,而接口更像是一类行为,接口就是一种规则,是对行为的抽象。

3、接口的定义和使用

  1. 接口用关键字interface来定义public interface 接口名 {}
  2. 接口不能实例化
  3. 接口和类之间是实现关系,通过implements关键字表示public class 类名 implements 接口名 {}
  4. 接口的子类(实现类),要么重写接口中的所有抽象方法,要么是抽象类。
  5. 注意1:接口和类的实现关系,可以单实现,也可以多实现,public class 类名 implements 接口名1,接口名2 {}
  6. 注意2:实现类还可以在继承一个类的同时实现多个接口。public class 类名 extends 父类implements 接口名1,接口名2 {}

4、接口中成员的特点

  1. 成员变量:只能是常量(名字,性别这种变量都提取到了父类中进行实现),默认修饰符:public static final 。其中public表示在任何地方都可以使用接口的常量,static是为了方便调用,用接口名加点加常量名称即可, final是因为接口是我们提取出的一些规则不需要改变,随意用final修饰。
  2. 构造方法:没有。
  3. 成员方法:只能是抽象方法,默认修饰符:public abstract。(JDK7以前:接口中只能定义抽象方法。JDK8的新特性:接口中可以定义有方法体的方法,JDK9的新特性:接口中可以定义私有方法。)

5、接口和类之间的关系

  1. 类和类的关系
    继承关系,只能单继承,不能多继承,但是可以多层继承
  2. 类和接口的关系
    实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。多个接口中有重名方法时,只需要对方法实现一次即可。
  3. 接口和接口的关系
    继承关系,可以单继承,也可以多继承。

6、实战:编写带有接口和抽象类的标准Javabean类

要求:
我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。
为了出国交流,跟乒乓球相关的人员都需要学习英语。
请用所有知识分析,在这个案例中,哪些是具体类,哪些是抽象类,哪些是接口?
乒乓球运动员:姓名,年龄,学打乒乓球,说英语
篮球运动员:姓名,年龄,学打篮球
乒乓球教练:姓名,年龄,教打乒乓球,说英语
篮球教练:姓名,年龄,教打篮球

做提前首先学会画图,如下图所示,这样简单的画图非常乱,我们可以仔细再思考一下,其实篮球教练和乒乓球运动员之前关系很小,我们父类的子类一般之间要有一定的关系才比较好。
在这里插入图片描述
改进后如下图所示:
在这里插入图片描述

7、JDK8开始 接口中新增的方法

有方法体的方法

JDK7以前:接口中只能定义抽象方法。
JDK8的新特性:接口中可以定义有方法体的方法。(默认、静态) 为什么?比如一个公司中的项目,一个顶级程序员在原本的接口中增加了新的抽象方法,那么其他程序员只要实现这个接口的都需要进行新的抽象方法的重写实现,不实现就会报错,这样很不人性化。为了不报错,那么在接口中就需要定义有方法体的方法,这样实现接口的类就不需要对接口中新增的方法必须进行重写。
JDK9的新特性:接口中可以定义私有方法

默认方法

允许在接口中定义默认方法,需要使用关键字 default 修饰
作用:解决接口升级的问题(比如添加新方法)
接口中默认方法的定义格式:
格式:public default 返回值类型 方法名(参数列表){}
范例:public default void show(){}
接口中默认方法的注意事项
默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字public可以省略,default不能省略
如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写。

静态方法

允许在接口中定义定义静态方法,需要用static修饰
接口中静态方法的定义格式:
格式:public static 返回值类型 方法名(参数列表){}
范例:public static void show(){}
接口中静态方法的注意事项:(1)静态方法只能通过接口名调用,不能通过实现类名或者对象名调用(2)public可以省略static不能省略
注意:类定义了与所继承的接口中相同名字的静态方法,这不叫重写,可分别用类或者接口名进行分别调用。为什么不是重写?因为静态方法并不放到虚方法表中。

8、JDK9接口中新增的方法

在这里插入图片描述
之前为了避免代码重复,我们把接口中一些重复代码放到一个新的方法show3()中,让其被重复调用即可,但这样show3()方法也会被外界可以调用,但我并不想show3()被外界调用,因为它只是用来记录重复代码的,那该怎么办呢?这就用到了普通的私有方法,其是为默认方法服务的,如果要为静态方法服务的话需要静态的私有方法,如下图所示:
在这里插入图片描述

9、接口的应用

1.接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了
2.接口多态:当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。接口类型 j = new 实现类对象();也遵守编译看左边,运行看右边的原则。

三、适配器设计模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
简单理解:设计模式就是各种套路
适配器设计模式:解决接口与接口实现类之间的矛盾问题。
比如:我定义了一个接口Inter,其中有十个抽象方法,我只想使用这个接口中的第五个抽象方法,但是如果直接用一个实现类InterImpl来实现这个接口,我必须重写所有方法。这时候怎么办?这时候就可以使用适配器设计模式。我可以在接口和接口的实现类中间建立一个类InterAdapter,对接口中的所有方法进行空实现(即方法体是空的),再被实现类InterImpl所继承即可,在实现类InterImpl中重写我所需要使用的方法即可。由于InterAdapter我只是进行了空实现,外界创建它的对象无意义,所以把它写成抽象类(但针对此应用场景,此抽象类不包含抽象方法)。

总结:

1.当一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以适配器设计模式
2.书写步骤:
(1)编写中间类XXXAdapter,实现对应的接口
(2)对接口中的抽象方法进行空实现让真正的实现类继承中间类,并重写需要用的方法
(3)为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修
3.注意:如果本来实现类已经有了一个父类,那这个父类需要被中间类所继承,因为JAVA无法多继承。

相关文章:

黑马Java零基础视频教程精华部分_11_面向对象进阶(3)_抽象类、接口、适配器

《黑马Java零基础视频教程精华部分》系列文章目录 黑马Java零基础视频教程精华部分_1_JDK、JRE、字面量、JAVA运算符 黑马Java零基础视频教程精华部分_2_顺序结构、分支结构、循环结构 黑马Java零基础视频教程精华部分_3_无限循环、跳转控制语句、数组、方法 黑马Java零基础视…...

Promethues Metrics

Metrics Metrics可分为三部分: HELP 描述metric作用TYPE metric类别 TYEP Counter 某个事件发生的次数数字只能增长 Total reuqests Total ExceptionsGauge 描述当前值可以上升或下降 CurrentCPU Utilization Available System Memory Number of concurren…...

公网IP与私网IP具体有哪些区别?

1.接入方式不同 公网IP以公网连接Internet上的非保留地址,私网IP则是局域网上的IP,通过NAT才能够与公网进行通信。 2.特点不同 公网IP由国际互联网络信息中心InterNIC负责,将IP地址分配给注册并向InterNIC提出申请的机构或组织。私网IP则是为节省可分配…...

LeetCode——3143. 正方形中的最多点数

通过万岁!!! 题目:给你一个n*2的数组,然后第i行表示第i个点的坐标,然后还给你了一个字符串s,s[i]则表示第i个点的名称。然后让你找一个中心是(0,0)的正方形,…...

const重新赋值的问题

问: const haveNextPage false; // 默认没有下一页fetch(historyFullUrl).then(data > {haveNextPage data.data.has_more;这段代码有什么问题吗? 回答: 在你的代码中,有一个潜在的问题涉及到 haveNextPage 的赋值。你定义了 haveNextPage 作为一个常量&am…...

python开发上位机 - PyCharm环境搭建、安装PyQt5及工具

目录 简介: 一、安装PyCharm 1、下载 PyCharm 2、PyCharm安装 1)配置安装目录 2)安装选项 3、问题及解决方法 二、安装PyQt5 1、打开 Pycharm,新建 Project 2、安装 pyqt5 3、安装很慢怎么办? 4、安装 pyq…...

day02-安装虚拟机

1. 安装配置 前面一直下一步就OK 2. 虚拟机操作系统配置 语言 中文 软件安装: 最小安装,标准,调试工具,开发工具,系统工具,man手册 网络和主机名配置 主机名,自己起名字 网络配置 常规 &g…...

Qt:线程

一个Qt窗口生成后,为什么拖动窗口,窗口可以随着鼠标移动或放大缩小 因为对窗口操作后,都有对应的事件产生,Qt在其框架中对这些事件进行了默认处理 一个Qt程序默认只有一个线程,称为主线程(也叫ui线程&#…...

VisionPro二次开发学习笔记11-使用 Caliper和Fixture定位Blob工具检测方块

该示例演示了如何使用卡尺工具和夹具工具来固定 Blob 工具。示例代码将检测图像上部区域中小方块的存在。当点击“运行”按钮时,将读取一张新图像。卡尺工具将被运行,卡尺工具的输出 Y 信息将传递给夹具工具。夹具工具使用来自卡尺工具的 Y 信息和新图像…...

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(五)卡尔曼滤波器一:认知卡尔曼滤波器;协方差矩阵与方差;

卡尔曼滤波器 为了研究卡尔曼,我阅读了大量博文。不敢说完全吃透,但是在做一件什么事,可以通过下面这文章来理解,我读了不下五遍。并整理标准重点,添加自己的一些见解。 自动驾驶传感器融合算法 - 自动驾驶汽车中的激…...

【Go】通过反射解析对象tag信息,实现简易ORM

反射是运行时,需要在运行时解析类型信息,编译期无法优化这些操作,因此比编译时已知类型信息的直接调用效率要低。 package mainimport ("fmt""reflect""strings" )type Person struct {Name string json:&quo…...

gemini2相机和宇树雷达L1的使用注意点

gemini2相机: 官方资料:Gemini2深度相机 (yahboom.com) 目前深度这一块智能提供某一点的深度数据,没有提供某一点的世界坐标,虽然网上有文章说是可以计算 已知深度图,获得某个像素点的三维坐标_深度图如何知道特征点的3d坐标-CS…...

FPGA开发——verilog随机涵数$random的使用方法

一、概述 我们进行FPGA开发的过程中在做仿真的时候,难免会需要一些数据作为输入。有的时候需要输入大量的数据对于设计结果进行一个验证,如果逐个去进行输入,就需要花费大量的时间。这种情况下我们通常会想到使用随机数。随机数在我们的日常…...

Android14 WPA2和WPA3 类型的WiFi网络连接

Android14 WPA2和WPA3 类型的WiFi网络连接 文章目录 Android14 WPA2和WPA3 类型的WiFi网络连接一、前言二、源码分析1、Android原生Settings 连接WPA 和WPA3 网络的配置代码 三、其他1、WPA/WPA2和WPA3连接小结2、WPA配置无法连接WPA3的网络的情况Android11 Wifi 加密类型详解 …...

24/8/5算法笔记 逻辑回归sigmoid

今日是代码对sigmoid函数的实现和运用 #linear_model线性回归 #名字虽然叫逻辑回归,作用于分类 #分类:类别 #回归:预测 from sklearn.linear_model import LogisticRegression 实现函数 import numpy as np import matplotlib.pyplot as pl…...

适用于验证码的OCR,识别快速,使用简单!

环境 windows 11python 3.9 前言 Muggle OCR 是一个高效本地 OCR 模块,旨在通过简单的几步设置提供强大的文本识别功能,无论是在处理印刷文本还是解析验证码,都能让用户在工作中畅通无阻。Muggle OCR 易于安装和使用,支持双模型&a…...

超简单适合练手的双指针题:判断子序列

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列&#…...

打破老美垄断,潘展乐商业价值起飞

文|琥珀食酒社 作者 | 积溪 奥运会上的潘展乐 真是牛逼坏了 拿下男子100米自由游金牌 打破欧美长达近百年垄断 搞定男子4x100米混合泳金牌 终结了美国在这项目上 10年不败的神话 比赛前 美国选手对他爱答不理 招呼都不打 比赛后美国选手想套热乎 潘展乐…...

java面试题:简化URL

1 问题场景 编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。 注意:字符串长度在 [0, 500000] 范围内。 2 答案 2.1 解决方案一 直接使用String方法解决 public s…...

用 echarts 开发地图、点击展示自定义信息框

1、下载所需地市的json 链接&#xff1a;DataV.GeoAtlas地理小工具系列 在右侧输入需要的名称&#xff0c;然后下载json文件到本地 2、在html 中准备容器&#xff0c;并设置宽高 <div id"mapContent"> <div ref"mapChart" style"width:10…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

数据库分批入库

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

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...