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

news2024/9/29 15:23:11

《黑马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无法多继承。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1980323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】文件变身大作战:Linux下的文件重命名艺术

欢迎来到 CILMY23 的博客 🏆本篇主题为:文件变身大作战:Linux下的文件重命名艺术 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法…

OpenGL3.3_C++_Windows(33)

PBR渲染管线 Physically Based Rendering渲染管线 :使用一种更符合物理学规律的算法模型来模拟光线,由于它与物理性质非常接近,可以直接以物理参数为依据来编写表面材质判断是否基于物理的渲染,有三个数学模型:微平面,能量守恒&a…

Go语言实现支持泛型的二分查找算法

二分查找基本原理图: 参考代码: 泛型的定义: package v2024type Integer interface {int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 }type Float interface {float32 | float64 }type Number interface …

无需变更环境变量,一键管理和运行不同JDK版本的jar包

前言 之前公司的项目一直用的都是JDK8,然后前段时间,公司要求以后的新项目必须要用JDK17及以上的版本。但是以前的旧项目还有很多都在维护。 这样子的话,电脑上就至少有两个版本的JDK了。我想在不变动环境变量的情况下(环境变量…

可穿戴设备与健康科技:迈向个性化医疗的未来

在数字化和智能化浪潮的推动下,可穿戴设备与健康科技正迅速改变我们的健康管理方式。这些设备不仅使我们能够实时监测健康指标,还为个性化医疗提供了宝贵的数据支持。本文将详细探讨可穿戴设备的作用、健康监测技术的发展、个性化医疗的趋势,…

代码随想录——买卖股票的最佳时机含冷冻期(Leetcode 309)

题目链接 动态规划 class Solution {public int maxProfit(int[] prices) {if(prices.length 0 || prices.length 1){return 0;}// 初始化int[][] dp new int[prices.length 1][2];dp[1][0] -prices[0];for(int i 2; i < prices.length; i){dp[i][0] Math.max(dp[…

Arduino PID库 (5):开启或关闭 PID 控制的影响

Arduino PID库 &#xff08;5&#xff09;&#xff1a;开启或关闭 PID 控制的影响 Arduino PID库 &#xff08;4&#xff09;&#xff1a;Reset Windup 问题 尽管拥有一个PID控制器很好&#xff0c;但有时你并不关心它要说什么。 PID On - User Overwritting Output&#x…

安全测试:保护系统免受攻击和数据泄露

目录 前言1. 安全测试的概念2. 安全测试的主要作用2.1 发现安全漏洞2.2 评估风险2.3 确保合规性2.4 提高安全意识 3. 安全测试在整个测试中的地位4. 常用的安全测试工具4.1 渗透测试工具4.1.1 Metasploit4.1.2 Burp Suite 4.2 漏洞扫描工具4.2.1 Nessus4.2.2 OpenVAS 5. 安全测…

通道加密机的定义与功能

通道加密机是一种用于保护数据传输过程中安全性的硬件设备&#xff0c;它通过加密技术确保数据在通道中传输时不被非法截获或篡改。以下是对通道加密机的详细解析&#xff1a; 一、定义与功能 通道加密机是一种专门设计用于加密和解密在特定通信通道上传输的数据的设备。它能够…

【网络安全】|pgp的安装和使用

1、pgp的安装&#xff1a; 参考&#xff1a; https://jingyan.baidu.com/article/86fae346c289173c49121a11.html 实际操作&#xff1a; 在第六步中有不同&#xff0c; 第5步重启后&#xff0c;打开pgp desktop, 可以看到如图&#xff1a; 此时需要做两件事&#xff1a; 1、将…

第35讲:Manager可视化组件管理Ceph集群

Manager可视化组件管理Ceph集群 1.Mgr组件的基本概念 Mgr组件的官方文档&#xff1a;https://docs.ceph.com/en/latest/mgr/ Ceph Manager守护进程 (ceph-mgr) 与Monitor守护进程一起运行&#xff0c;为外部监控和管理系统提供额外的监控和接口。 ceph luminous版本中新增加…

配置阿里云 Maven 仓库地址

阿里云 Maven 仓库地址&#xff1a; maven {// 阿里云 Maven 仓库地址url https://maven.aliyun.com/repository/public} 执行结果&#xff1a;

决策曲线DCA的绘制

今天被要求画一下决策曲线&#xff0c;用Python试了半天也没画出来&#xff0c;最后参考了资料还是用R语言绘制了出来。 数据的格式 将四条曲线画在一张表中 library(rmda) library(readxl)# 读取Excel文件 data <- read_excel("C:/Users/Administrator/Desktop/肺动脉…

09 同步原语 sync包让你对并发控制得心应手

上节课留了一个思考题&#xff1a;channel 为什么是并发安全的呢&#xff1f;是因为 channel 内部使用了互斥锁来保证并发的安全&#xff0c;这节课&#xff0c;我将为你介绍互斥锁的使用。 在 Go 语言中&#xff0c;不仅有 channel 这类比较易用且高级的同步机制&#xff0c;…

MES系统如何精准采集与对接设备数据,全面优化设备管理

一、MES系统如何采集和对接设备数据 MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;采集和对接设备数据主要通过以下几种方式实现&#xff1a; 手工录入&#xff1a; 这是最基础的数据采集方式&#xff0c;通过操作人员在MES系统界…

C++基础知识(入门章)

绪论 历经千辛万苦&#xff0c;我们终于来到了一个全新的板块---C。本期的内容主要是关于C的一些基础知识的初步了解。让我们一起努力&#xff0c;克服编程路上的艰难险阻&#xff0c;迎接属于自己成功的彼岸~ C的发展历史 1979年 C的起源可以追溯到1979年&#xff0c;当时B…

从根儿上学习spring 四 之run方法启动第一段

图1 由上图我们可以看到&#xff0c;我把run方法分成了5个小段&#xff0c;每小段使用红框圈了起来&#xff0c;这一篇我们先开始讲第一段。大家需要关注下行号&#xff0c;我讲的时候可能会使用行号对应具体某行代码。 图1-289-290行&#xff1a; 没啥好说的定义了两个变量&…

【VMware】如何演示使用U盘在VMware虚拟机上安装Windows11

一、前置准备 在开始使用U盘演示在VMware虚拟机上装Windows11前&#xff0c;我们需要做以下前置的准备&#xff1a; 已制作好的Windows引导盘&#xff1b;WMware软件 如何制作Windows引导盘&#xff1f; 推荐参考&#xff1a; 【建议收藏】2024年最新Windows系统重装教程&…

SpringBoot中整合ElasticSearch快速入门

文章目录 Elasticsearch 是什么使用MySQL和ES对比SpringBoot中整合ElasticSearch快速入门Springboot中操作ES测试效果说明 Elasticsearch 是什么 Elasticsearch是一个基于 Apache Lucene 构建的分布式搜索和分析引擎&#xff0c;能够处理大规模数据并提供实时搜索和分析功能。…

简单的docker学习 第8章 docker常用服务安装

第8章 常用服务安装 本章主要学习最常用的&#xff0c;也是安装起来稍有些麻烦的 MySQL 与 Redis 两种服务器的Docker 安装。至于其它服务器的 Docker 安装&#xff0c;大家可自行查找资料。只要 MySQL 与 Redis这两类服务器学会了安装&#xff0c;其它服务器的安装基本也不会…