java【抽象类与接口】

news2024/11/17 19:42:07

抽象类与接口

  • 1 抽象类
    • 1.1 定义与使用
    • 1.2 抽象类和抽象方法使用原则
  • 2 接口
    • 2.1 定义
    • 2.2 使用规则
  • 3. JDK中内置接口
    • 3.1 Comparable接口
    • 3.2 Cloneable接口
  • 抽象类与接口的对比

前言:如果强制要求子类必须覆写一些方法,则就会用到抽象类和抽象方法

1 抽象类

1.1 定义与使用

  • 在面向对象的世界中,一切皆对象,但是某些类是比较抽象的概念,无法对应具体的实体,则这些类就可以作为抽象类。
    即:若某些类的信息无法具体描述一个对象,只是作为具体对象的父类,这种类就能定义为抽象类。
    eg:比如sharp、animal、person
  • 使用关键字abstract定义抽象类。抽象类是普通类的超集,只是比普通类多了一些抽象方法([0…N])而已。普通类有的,抽象类都有。
  • 使用关键字 abstract 定义抽象方法。抽象方法没有方法体{},只有方法声明。
    eg:在 Java中,没有方法体的方法一定是抽象方法 (X)
    还需要看关键字abstract,在Java中,native方法也没有方法体,该方法不是抽象方法。本地方法是由C++实现的方法,Java只负责调用,方法体实现是C++代码。
    在这里插入图片描述

1.2 抽象类和抽象方法使用原则

  1. 抽象类不能直接实例化对象,即便抽象类中没有任何抽象方法,也无法直接实例化对象。只能通过向上转型进行引用赋值。
 Sharp sharp=new sharp();//错误
 Sharp sharp=new Cycle();//正确,可以直接new一个子类对象
  1. 抽象类的子类若是普通类,则必须覆写抽象类中的所有抽象方法。若子类是抽象类,则一个抽象方法都可以不写。
  • 强制要求子类必须进行方法覆写,保证多态的正常运行
  • 抽象方法在没有加访问限定符时,为默认的default权限。
  1. abstract和其他关键字的使用
  • private 和 abstract 能否同时修饰一个方法?
    不能。private 修饰的方法却无法进行方法覆写;abstract 修饰的方法必须进行方法覆写。冲突!
  • final 和abstract 能否同时出现?
    不能。final 修饰的类没有子类,不能覆写方法。
  • static 和abstract 能否同时出现?
    不能。static 修饰的方法不能被重写。
  1. 抽象类是普通类的超集
    抽象类中仍然能够定义构造方法和普通方法,且仍然能够满足对象的实例化流程,先调用抽象类的构造方法而后调用子类的构造方法。

  2. 抽象类存在意义
    抽象类就是在普通类的基础上进一步提取,只是比普通类多了一些抽象方法而已,抽象方法的存在要求子类必须进行方法重写,从而保证多态的正确执行!

2 接口

2.1 定义

  1. Java中可以看做是多个类的共同规范,接口也是引用数据类型
  2. 语法
  • 使用关键字interface定义接口。接口中99%都是抽象方法。
    一般使用I开头表示接口的命名。
  • 子类使用 implement 实现接口,子类若是普通类,则必须覆写接口中所有的抽象方法。
    一般来说,子类使用Impl结尾,表示是接口的实现子类。
  1. 接口子类和抽象类子类的区别
  • 接口的子类之间没有太多的联系,接口只是多个不同类之间相同的规范,表示一种水平方向上的混合规范
  • 抽象类属于继承体系结构之中,抽象类的子类之间具有许多的共性,抽取出子类的共有特征。
  1. 接口典型应用场景
  • 表示一种规范/标准:USB接口、5G标准…都是一种规范
  • 表示一种能力/行为:飞翔、游泳、跑…不同动物具备的能力不同,因此通过接口来描述

