Java:抽象类和接口

一.抽象类

1.抽象类概念和语法

⨀概念:

在面向对象的概念中,所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类

⨀语法: 

在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体

⨀现在我们来用一个实例,来展示一下抽象类的概念和语法形式

c310de6e9eae4fada0e452701abd4ce9.png

2.抽象类特性

⨀抽象类不能直接实例化对象

e4208f75b9e249509e4d5d4dcf75b3e0.png

⨀抽象方法不能是 private 的 

626232205ee14f9cba6ae913b625c55f.png

被private所修饰的方法在子类中是不可见的,这就导致了我们不能重写该方法 

⨀抽象方法不能被final和static修饰

041e1834224f434b9eaccfc17ddb58a6.png

因为抽象方法要被子类重写,但是static和final关键字会阻止方法的重写。

⨀抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰 

如果我们不重写抽象方法就会报错

190552c8975a461f8540ea6100552049.png

a3abc978b26746b9a11096625f848d69.png

如果我们不想在子类中重写抽象方法,我们可以将子类也修饰为抽象方法,但是记住,出来混迟早是要还的,在之后我们需要在Circle的子类下重写Shape和Circle的所有抽象方法

11ea8405510c4db780914216dba27ab0.png

a0c8397b9c7045bda3bda324870c2894.png

⨀抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类 

ab594443faea48079eb647fdbf787d85.png

9a1e0d2b62174702b6cad51c4f4802a7.png

⨀抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量 

f572ed0482d64bcbaacd9955102eec94.png

3.抽象类的作用

抽象类本身是不能被实例化, 要想使用, 只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法,这时我们发现其实我们的普通类也完全可以实现这些功能但是为什么要用抽象类呢?这其实是因为使用抽象类的时候我们可以多一层校验,因为想这样的一类代码实际的完成不应是我们的父类完成,而是由我们的子类来进行实现,如果我们不用抽象类在编译时时不会报错的,但是当我们是抽象类时,一旦我们进行实例化的时候,就会提醒我们错误,这样可以使我们尽早发现问题。

二.接口

1.接口的概念和语法

⨀概念:

接口在我们的生活中比比皆是,例如我们的机箱和笔记本上的USB口,插座上的插座口等等。这些都是我们生活中的接口,但是接口之间也是有着一定的标准的,例如我们的插座口,我们以三个插头接口为例,只要我的符合三个插头接口标准,尽管是不同的家电,也都能给设备进行充电,所以我们可以把接口看成公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。

所以在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型

⨀语法 :

接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。

⨀定义一个C接口 :

创建接口时, 接口的命名一般以大写字母 I 开头.

 d08a57e065b64e43936d7920a190475e.png

⨀注意:在接口中定义的属性默认是 public static final 修饰的,方法默认是 public abstract 修饰的,但是我们默认不写,直接写类型+名字/方法名即可。

3d563d76aa3d4d52a225035a23a15246.png

⨀注意:由于方法默认是由 abstract 所修饰的,所以在接口中方法全都为抽象方法,没有方法体 

2.接口使用

接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。

注意:接口与类之间是实现关系。所以这时我们又要引入一个新的关键字implements

public class 类名称 implements 接口名称{
// ...
}

b3147934956043458e9bb488f86e3299.png

3.接口特性

⨀接口类型是一种引用类型,但是不能直接new接口的对象 

836883ea66f147ada3dd3dfad5c0b425.png

⨀接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错) 

⨀接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量

这两个在上文我们已经提到了

3d563d76aa3d4d52a225035a23a15246.png

⨀接口中的方法是不能在接口中实现的,只能由实现接口的类来实现 

这个在上文也提到到了因为方法默认是被public abstract 所修饰的,是抽象的方法,是没有方法体的,所以方法不能在接口中实现,只能由实现接口的类进行重写。

⨀重写接口中方法时,不能使用默认的访问权限 

接口中方法默认是public 修饰的,而在重写是访问限定符不能比原方法严格,范围只能大于等于原方法。而默认访问权限的范围是比public要小的所以不能是用默认访问权限,同时我们也知道public修饰符的范围是最大的,所以我们接口的重写修饰符只能是public.

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

22eaa2f502004ab8a0342b5c0bfc9335.png

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

⨀如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类

⨀jdk8中:接口中还可以包含default方法

4.实现多个接口

Java中不支持多继承,但是一个类可以实现多个接口。

注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。

 

5.接口间的继承

接口支持多继承,即一个接口可以继承多个接口

