抽象类、比较器和接口

一.抽象类

1.抽象类的概念:如果一个类中没有包含足够的信息来描述一个具体的对象,这样的类就是抽象类。(图例说明:)

2.抽象方法的概念:当一个方法被abstract来修饰,此时代表着这个方法可以不进行实现,此时的方法就成为抽象方法。

3.抽象类:如果一个类当中,包含抽象方法,此时这个类就必须是抽象类。但是没有抽象方法,这个类也可以写为抽象类。

4.当不能描述一个具体的对象的时候,这个类可以被定义为抽象类。

5.抽象类中定义的成员和普通类没有区别。

6.抽象类不可以被实例化,所以抽象类是为了被继承。

7.当一个普通类继承这个抽象类之后,必须重写抽象类当中的抽象方法。

8.抽象类也可以发生多态:

9.此时抽象方法也要满足重写的条件。(被final 或者 static 或者 private修饰的方法不能重写的)

10.当一个普通类A继承了一个抽象类,不想重写这个这个抽象类的方法,此时可以把普通类A改为抽象类,但是如果抽象类A被普通类B继承了,那么B中就要重写A继承的抽象类中的方法和A中抽象的方法。

二.接口(实现某种功能)

1.概念:多个类的公共规范。

2.定义接口使用关键字interface。

3.接口当中的成员变量默认为public static final修饰的,所以定义的时候必须初始化。(这里的public static final也是可以省略的)

4.接口当中的方法默认是public abstract修饰的。(抽象方法是没有具体实现的)

5.接口当中使用default和static修饰的方法可以具体实现。(test3也是可以重写的只是没有进行演示)

6.接口和抽象类一样不能被实例化。        

7.接口需要被类实现,需要使用关键字implements实现(implements就是让类实现接口)

8.当一个类实现了一个接口,那么这个类就要重写这个方法。

9.接口可以发生向上转型,也可以发生动态绑定,也可以发生多态。

10.接口当中不能有静态代码块 实例代码块 和 构造方法。

11.接口虽然不是类,但是编译完成之后字节码文件的后缀格式也是.class。

12.实现多个接口:

13.接口解决了多继承的问题: (若需要继承父类需要先extends再implements)

14.这里还可以让使用者忘记类型,有了接口就可以不用关注具体类型,而只关注某个类是否具有这个功能。

15.接口也可以使用extends来扩展:

16.用接口来完成引用数据类型的比较:(要重写Comparable中的方法)

17.字符串的比较大小要用compareTo:(这里的compareTo和上述重写的compareTo不一样)

18.Compareble接口有局限性,一旦这个类写死了一种比较方式,后期就不能随意进行更改。

三.Clonable接口(任何一个类默认都是继承于Object类的)

1.由于要使用Object中的clone方法是protected,那么这个访问修饰限定符是最多只能在不同包的子类中访问的。所以我们只能通过super来访问它的克隆方法。

2.在自定义类中重写一个clone方法:

3.这里保存是因为这是调用的Object这个父类的方法,所以这里需要向下转型。        

4.还报错的原因是异常的这个原因,这个在后面异常课件中讲解。

5.正确的话就是这样的:

6.代码正确但是运行报错:

7.解决方法是必须一个克隆的接口:

8.这个接口为什么没有抽象方法:(在我们使用这个接口的时候都没有重写方法)

9.因为此时这个接口叫做空接口或者标记接口。当这个接口被实现了,才能证明有被克隆这个功能。

10.克隆示意图:

四.比较器

1.比较器的实现:(年龄比较器)

2.比较器中也有要重写的方法:

3.比较器这个类中有了这个功能后的重写方法:

4.比较器的用法:(先实例化比较器的类对象,在通过比较器的类来调用重写的方法,传入引用就可以进行比较)

五.Arrays.sort方法和比较器联动

1.这是Arrays.sort里面的参数,目前先简单的理解为可以传入一个数组和一个Comparator

2.使用自己的Comparator来排序:

3.此时我们把nameComparator传入Arrays.sort中时,就是发生了向上转型,使排序使通过我们重写的compare进行的。这里就发生了动态绑定。

六.深浅拷贝

1.浅拷贝:

浅拷贝会通过克隆过的对象来改变原来的数据。

2.深拷贝:在上述的浅拷贝中,money的值会被克隆后的对象进行修改,是因为在拷贝之后试student2中克隆过来的是age=10和m中存储money的地址。m的地址又指向了money就与student1中的m中存储的money的地址是一样的。所以在student2中修改money的值也会把student1中的money的值改变。所以就需要让m也进行一次克隆,也就是深拷贝了。

3.深拷贝的实现:首先我们需要让money类和student类一样来实现接口,才能使用克隆。

然后我们在student的类中来克隆m。(因为其中调用clone都是Object类中的方法,所以需要调用父类的方法,然后我们这里是通过子类来调用父类的方法,那么就是向下转型)

示意图:

七.接口和抽象类的区别

1.核心区别:抽象类中可以包含普通的字段和方法,在子类中可以被直接调用(不需要重写)。而接口中并不存在普通方法,每一个方法都是抽象方法,并且字段都是public static final修饰的,子类也必须重写接口中所有的抽象方方法。

2.图表:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode-189:轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…

毕业设计选题:基于ssm+vue+uniapp的自助购药小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

828华为云征文|使用Flexus X实例集成ES搜索引擎

