黑马Java零基础视频教程精华部分_11_面向对象进阶(3)

news2025/1/24 22:51:28

系列文章目录


文章目录

  • 系列文章目录
  • 一、抽象类
    • 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/1977807.html

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

相关文章

机器学习第五十周周报 CGNN

文章目录 week50 CGNN摘要Abstract0. 概述1. 题目2. Abstract3. 网络结构3.1 状态更新网络3.2 method 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论6.相关代码CompositeLGNNCompositeGNNcomposite-graph-class小结参考文献 week50 CGNN 摘要 本周阅读了题为Co…

【题解】189. 轮转数组(数组、数学、双指针)

https://leetcode.cn/problems/rotate-array/description/?envTypestudy-plan-v2&envIdtop-interview-150 class Solution { public:void rotate(vector<int>& nums, int k) {k k % nums.size(); // 注意k要取一下模reverse(nums.begin(), nums.end()-k);rev…

常见cms漏洞之ASPCMS

项目地址&#xff0c;自行百度 漏洞复现&#xff0c;使用后台配置文件拿shell 访问后台 http://192.168.177.153/admin_aspcms/login.asp 账号密码已设置成&#xff0c;登录即可 admin 123456

关于Win11无法自动进入休眠问题

最近从win10升到11了 感觉还挺好用的 就是右键有点逆天 主要是为了3k屏连接1080显示器更新的 但是发现彻底无法休眠了&#xff0c;这个还要说的是以前win10睡眠一次就算一次硬盘通电&#xff0c;现在更新后不会了 下面说回休眠 b站浏览一番后发现是22H2隐藏了休眠时间设置&a…

哈希 || unordered系列的关联式容器底层 | 哈希模拟实现 | HashTable代码实现

底层结构 unordered系统的关联式容器之所以效率比较高&#xff0c;是因为其底层使用了哈希结构。 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须经过关键码的多次比较。 顺序查找的…

【机器学习算法基础】(基础机器学习课程)-10-逻辑回归-笔记

一、模型的保存与加载 逻辑回归是一种常见的机器学习算法&#xff0c;广泛用于分类问题。为了在不同的时间或环境下使用训练好的模型&#xff0c;我们通常需要将其保存和加载。 保存模型 训练模型&#xff1a;首先&#xff0c;你需要用你的数据训练一个逻辑回归模型。例如&…

【软考】甘特图

目录 1. 说明2. 图示3. 特点4. 例题4.1 例题1 1. 说明 1.Gantt图是一种简单的水平条形图,它以日历为基准描述项目任务。2.水平轴表示日历时间线(如时、天、周、月和年等)&#xff0c;每个条形表示一个任务&#xff0c;任务名称垂直地列在左边的列中&#xff0c;图中水平条的起…

猫头虎分享:从零开始掌握ChatGPT的实用技巧与多样应用

猫头虎分享&#xff1a;从零开始掌握ChatGPT的实用技巧与多样应用 ChatGPT使用方法与应用场景分享 大家好&#xff0c;我是猫头虎 &#x1f42f;&#xff0c;欢迎大家来到这次的分享课程。在这里&#xff0c;我们将深入了解ChatGPT的使用方法和应用场景。本文旨在帮助大家从零…

配置nacos显示nacos registry register finished但是nacos页面看不到服务

在idea配置按以下配置&#xff1a; 父工程&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.1.0</version><type>pom</type&…

内网权限维持——映像劫持CLR劫持

文章目录 一、映像劫持1.1 IFEO简介1.2 利用Shfit后门技术进行劫持1.3 GlobalFlag 二、CLR劫持2.1 CLR简介2.2 利用CLR探查器进行权限维持 攻击机kali IP&#xff1a;192.168.111.0 跳板机win7 IP&#xff1a;192.168.111.128&#xff0c;192.168.52.143 靶机win server 2008 I…

【开端】通过springboot框架创建对象

日常创建对象的方式 UserService userService new UserService() 这中方式创建对象&#xff0c;是程序运行中&#xff0c;才会创建的对象。在web中&#xff0c;我们需要再web服务器启动完成就创建一系列的对象。这是就可以把创建对象的任务交给spring的IOC框架。 例如创建U…

SOMEIP_ETS_003:数组长度过短导致有效载荷被剥离

测试目的&#xff1a; 确保DUT在接收到的SOME/IP消息中数组长度小于实际数组长度时&#xff0c;能够正确地截断负载数据至声明的数组长度。 描述 本测试用例旨在验证DUT在处理一个声明数组长度小于其实际长度的SOME/IP消息时&#xff0c;是否能够将响应消息的负载数据截断至…

国标GB/T28181视频转S3云存储,支持阿里云OSS、腾讯云COS、天翼云存储,视频转云存大大降低运营商项目运营成本

最近在做一个运营商主导的项目&#xff0c;在沟通项目需求的时候&#xff0c;发现从运营商的角度&#xff0c;带宽和存储的成本在内部计费中是能够比市场上的价格低的多的多&#xff0c;以一个100路摄像头的本地存储为例&#xff0c;如果采用NVR本地存储&#xff0c;或者CVR本地…

LabVIEW水下根石监测系统

开发了一种基于LabVIEW平台开发的水下根石监测系统。该系统利用高精度姿态传感器与位移传感器&#xff0c;实现了水下根石状态的实时自动监测&#xff0c;提高了水利工程安全管理的现代化和精细化水平&#xff0c;具有高精度、高稳定性和良好的操作性。 项目背景&#xff1a; …

计算机体系结构和计算机组成原理的区别

如何理解计算机体系结构和计算机的组成&#xff1f;哪个对计算机的性能更重要&#xff1f;说明理由 目录 计算机体系结构 计算机组成 二者区别 哪个对性能更重要 计算机体系结构 计算机体系结构是指根据属性和功能不同而划分的计算机理论组成部分及计算机基本工作原理、理论…

Linux系统驱动(二)字符设备驱动

文章目录 一、概念&#xff08;一&#xff09;相关概念&#xff08;二&#xff09;字符设备框架结构&#xff08;三&#xff09;用户空间和内核空间数据传输1. 函数的参数对应关系 &#xff08;四&#xff09;字符设备相关的API1. 字符设备驱动&#xff08;1&#xff09;注册字…

stl容器 vector的使用与模拟实现

1.vector构造 1.1默认构造函数 vector<int>是vector类模版类型&#xff0c;尖括号里的类型是指生成什么类型的vector的类&#xff0c;实质上vector可以看做一个数组&#xff0c;vector<int>实质上就是生成了一个存int类型的数组&#xff0c;而tamp是这个数组的名字…

SpringSecurity-2(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)

SpringSecurity使用自定义认证页面 4 SpringSecurity使用自定义认证页面4.1 在SpringSecurity主配置文件中指定认证页面配置信息4.1.1 配置springSecurity.xml配置文件4.1.2 定义login.jsp 4.2 SpringSecurity的csrf防护机制4.2.1 SpringSecurity中CsrfFilter过滤器说明4.2.2 禁…

苹果iPhone 16 Pro系列有望支持Wi-Fi 7,再也不说苹果信号不好了

苹果公司始终以其创新技术引领智能手机市场的发展。 随着新一代iPhone 16系列的即将发布&#xff0c;特别是iPhone 16 Pro系列&#xff0c;预计将带来一系列令人瞩目的升级和新功能。 其中最引人注目的是Wi-Fi 7技术的应用&#xff0c;这将为用户带来前所未有的无线网络速度。…

计算机毕业设计选题推荐-校园服务系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…