2.2 使用规则

  1. 接口是更加纯粹的抽象类,只有全局常量和抽象方法,没有构造方法,没有普通方法,因此,接口无法实例化对象,只能通过子类向上转型被接口引用接收。

  2. 接口的子类允许多实现,一个类可以使用implement实现多个父接口!(避免了抽象类的单继承局限性)
    在这里插入图片描述
    接口的子类不是is a关系,一个子类可以同时满足多个标准或具备多种能力。
    eg:手机类既满足5G标准,又满足USB标准,因此,手机这个类既实现5G接口,又要实现USB接口,可以实现多个接口。

  3. 因为接口中只有全局变量和抽象方法,因此在接口中,以下关键字全部可以省略不写。阿里编码规约明确表示,接口中只保留核心关键字,可以省略的坚决不写!只有接口有此规则!!
    public abstract 修饰常量:static final

  4. 子类若同时继承一个抽象类,实现多个接口。请先使用extends继承一个类,而后使用implements实现多个接口。

  • eg:接口表示能力示例
    IRunISwimIFly接口
    在这里插入图片描述
    测试:
    在这里插入图片描述
  • 应用场景二:统一规范USB接口
    使用鼠标、键盘来实现USB接口。
    电脑类和USB接口的关系是啥?电脑是否需要实现USB标准
    电脑是USB的使用者不是实现者。使用者表示需要自己插入到别的设备上,使用者自身具备USB连接口,只需要别的设备连接即可!
    (鼠标实现了USB接口,只要某个设备含有USB接口,鼠标进行插入)
  1. 接口的多继承。接口和接口之间可以使用extends继承多个父接口,但是接口不能使用extends继承类!接口存在多继承
    在这里插入图片描述
  2. JDK8之后,接口中也允许存在普通方法,接口中的普通方法使用default定义。
    在这里插入图片描述

3. JDK中内置接口

3.1 Comparable接口

JDK内置的对象比较接口 java.lang.Comparable接口,自定义的类型要想让其具备可比较的能力,(1)实现java.lang.Comparable接口,(2)覆写compareTo方法。

public int compareTo(Object o)
{
	return 0;
}

返回值类型int表示,当前对象和传入对象o作比较,根据返回值判断当前对象和传入对象o之间的大小关系。
(1) >0 的数,当前对象 > 传入对象
(2) <0 的数,当前对象 < 传入对象
(3) =0 的数,当前对象==传入对象

  • 为什么传入参数是object类型?
    因为不清楚传入的参数具体是什么类型的对象,不知道需要进行比较的是什么类型的子类,因此使用参数的最高统一化类型,只要是类进行比较,都可以使用Object进行接收。
  • 对一个学生数组进行排序
public class Student implements Comparable{
	private String name;
	private int score;
	//覆写Object类的compareTo方法
	public int compareTo(Object o)
	{
		//1.先判断边界条件:传入的o是否为空;传入的o是否为Student类型对象
		if(o==NULL||o instanceof Student)
		{
		//2.此时没有可比性,抛出异常
		throw new IllegalArgumentException("参数非法!");
		}
		//3. 说明o合法且为Student类型的引用,向下转型将其还原为Student类型
		Student stu=(Student)o;
		return this.score-stu.score;
	}
}

测试

public static void main(String[] args)
{
	Student stu1=new Student("张三"95);
	Student stu1=new Student("张三"95);
	//此时的this指针指向stu1去和stu2比较
	System.out.println(stu1.compareTo(stu2));
}

当Student类实现了Comparable接口,JDK的Array.sort就是按照compareTo方法的返回值进行大小排序。
在这里插入图片描述

  • 使用冒泡排序对其进行排序
//参数对象是Comparable接口数组,只要传入的对象实现了Comparable接口,自然就是Comparable子类
public static void sort(Comparable[] array)
{
	//外层循环表示所走趟数
	for(int i=0;i<array.length-1;i++)
	{
		boolean isSwaped=false;
		//内层循环进行一次,有序数组元素+1,将当前无序数组的最大值放在了数组末尾
		for(int j=0;j<array.length-1-i;j++)
		{
			if(array[j].compareTo(array[j+1])>0)
			{
				Comparable temp=array[j];
				array[j]=array[j+1];
				array[j+1]=temp;
				isSwaped=true;
			}
		}
		//发现任意一次内层循环中,没有任何与元素交换,则整个数组已经有序
		if(!isSwaped)
		{
			break;
		}
	}
}

在这里插入图片描述

  • 总结
    基本数据类型可以根据具体数值进行大小比较;
    对于对象而言,内部所包含的属性不止一个,因此通过实现Comparable接口的compareTo方法的返回值进行比较。将复杂问题转化为int的大小关系比较。

