【JavaSE】(6)抽象类和接口

news2024/11/20 1:23:43

目录

一、抽象类

1、什么是抽象类

2、抽象类的特点

3、抽象类的作用

4、抽象类示例代码

二、接口

1、什么是接口

2、接口的书写建议

3、接口的特点

4、实现多个接口

5、接口能“忘记类型”

6、接口间的继承

7、接口的应用

7.1、引用类型的比较--Comparable 和 Comparator 接口

7.2、引用类型数组排序--Comparable 和 Comparator 接口

7.3、引用类型的克隆--Clonable 接口

7.3.1、浅拷贝

7.3.2、深拷贝

三、抽象类和接口的区别

四、Object类

1、equals

2、hashCode


一、抽象类

1、什么是抽象类

        抽象类就是不能描述一个具体对象的类,比如类 Shape,它的子类可以有 Cycle、Squre等。Shape 的 draw 并不能确定子类对象的描绘,此时 Shape 就需要定义为抽象类。抽象类由 abstract 修饰。抽象类中,不能准确描述子类对象的方法 draw 叫做抽象方法,同样用 abstract 修饰。

        这样,抽象类负责声明抽象方法,而子类负责重写来实现抽象方法,子类就能准确描绘自己的 draw 了。

        因为抽象类的抽象方法并没有具体实现,所以抽象类不可以用 new 实例化

        因为抽象类要求子类必须重写抽象方法,所以子类要么重写抽象方法,要么子类也为抽象类,但最后一个子类必须要重写抽象方法。

        因为抽象方法必须被重写,就不能用 private、static、final 修饰了。

         抽象方法必须在抽象类中,但抽象类不一定有抽象方法。

2、抽象类的特点

        首先,它与普通类的相似之处:都可以有属性、普通方法、构造方法

        然后,它的独特性:不能实例化、可以有抽象方法。

3、抽象类的作用

        有人会说,普通类的子类也能重写,为什么非要声明抽象?实际上,abstract 起了一个编译器检查的作用,避免应该用子类(比如 Cycle)描述 draw,却误用父类(Shape)描述 draw的情况。有了 abstract ,实例化抽象父类会报错,而实例化普通父类却不会。

4、抽象类示例代码

二、接口

1、什么是接口

        接口就是通用的规范,实现规范的要求,就能使用了。接口的修饰词 interface 替代类 class 的位置。

2、接口的书写建议

  • 接口名以 I 开头。
  • 接口名最好是形容词。
  • 接口里边的成员不要加修饰符,用默认的,更简洁。

3、接口的特点

        接口不能实例化。

        一个类要实现接口,用 implememts

        一个类实现接口,要重写抽象方法,方法的修饰词只能是 public,因为重写方法的访问权限不能低于被重写方法的访问权限。如果没重写要用 abstract 修饰。

        接口中的成员变量默认且必须修饰为 public static final

        接口中的成员方法,如果不实现默认且必须public abstract

        接口中的成员方法,要实现必须 static 或者 default 修饰。默认public 修饰。

        接口中不能有静态代码块构造方法

        接口不是类,编译完的字节码也单独为一个 .class 文件。

4、实现多个接口

        一个类不能继承多个父类,但是能实现多个接口,这可以弥补继承的缺陷。

        示例代码:比如不是所有的动物都会游泳,因此不能把跑、游全部写在 Animal 类里。如果把跑、游分别写在两个类里,又不能继承多个类。这种情况,就使用接口,接口可以实现多个。

5、接口能“忘记类型”

        接口相对于继承,还有一个优势,就是接口可以“忘记类型”,而类只能“半忘记类型”。

        比如,在继承实现多态时,Dog、Cat 同属 Animal 的子类,那么只能由 Animal 的子类向上转型,而不能是其它类的子类,或者没有继承的类。

        在接口实现多态时,不管属不属于 Animal ,只要是实现了 IRunable 的类,都能够向 IRunable 转型。

        示例代码:Dog、Dock、Robot 都能跑。