e6387962b0df49dbb3e44fb951e16e3a.png

6.接口的使用

如果我们想要进行对象之间的比大小我们该怎么进行呢?,我们先来看一段代码

像是图片上的两个对象我们如果使用正常的方式去对比,我们其实是比不了的,因为我们不知道是用年龄比还是去用姓名去比,所以我们根本不能进行比较。

如果我们想要进行比较的话,我们就要用到类去实现 Comparable 接口, 并实现其中的 compareTo 方法 

 注意:我们必须要实现Comparable 接口,并且重写compareTo 方法 让我们知道根据什么进行比较的,才能进行对象的比较。

这时我们又想到了一个于比较相关的问题排序,我们知道在数组中我们可以使用Arrays.sort();方法进行排序

如果我们这时我们想要把在数组里的对象进行排序我们该怎么办呢?

这时我们就要将两方法进行联合使用,实现Comparable 接口,并且重写compareTo 方法和toString()方法,这后再利用sort进行排序 

7.Clonable 接口和深拷贝

Java 中内置了一些很有用的接口, Clonable 就是其中之一Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”. 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常.

我们发现这里出现了错误,这是因为我们的clone的返回类型为Object,我们要进行强制类型转换

 但是我们转换完之后,发现问题还是存在

 这时我们可以在main方法后加上一个throws CloneNotSupportedException就能解决这个异常

但是如果这时我们想要打印我们所克隆到person2中的name,我们发现还是出现了错误

 如果想要解决这个方法就要我们进行接口的实现,即Cloneable接口

深拷贝和浅拷贝

浅拷贝:

 

深拷贝:

 

 

8.抽象类和接口的区别

核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中 不能包含普通方法, 子类必须重写所有的抽象方法

三.Object类

1.Object类的介绍

Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父 类。即所有类的对象都可以使用Object的引用进行接收

2.获取对象信息

如果要打印对象中的内容,可以直接重写Object类中的toString()方法

3.对象比较的方法equals

在Java中,==进行比较时:

  • 如果==左右两侧是基本类型变量,比较的是变量中值是否相同
  • 如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
  • 如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的

 

 

4.hashcode方法

hashCode()这个方法,他能帮我们算一个具体的对象位置,然后调用Integer.toHexString()方法,将这个地址以16进制输出。

 我们会认为,当两个方法的对象的成员都相同的时候,认为它们在同一个位置上,如果不重写,当我们使用hashCode的时候,就输出的不一样,比如:

如果我们想要让他们相同的话可以去进行重写 


 好了今天的分享就到这里了,我们下一篇见!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter使用不同方式传递接口参数

1、使用 HTTP 请求中的参数: 在 JMeter 的测试计划中,添加一个 "HTTP 请求" 元件。 在 "HTTP 请求" 元件的参数化选项中,可以添加参数的名称和值。可以手动输入参数,也可以使用变量来传递参数值。 如果要使…

Golang | Leetcode Golang题解之第497题非重叠矩形中的随机点

