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的时候,就输出的不一样,比如:

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


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

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

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

相关文章

stm32F103 实现呼吸灯效果

目录 硬件连接 软件实现步骤 初始化系统时钟。 配置 GPIO 引脚。 配置定时器以生成 PWM 信号。 在主循环中调整 PWM 占空比以实现呼吸效果。 示例代码 1. 初始化系统时钟 2. 配置 GPIO 引脚 3. 配置定时器以生成 PWM 信号 4. 在主循环中调整 PWM 占空比以实现呼吸效…

python基础综合案例(数据可视化—折线图可视化)

可视化案例的学习目标: 通过案例,回忆巩固python基础的语法 锻炼编程能力,熟练语法的使用 1.json数据格式 两种不同的语言由于数据格式不同,所以没有办法直接沟通,就比如我们可以将python 的数据格式转成json&…

股票的一些术语

杠杆倍数 当你有1万港元,并且融资比例是1:9时,这意味着你可以用1万港元的保证金借入额外的9万港元。这样一来,你总共可以支配10万港元(1万港元本金 9万港元借款)来投资。 在这种情况下,杠杆倍数是这样计…

无人机之自主飞行关键技术篇

无人机自主飞行指的是无人机利用先进的算法和传感器,实现自我导航、路径规划、环境感知和自动避障等能力。这种飞行模式大大提升了无人机的智能化水平和操作的自动化程度。 一、传感器技术 传感器是无人机实现自主飞行和数据采集的关键组件,主要包括&a…

AndroidStudio部署多渠道打包环境(一)

对于游戏来说,需要上架国内很多家应用商店,还有一些小的渠道SDK,大大小小加起来也有几十家了,那么我们部署了多渠道打包环境之后就很方便了。 一 、配置游戏基本参数:在app下面的build.gradle文件里编辑, …

java实现类似C++的union

目录 1.引言 2.实际案例 3.java实现 1.引言 在C中有一种用户自定义数据类型叫联合体union,它允许你在相同的内存位置存储不同的数据类型。与结构体(struct)不同,结构体中的所有成员都占用各自的内存空间,而 union 的…

递归算法之快速幂(Exponentiation by Squaring)详细解读

快速幂(Exponentiation by Squaring)是一种用于快速计算大整数的幂次的算法。传统的幂运算需要进行 nnn 次乘法,而快速幂通过将幂次指数二分,减少了所需的乘法次数,使得计算复杂度从 O(n) 降低到 O(log⁡n)。它广泛应用…

【图论】(五)最短路径算法(D / BF / SPFA / F / A*)

最短路径算法(D / BF / SPFA / F / A*) 1. 最短路径之dijkstra(D算法)思路模拟过程程序实现拓展 2. dijkstra算法堆优化思路程序实现 3. Bellman_ford 算法(BF算法)松弛模拟过程拓展 4. Bellman_ford 队列优…

数据结构-B树和B+树

一、B树 一个节点包含多个key-value值 假设一棵B树由M个参数构建,我们将其称为M阶B树 每个节点最多有M-1个key-value值,并且key值升序排列,每个节点最多能有M个叉 1.1 分类 二节点 三节点 四节点 五节点 key: 给每一个文件进行标号&…

关于iPhone 16 Pro评测视频评论区特征的多维度分析

1.项目背景 随着智能手机的迅速发展,消费者在选择新设备时越来越依赖于网络评价和用户反馈,B站作为中国领先的视频分享平台,聚集了大量科技评测内容,其中UP主的评论区成为用户讨论和交流的重要场所,特别是在iPhone 16…

论文阅读:Guided Linear Upsampling

今天介绍一篇有趣的文章,Guided Linear Upsampling,基于引导的线性上采样,这是发表在 ACM transaction on Graphic 的一篇工作。 Abstract 引导上采样是加速高分辨率图像处理的一种有效方法。在本文中,文章作者提出了一种简单而…

Jetpack架构组件_LiveData组件

1.LiveData初识 LiveData:ViewModel管理要展示的数据(VM层类似于原MVP中的P层),处理业务逻辑,比如调用服务器的登陆接口业务。通过LiveData观察者模式,只要数据的值发生了改变,就会自动通知VIEW层&#xf…

excel判断某一列(A列)中的数据是否在另一列(B列)中

如B列如果有7个元素,在A列右边的空白列中,输入如下公式: COUNTIF($B$1:$B$7,A1), 其中,$B$1:$B$7代表A列中的所有数据即绝对范围,A1代表B列中的一个单元格.

Opensearch集群部署【docker、服务器、Helm多种部署方式】

操作系统兼容性 我们建议在 Red Hat Enterprise Linux (RHEL) 或使用systemd的基于 Debian 的 Linux 发行版上安装 OpenSearch ,例如 CentOS、Amazon Linux 2 和 Ubuntu Long-Term Support (LTS)。OpenSearch 应该适用于大多数 Linux 发行版,但我们只测…

ctfshow-文件上传-151-161

CTFshow文件上传 PHP文件上传:1、代码思路 黑名单是设置不能通过的用户,黑名单以外的用户都能通过。 phtml、pht、php3、php4、php5后缀都会按做php文件执行,且不在黑名单内。 2、绕过 找漏网之鱼:cer、php3、php4、phtml等。 大小写绕…

react 基础学习笔记

1.react 语法 ①数据渲染 函数组件将HTML结构直接写在函数的返回值中 JSX只能有一个根元素 JSX插值写法 插值可以使用的位置 1.标签内容; 2.标签属性 JSX 条件渲染:三目运算符; JSX根据数据进行列表渲染:map()方法&#x…

elementUI进度条el-progress不显示白色

效果图 通过设置百分比为100,动态修改进度条的宽度完成 <template><div class"myProgressBox"><div class"index">{{ index }}</div><div class"typeTitle">{{ typeTitle }}</div><div class"twoP…

Java求最大值 C语言局部变量 全局变量

1. public static void main(String[] args) {int[] arr {25, 24, 12, 98, 36, 45};int max arr[0];//不能写0for (int i 1; i < arr.length; i) {if (arr[i] > max) {max arr[i];}}System.out.println(max);} }//循环为零&#xff0c;降低效率&#xff08;就是自己…

autMan框架对接Kook机器人

一、创建kook机器人 KOOK 二、获取机器人token 三、填写autMan参数并重启 四、将机器人加入服务器 五、效果图 回复

技术成神之路:设计模式(二十二)命令模式

介绍 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;允许将请求&#xff08;命令&#xff09;封装为对象&#xff0c;从而使您可以使用不同的请求、队列或记录请求日志&#xff0c;以及支持可撤销操作。 1. 定义 命令模式将一个请求封装为一个…