6、接口间的继承

        相当于把接口合并。比如鸭子是又会跑,又会游的两栖动物,那么可以把 IRunnable 和 ISwimable 合并成一个接口。类和类单继承,类和接口多实现,接口和接口能多继承

        示例代码:

7、接口的应用

7.1、引用类型的比较--Comparable 和 Comparator 接口

        基本数据类型,可以直接比较大小。引用类型,比如自定义的 Student 不能直接比较大小,因为没有比较的标准,姓名?年龄?分数?

        因此,可以实现 Comparable 接口,并实现 compareTo 方法参数接收一个

        但这样又有个问题,固定了 age 作为比较的标准。如果一开始用的 age,过了几天业务变了,又想用 score,直接在重写的 compareTo 方法里改,是万万不可的。之前用你写的类,以 age 为标准的同事怎么办?直接改会全部乱套。对类具有侵入性(引入该组件后,其它代码要做相应的更改,以适应组件)。

        比较好的办法是,给每一种比较标准实现一个比较器,它们都实现 Comparator 接口,重写 compare 方法参数接收两个

        注意,name的类型 String 也是引用类型,得用 String 类重写的 CompareTo 。

7.2、引用类型数组排序--Comparable 和 Comparator 接口

        引用类型有了比较标准,就能进行排序了。

        用 Arrays.sort(默认升序),可以用 Student 内默认的 compareTo 比较:

        也可以指定比较器(按 name)比较:

        降序,将重写 compareTo 或者 compare 的两个值反过来

        原理,比如自定义一个冒泡排序:改动前,o1-o2>0 才交换,即升序;改动后,o2-o1>0才交换,即降序。

        降序,如果不改动 compareTo 或者 compare,也可以改动自定义冒泡排序的 > 为 <

7.3、引用类型的克隆--Clonable 接口

        Object 类是所有类的祖先,因此其它的引用的对象可以使用父类 Object 实现的方法 Clone。但是,需要满足3个条件:

(1)Object 类中的 Clone 方法访问权限范围protected,也就是如果在不同包,只能被子类使用。

        现在有一个 Person 类:

        在另一个 Test 类中创建 Person 的对象,并直接克隆,不可行。因为用 Object 类的方法克隆 Person 的对象,那么 Person 才是 Object 的子类,而不是 Test。又由于 protected 修饰,Person 的对象的克隆,就只能在 Person 类中实现,而不能在其它类中实现。

        Person 类重写 Clone 方法,让其他类间接克隆 Person 的对象:

(2)Clone 方法的返回值是 Object 类型,需要向下转型,才能实现赋值给 Person 对象:

        但仍然报错:不支持克隆。

(3)Person 类必须实现 Cloneable 接口。Cloneable 接口是一个空接口,主要是标记作用,标记这个类能克隆。

7.3.1、浅拷贝

        现在,我们实现了 Person 对象的克隆,给 Person 加一个 Money 对象作为成员变量

        测试代码:

        运行结果:

        代码只改变了 person2 的 money,事实上 person1 的 money 也改变了

        绘制数据存储图:

        m  也是引用类型,存的是对象的地址。只创建了新的 Person 对象空间,并复制内容;而没有创建新的 Money 对象空间,并复制内容。这就是浅拷贝

7.3.2、深拷贝

        深拷贝,必须把 Person 类里面的所有引用类型成员变量也拷贝一份。

        再运行上面的测试代码,person1的 m 的 money就不会跟着改值了:

三、抽象类和接口的区别

        抽象类其实有普通类的功能。

  • 抽象类可以有普通成员,构造方法;接口只能有抽象方法,想有成员变量和方法,得有修饰符的限制。
  • 抽象类是被继承,接口是被实现。
  • 一个类只能继承一个抽象类,但能实现多个接口。
  • 一个接口不能继承普通类,但是能继承多个接口,相当于把继承的接口合并。
  • 抽象类可以的访问权限跟普通类一样,默认和 public;但接口只能是 public。