3.2 Cloneable接口

  • 1. 概念
    要想让一个类具有可复制的能力(1)实现Cloneable接口(2)然后覆写Object类中的clone方法
    在克隆的过程中是有新对象的产生,新对象的属性值和被克隆的对象完全一致。
  • 2. 标记接口
    Cloneable接口属于JDK的标记接口,类似的还有序列化接口Serializable,没有具体的方法。标记接口只要实现其子类,JVM运行起来就会识别这种标记,赋予其相应的能力;JVM识别所有实现了Cloneable的类,赋予其可复制的能力,打上可克隆的标记。
    在这里插入图片描述
  • 只有实现了Cloneable接口(打上标记)的类才能覆写clone方法,否则就会被JVM抛出异常
    在这里插入图片描述
    3. 深浅拷贝
    (1)浅拷贝
    被克隆的对象内部若包含其他类型的引用,则克隆后的对象,仍然保留原引用,不会产生新的对象。
    浅拷贝只会将原对象内部的所有属性值复制一份,引用则只会复制引用的值,即地址,仍旧指向的是同一个对象
    在这里插入图片描述
    (2)深拷贝
  • (a)递归进行clone的调用
    克隆对象内部包含其他类型的引用,其他类型的引用在克隆时也会调用克隆方法产生新对象。

在这里插入图片描述

  • (b)进行序列化操作
    广义上的序列化就是将任意的对象转为字节流
    序列化:将任意对象转为字符串,json字符串,json的序列化
    反序列化:将特定的字符串转为某个具体类的对象,json的反序列化
    经过序列化得到的新对象一定是深拷贝对象。

抽象类与接口的对比

在这里插入图片描述

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

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

相关文章

【备战秋招】每日一题:4月29日美团春招第四题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第四题-SSTF算法 在线评测链接:P1269 题目内容 塔子哥是一名磁盘维修师&#xff0c;他的工作是检查和修复损坏的磁盘。为了提高工作效率&#xff0c;他使用了一种最短服务…

SpringBoot解决跨域的问题

产生跨域问题的原因是浏览器的同源策略&#xff0c;所谓同源是指&#xff1a;域名&#xff0c;协议&#xff0c;端口相同。如果不同&#xff0c;将会出现跨域问题。 一、创建项目 创建两个项目&#xff0c;一个命名为provider提供服务&#xff0c;一个命名为consumer消费服务…

Apifox详细讲解!大大提升了协作效率

目录 一、前言 1.1. 场景一、后端视角&#xff1a; 1.2. 场景二、前端视角&#xff1a; 1.3. 场景三、测试视角&#xff1a; 二、Apifox 2.1 场景一、后端视角&#xff1a; 2.2 场景二、前端视角&#xff1a; 2.3 场景三、测试视角&#xff1a; 三、总结 一、前言 工…

游泳时用什么耳机听歌好?推荐四款音质很不错的游泳耳机

对平常人来说&#xff0c;游泳是个非常好的辅助运动。对身体机能没有太大伤害&#xff0c;还能锻炼到身体大部分的肌肉&#xff0c;对心肺也非常有帮助。随着夏天的到来各大游泳馆甚至是海边都是挤满了人&#xff0c;游泳时候如果还想听歌怎么办&#xff1f;耳机之所以很少听到…

手机远程控制电脑教程,让你随时随地掌控自己的电脑!

为什么我们需要从手机远程控制电脑&#xff1f; 随着远程访问工具的出现&#xff0c;如Windows内置功能远程桌面、Chrome远程桌面等&#xff0c;让我们可以轻松的远程控制另一台电脑&#xff0c;这使得工作和学习更加便捷和高效。 然而&#xff0c;有些人可能会遇…

java 整合opc读取

参考链接 opc 介绍 软件 参考链接 创建opc ua 连接错误 参考连接 前置条件 下载 KEPServer V6 测试 参考连接有地址&#xff0c;这里摘抄下 项目使用KEPServer V6&#xff08;427M&#xff0c;中文&#xff09;&#xff1a;百度网盘 &#xff0c;密码: ykj2软件操作 下载…

聊聊Systemverilog中的function in constraints

有些情况下&#xff0c;constraint不能简单用一行来表达&#xff0c;而是需要复杂的计算&#xff0c;如果都写到constraint block内部就比较复杂&#xff0c;而且很乱&#xff0c;这时候可以调用functions来约束随机变量。在constraint内调用function就称为”function in const…

【剑指offer刷题记录 java版】数组双指针 之 滑动窗口

本系列文章记录labuladong的算法小抄中剑指offer题目 【剑指offer刷题记录 java版】数组双指针 之 滑动窗口 剑指 Offer 48. 最长不含重复字符的子字符串剑指 Offer II 014. 字符串中的变位词剑指 Offer II 015. 字符串中的所有变位词剑指 Offer II 016. 不含重复字符的最长子字…

应用程序监控

什么是应用程序监控 应用程序监控是一项基本功能&#xff0c;可以实时分析关键业务应用程序的前端和后端性能。应用程序监控通过提供有关应用程序可用性、性能和最终用户体验的宝贵见解&#xff0c;在确保应用程序不间断运行方面发挥着至关重要的作用。主动监控应用程序有助于…