目录 一、应用场景 1.1 Flexus X实例概述 1.2 ES搜索引擎 二、安装相关服务 2.1 安装Elasticsearch7.17.0 2.2 安装kibana7.17.0 三、开通安全组规则 四、整体感受 4.1 Flexus X实例 4.2 使用感觉 一、应用场景 1.1 Flexus X实例概述 Flexus X实例是华为云推出的一款…

Cisco Packet Tracer的安装加汉化

这个工具学计算机网络的同学会用到 1.下载安装 网盘链接:https://pan.baidu.com/s/1CmnxAD9MkCtE7pc8Tjw0IA 提取码:frkb 点击第一个进行安装,按步骤来即可。 2.汉化 (1)复制chinese.ptl文件 (2&…

Redisson分布式锁的概念和使用

Redisson分布式锁的概念和使用 一 简介1.1 什么是分布式锁?1.2 Redisson分布式锁的原理1.3 Redisson分布式锁的优势1.4 Redisson分布式锁的应用场景 二 案例2.1 锁竞争案例2.2 看门狗案例2.3 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff…

如何在 macOS 上恢复未保存的 Excel 文件 – 文件恢复的最佳方法

Microsoft Excel 主要用于学生、员工和组织创建电子表格、报告和许多其他内容。我们是人,我们也容易忘记事情。因此,您想要在 macOS 上恢复未保存的 Excel 文件并不罕见。 虽然在 Excel 上恢复未保存的电子表格很容易,但在 macOS 上就有些棘…

AWS注册时常见错误处理

引言 创建AWS账号是使用AWS云服务的第一步,但在注册过程中可能会遇到一些常见的问题。本文中九河云将帮助您排查和解决在创建AWS账户时可能遇到的一些常见问题,包括未接到验证电话、最大失败尝试次数错误以及账户激活延迟等。 常见问题及解决方法 1. …

VSCode编程配置再次总结

VScode 中C++编程再次总结 0.简介 1.配置总结 1.1 launch jsion文件 launch.json文件主要用于运行和调试的配置,具有程序启动调试功能。launch.json文件会启用tasks.json的任务,并能实现调试功能。 左侧任务栏的第四个选项运行和调试,点击创建launch.json {"conf…

String类常用的方法

源代码: 输出结果:

卡码网KamaCoder 108. 冗余连接

题目来源:108. 冗余连接 C题解(思路来源代码随想录):并查集。因为原来是树,所以加入边之前肯定不是一个根,如果是一个根,再加一条边,肯定成环。所以只要找到根一致的两个点组成的边即…

前端工程化4:从0到1构建完整的前端监控平台

前言 一套完整的前端监控系统的主要部分: 数据上报方式数据上送时机性能数据采集错误数据采集用户行为采集定制化指标监控sdk 监控的目的: 一、数据上报方式 本文的方案是,优先navigator.sendBeacon,降级使用1x1像素gif图片…

网站建设中,JavaScript为什么现在可以做后台了?

JavaScript,作为一种最初为浏览器端脚本设计的语言,已经逐渐发展成为可以在服务器端运行的强大工具。以下是JavaScript可以做后台开发的原因分析: Node.js的崛起 事件驱动与非阻塞I/O:Node.js的事件驱动和非阻塞I/O模型使得JavaSc…

[WMCTF2020]Make PHP Great Again 2.01

又是php代码审计,开始吧. 这不用审吧,啊喂. 意思就是我们要利用require_once()函数和传入的file的value去读取flag的内容.,貌似呢require_once()已经被用过一次了,直接读取还不行,看一下下面的知识点. require_once() require…

2.1 HuggingFists系统架构(一)

系统架构 HuggingFists的前端主体开发语言为HtmlJavascript,后端的主体开发语言为Java。在算子部分有一定份额的Python代码,用于整合Python在数据处理方面强大能力。 功能架构 HuggingFists的功能架构如上,由下向上各层为: 数据存…

鸿蒙OpenHarmony【轻量系统芯片移植】轻量系统STM32F407芯片移植案例

轻量系统STM32F407芯片移植案例 介绍基于STM32F407IGT6芯片在拓维信息[Niobe407]开发板上移植OpenHarmony LiteOS-M轻量系统,提供交通、工业领域开发板解决方案。移植架构采用Board与SoC分离方案,使用arm gcc工具链Newlib C库,实现了lwip、l…

windows11环境安装lua及luarocks(踩坑篇)

一、lua安装及下载 官方地址: Lua Binaries Download 从这里就有坑了,下载后先解压win64_bin.zip,之后解压lib,用lib中的文件替换win64的,并把include文件夹复制过去,之后复制并重命名lua54,方…

初识Jenkins持续集成系统

随着软件开发复杂度的不断提高,团队成员之间如何更好地协同工作以确保软件开发的质量,已经慢慢成为开发过程中不可回避的问题。Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更…

【JVM原理】运行时数据区(内存结构)

JVM (Java Virtual Machine)原理 文章目录 四、运行时数据区(内存结构)4-1 线程私有区域程序计数器(program counter Register)本地方法栈(Native Method Stacks)Java 虚拟机栈&…

探索MemGPT:AI界的新宠儿

文章目录 探索MemGPT:AI界的新宠儿1. 背景介绍2. MemGPT是什么?3. 如何安装MemGPT?4. 简单的库函数使用方法5. 场景应用场景一:创建持久聊天机器人场景二:文档分析场景三:多会话聊天互动 6. 常见Bug及解决方…

HTML中的表单(超详细)

一、表单 1.语法 <!-- action&#xff1a;提交的地方 method&#xff1a;提交的方式&#xff08;get会显示&#xff0c;post不会&#xff09; --> <form action"#" method"get"><p>名字&#xff1a;<input name"name" ty…