四、Object类

        Object类是所有类的爸爸,很重要。

1、equals

        重点是比较相不相等(返回值是 boolean)compare 和 compareTo比较哪个大(返回值是 int)

        不是我们想要的比较值,所以重写

2、hashCode

        作用是算一个对象在内存中的位置,详细的后续学。源码是 native 方法,看不到具体实现,

        两个地址不同的对象,就算赋值相同,分别直接用 hashCode,hashcode值也不一样。

        这样改了是相同的。

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

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

相关文章

Git学习教程(更新中)

持续更新完善中… 1 Git简介 1.1 Git是什么&#xff1f; Git是一个开源的分布式版本控制系统&#xff0c;由Linus Torvalds创建&#xff0c;用于有效、高速地处理从小到大的项目版本管理。它能够记录项目文件的变更历史&#xff0c;让多个开发者可以协作开发同一个项目&#…

TON商城与Telegram App:生态融合与去中心化未来的精彩碰撞

随着区块链技术的快速发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;逐渐成为了数字生态的重要组成部分。而Telegram作为全球领先的即时通讯应用&#xff0c;不仅仅满足于传统的社交功能&#xff0c;更在区块链领域大胆探索&#xff0c;推出了基于其去中心化网络的…

〔 MySQL 〕数据类型

目录 1.数据类型分类 2 数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float 2.3.2 decimal 3 字符串类型 3.1 char 3.2 varchar 3.3 char和varchar比较 4 日期和时间类型 5 enum和set mysql表中建立属性列&#xff1a; 列名称&#xff0c;类型在后 n…

两行命令搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),含完整的 Docker 安装步骤

深度学习环境的配置过于繁琐&#xff0c;所以我制作了两个基础的镜像&#xff0c;希望可以帮助大家节省时间&#xff0c;你可以选择其中一种进行安装&#xff0c;版本说明&#xff1a; base 版本基于 pytorch/pytorch:2.5.1-cuda11.8-cudnn9-devel&#xff0c;默认 python 版本…

免费实时图片编辑工具:MagicQuill

参看&#xff1a; https://huggingface.co/spaces/AI4Editing/MagicQuill 人工智能交互式图像编辑&#xff1a;可以制定涂改增加删除

前端学习八股资料CSS(五)

更多详情&#xff1a;爱米的前端小笔记&#xff0c;更多前端内容&#xff0c;等你来看&#xff01;这些都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们的支持才是我不断更新的动力&#xff01;找…

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言&#xff1a;自2021年起&#xff0c;翼鸥教育便开始应用OceanBase社区版&#xff0c;两年间&#xff0c;先后部署了总计12套生产集群&#xff0c;其中核心集群占比超过四分之三&#xff0c;所承载的数据量已突破30TB。自2022年10月&#xff0c;OceanBase 社区发布了4.2.x 版…

如何在 Ubuntu 22.04 上安装 ownCloud

简介 ownCloud 是一个开源的个人云存储平台&#xff0c;它允许用户在本地服务器上存储和同步文件&#xff0c;提供了一个类似于 Dropbox 或 Google Drive 的服务&#xff0c;但是更加注重隐私和数据控制。以下是 ownCloud 的一些基础使用简介&#xff1a; 文件存储&#xff1…

使用Mybatis向Mysql中的插入Point类型的数据全方位解析

1. 结果 希望每一个能够看到结果的人都能自己装载进去&#xff01;加油&#xff01; 2.代码 2.1TestMapper import org.apache.ibatis.annotations.*; import java.util.Date; import java.util.List;/*** author Administrator*/ Mapper public interface TestMapper {/*…

web——sqliabs靶场——第六关——报错注入和布尔盲注