Spark SQL数据源的基本操作

文章目录 一、基本操作二、默认数据源&#xff08;一&#xff09;默认数据源Parquet&#xff08;二&#xff09;案例演示读取Parquet文件1、在Spark Shell中演示练习1、将student.txt文件转换成student.parquet练习2、读取student.parquet文件得到学生数据帧&#xff0c;并显示…

MQ消息传递方式

发布订阅模式 发布订阅模式有点类似于我们日常生活中订阅报纸。每年到年尾的时候&#xff0c;邮局就会发一本报纸集合让我们来选择订阅哪一个。在这个表里头列了所有出版发行的报纸&#xff0c;那么对于我们每一个订阅者来说&#xff0c;我们可以选择一份或者多份报纸。比如北…

ESP32(MicroPython) 矩阵键盘电子琴+RGB灯

本程序相比上一个矩阵键盘电子琴程序增加了一个矩阵键盘&#xff0c;并把三个矩阵键盘的同一行相连&#xff0c;扫描周期缩短到40ms。增加RGB灯带&#xff0c;每个周期刷新一个灯&#xff08;随机颜色&#xff09;。 代码如下 #导入Pin模块 from machine import Pin import t…

Django rest framework基本知识

使用pycharm生成Django项目后&#xff0c;会生成工程目录和app目录 工程目录下5个文件&#xff0c;settings.py是全局配置相关的 urls.py是路有相关的 app相关的目录 models.py 数据库ORM对应的模型类 serializers.py 序列化与反序列化处理 views.py 根据request进行…

线性神经网络

线性神经网络 我们应该从线性神经网络开始&#xff0c;去逐步了解深度神经网络&#xff08;深度学习&#xff09;的各种复杂结构和底层原理。 1. 线性回归 用一个线性的模型来拟合数据与它们的标签之间的映射&#xff0c;用于回归问题。 1.1 构造线性模型&#xff1a; y ω…

Fiddler Orchestra用户指南:打造高效协同调试利器

引言&#xff1a;今天Fiddler更新到5.0版本后&#xff0c;小酋不经意间晃到了“Fiddler Orchestra”选项卡。爱折腾的小酋赶紧链接到官方用户指南一睹为快&#xff0c;看看这是什么东西&#xff0c;实现了什么新功能。下面是小酋看后做的一个翻译抢先版。 这是了解和设置Fiddl…

i5 3470+XSB75M-PK+HD 7750安装黑苹果macOS Big Sur 11.7.7

我本次使用的是 HD 7750 进行安装黑苹果&#xff08;闲鱼80元买的&#xff09;&#xff0c;这款显卡直接就是免驱&#xff0c;最高可以安装的版本是 macOS Monterey &#xff0c;但是建议安装至 macOS Big Sur 以获得较好的体验。 EFI&#xff08;OC引导&#xff09; EFI.zip …

RabbitMQ高阶使用队列实现

目录 1 从打车开始说起1.1 需要解决的问题1.1.1 打车排队 2 排队人数2.1 需求2.1.1 需求分析 2.2 实现方案2.2.1 MySQL2.2.1.1 入队2.2.1.2 获取进度2.2.1.3 遇到问题 2.2.3 Redis Zset 2.3 排队人数架构介绍2.4 数据结构2.4.2 zset结构2.4.1 雪花算法 2.5 功能实现2.5.1 派单2…

Java 实现反转一个链表

文章目录 思路核心四步骤循环移动代码实现 思路 翻转指的是改变链表中结点的指向&#xff0c;而不是将它的数据反转。 上图展示出的就是一个反转前的链表&#xff0c;下图展示一个反转后的链表。 根据上图可以看出&#xff0c;结点的地址和数据都没有改变&#xff0c;改变的…

Java SSM框架基础面试题

一、Spring面试题 1、Spring 在ssm中起什么作用&#xff1f; Spring&#xff1a;轻量级框架作用&#xff1a;Bean工厂&#xff0c;用来管理Bean的生命周期和框架集成。两大核心&#xff1a; 1、IOC/DI(控制反转/依赖注入) &#xff1a;把dao依赖注入到service层&#xff0c;s…

Java SSM框架面试题

sql 中 ${} 和 #{}的区别&#xff1a; #将传入的参数都当成一个字符串&#xff0c;会对自动传入的数据加一个双引号。如&#xff1a;order by #{age}&#xff0c;如果传入的值是18,那么解析成sql时的值为order by “18”, 如果传入 age ,则会解析为 order by “age”将传入的参…