题目: 题解: type Solution struct {rects [][]intsum []int }func Constructor(rects [][]int) Solution {sum : make([]int, len(rects)1)for i, r : range rects {a, b, x, y : r[0], r[1], r[2], r[3]sum[i1] sum[i] (x-a1)*(y-b1)}return Sol…

自定义多级联动选择器指南(uni-app)

多端支持:可以运行在H5、APP、微信小程序还是支付宝小程序,都可以轻松使用改组件。自定义配置:您可以根据需要配置选择器的级数,使其适应不同的数据结构和用例。无限级联:此组件支持无限级联选择,使您能够创…

最好的ppt模板网站是哪个?做PPT不可错过的18个网站!

现在有很多PPT模板网站,但真正免费且高质量的不多,今天我就分享主流的国内外PPT模板下载网站,并且会详细分析这些网站的优缺点,这些网站都是基于个人实际使用经验的,免费站点会特别标注,让你可以放心下载&a…

信息安全工程师(64)其他恶意代码分析与防护

前言 恶意代码是指那些能够损害系统用户和系统所有者利益的软件,是故意在计算机系统上执行恶意任务的恶意代码的集合。 一、恶意代码分析 病毒(Virus) 定义:病毒是一种人为制造的、能够进行自我复制的、具有对计算机资源的破坏作用…

国家信息安全水平考试(NISP一级)最新题库-第十七章

目录 另外免费为大家准备了刷题小程序和docx文档,有需要的可以私信获取 1 受到了ARP欺骗的计算机,发出的数据包,     地址是错误的() A.源IP;B.目的IP;C.源MAC;D.目的MAC 正…

rust入门基础总结

文章目录 前言1、输出格式规范一、占位符相关(一){}与{:?} 二、参数替换方式(一)位置参数(二)具名参数 三、格式化参数(一)宽度(二)对齐(三&…

基于K8S的StatefulSet部署mysql主从

StatefulSet特性 StatefulSet的网络状态 拓扑状态:应用的多个实例必须按照某种顺序启动,并且必须成组存在,例如一个应用中必须存在一个A Pod和两个B Pod,且A Pod必须先于B Pod启动的场景 存储状态:应用存在多个实例&…

Golang | Leetcode Golang题解之第500题键盘行

题目: 题解: func findWords(words []string) (ans []string) {const rowIdx "12210111011122000010020202" next:for _, word : range words {idx : rowIdx[unicode.ToLower(rune(word[0]))-a]for _, ch : range word[1:] {if rowIdx[unico…

【Redis】数据结构(下)

文章目录 QuickList概念QuickList结构QuickList的特点控制ZipList的大小对节点的ZipList进行压缩 总结 SkipList概念源码中结构分析总结 QuickList 概念 问题1:ZipList虽然节省内存,但是申请的内存必须是连续空间,如果内存占用过多,申请内存效率低,怎么办? 为了缓解这个问题,…

可编辑38页PPT | 柔性制造企业数字化转型与智能工厂建设方案

荐言分享:在数字化技术快速发展的今天,传统的大规模生产模式已难以满足市场对个性化、定制化产品的需求。柔性制造以其灵活多变、快速响应的特点,成为制造业转型升级的关键。通过数字化转型与智能工厂建设,企业可以构建高效、灵活…

Llama Tutor:开源 AI 个性化学习平台,根据主题自动制定学习计划

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号&#xff…

Centos7 将man手册内容转换为txt,pdf访问,并汉化

转换为txt格式 直接将man的输出导入到txt文档即可,使用col -b 删除掉特殊字符方便阅读 # man ps | col -b > ps.txt转换为pdf格式 使用 groff 将 man 页转换为 PostScript 格式,然后使用 ps2pdf 转换为 PDF: 下载ps2pdf 命令工具包&am…

8阻塞队列

阻塞队列能是⼀种 线程安全的数据结构 , 并且具有以下特性: • 当队列满的时候, 继续⼊队列就会阻塞, 直到有其他线程从队列中 取⾛ 元素. • 当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队列中 插⼊ 元素 标准库中的阻塞队列 在 Java 标准库中内置了阻塞队列. …

与ai一起作诗(《校园清廉韵》)

与ai对话犹如拷问自己的灵魂,与其说ai助力还不如说在和自己对话。 (笔记模板由python脚本于2024年10月19日 19:18:33创建,本篇笔记适合喜欢python和诗歌的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free&…

NGINX 保护 Web 应用安全之基于 IP 地址的访问

根据客户端的 IP 地址控制访问 使用 HTTP 或 stream 访问模块控制对受保护资源的访问: location /admin/ { deny 10.0.0.1; allow 10.0.0.0/20; allow 2001:0db8::/32; deny all; } } 给定的 location 代码块允许来自 10.0.0.0/20 中的任何 IPv4 地址访问&#xf…

sql注入 --二次注入堆叠注入文件读取getshell

二次注入 二次注入原理: SQL二次注入,指的是在有些应用场景下,我们先把SQL注入的payload写入到目标站点数据库中,然后再在某些实际将该数据取出,使得我们写入的payload执行。 堆叠注入 条件: 因为堆叠注…

客户端工具xshell/finalshell连接Vagrant创建的虚拟机并上传本地文件

vagrant up #启动虚拟机 vagrant ssh #进入到虚拟机中 su root #切换超级管理员 vi /etc/ssh/sshd_config #修改PasswordAuthentication为yes; systemctl restart sshd #重启sshd服务修改之后 就可以使用xshell正常连接了

算法笔记day05

目录 1.最小公倍数 2.最长连续的子序列 3.字母收集 1.最小公倍数 求最小公倍数_牛客题霸_牛客网 算法思路&#xff1a; 这就是一道数学题&#xff0c;a,b的最小公倍数 a * b / 最大公约数。 使用辗转相除法&#xff0c;求a&#xff0c;b的最大公约数。 #include <iostre…