这一关还是使用报错注入和布尔盲注 一. 判断是否有sql注入 二. 判断注入的类型 是双引号的注入类型。 3.报错注入的检测 可以使用sql报错注入 4.查看库名 5. 查看表名 6.查看字段名 7. 查具体字段的内容 结束 布尔盲注 结束

鸿蒙实战:页面跳转传参

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙项目2.2 编写首页代码2.3 新建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 本次实战&#xff0c;学习如何在HarmonyOS应用中实现页面间参数传递。首先创建项目&#xff0c;编写首页代码&#xff0c;实现按钮跳转至第二个页面并…

数据结构(基本概念及顺序表——c语言实现)

基本概念&#xff1a; 1、引入 程序数据结构算法 数据&#xff1a; 数值数据&#xff1a;能够直接参加运算的数据&#xff08;数值&#xff0c;字符&#xff09; 非数值数据&#xff1a;不能够直接参加运算的数据&#xff08;字符串、图片等&#xff09; 数据即是信息的载…

一.安装版本为19c的Oracle数据库管理系统(Oracle系列)

1.数据库版本信息&#xff1a; 版本信息&#xff1a; 或者直接由命令查出来&#xff1a; 2.操作系统的版本信息 3.安装包下载与上传 可以去oracle官网下载也可以从其他人的百度网盘链接中下载&#xff1a; 使用xftp工具或者其他的工具&#xff08;mobaxterm&#xff09;上传到l…

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…

说说软件工程中的“协程”

在软件工程中&#xff0c;协程&#xff08;coroutine&#xff09;是一种程序运行的方式&#xff0c;可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释&#xff1a; 一、协程的基本概念 定义&#xff1a;协程是一组序列化的子过程&#xff0c;用户能像指挥家…

MinIO 的 S3 over RDMA 计划: 为高速人工智能数据基础设施设定对象存储新标准

随着 AI 和机器学习的需求不断加速&#xff0c;数据中心网络正在迅速发展以跟上步伐。对于许多企业来说&#xff0c;400GbE 甚至 800GbE 正在成为标准选择&#xff0c;因为数据密集型和时间敏感型 AI 工作负载需要高速、低延迟的数据传输。用于大型语言处理、实时分析和计算机视…

怀旧游戏打卡清单(TODO)

感觉忙碌了好久好久&#xff0c;真的好想休息一下。。 整理一下将来休息时候的打卡清单&#xff0c;不工作了去个海边狂打游戏&#xff0c;想想就惬意啊。当然&#xff0c;最好找个work from home&#xff0c;去海边找个酒店上班。挣钱休息两不误。。。 能不能实现另说&#xf…

《Python制作动态爱心粒子特效》

一、实现思路 粒子效果&#xff1a; – 使用Pygame模拟粒子运动&#xff0c;粒子会以爱心的轨迹分布并运动。爱心公式&#xff1a; 爱心的数学公式&#xff1a; x16sin 3 (t),y13cos(t)−5cos(2t)−2cos(3t)−cos(4t) 参数 t t 的范围决定爱心形状。 动态效果&#xff1a; 粒子…

使⽤MATLAB进⾏⽬标检测

目录 数据准备定义模型并训练用测试集评估性能推理过程⼀⾏代码查看⽹络结构⼀⾏代码转onnx结语 ⼈⽣苦短&#xff0c;我⽤MATLAB。 Pytorch在深度学习领域占据了半壁江⼭&#xff0c;最主要的原因是⽣态完善&#xff0c;⽽且api直观易⽤。但谁能想到现在MATLAB⽤起来⽐Pytorch…

word-毕业论文的每一章节的页眉单独设置为该章的题目怎么设置

在Microsoft Word中&#xff0c;为毕业论文的每个章节设置不同的页眉&#xff0c;通常需要使用“分节符”来分隔各个章节&#xff0c;然后在每个章节中单独设置页眉。以下是详细步骤&#xff1a; 使用分节符 插入分节符&#xff1a; 将光标放在每个章节的末尾&#xff08;注意…