java【抽象类与接口】

抽象类与接口

  • 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的反序列化
    经过序列化得到的新对象一定是深拷贝对象。

抽象类与接口的对比

在这里插入图片描述

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

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

相关文章

使用 MATLAB 进行气象激光雷达图像分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

STM32——01-开发软件Keil5及STM32CubeMX的安装

1.1开发环境的安装 编程语言&#xff1a;C语言 需要安装的软件有两个&#xff1a;Keil5和STM32CubeMX 安装 安装包&#xff08;不需要太新&#xff0c;以 MDK324 为例&#xff0c;最新的 MDK327 有问题&#xff09; 安装过程一路下一步即可&#xff08;建议不要安装在 C …

2023-06-09:什么是Redis事务?原理是什么?

2023-06-09&#xff1a;什么是Redis事务&#xff1f;原理是什么&#xff1f; 答案2023-06-09&#xff1a; Redis中的事务是以一组命令的形式出现的&#xff0c;这些命令被认为是最小的执行单位。事务可以保证在一个单独独立的隔离操作中执行所有命令&#xff0c;而且所有命令…

深度研究微软的资产负债表和财务状况以及未来投资价值

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 微软股票的关键指标 猛兽财经认为&#xff0c;微软公布的2023财年第三季度财务业绩&#xff0c;有三个关键指标值得投资者关注。 第一个关键指标是利息收入。微软的利息收入目前已经同比增长了44%&#xff0c;从2022财年第…

从搭建hadoop开始学习大数据中分而治之的MapReduce(伪集群模式)

环境准备 首先需要将如下四个必要的文件下载到计算机&#xff08;已经附上了下载地址&#xff0c;点击即可下载&#xff09;。 Vmware Workstation 17.x 【官方的下载地址】 CentOS-7-x86_64-Minimal-2009【阿里云镜像站下载地址】 openjdk-8u41-b04-linux-x64-14_jan_2020【开…

踏上极速向未来之旅!——2023年量化科技嘉年华·专场回顾

2023年6月2日—3日&#xff0c;“2023量化科技嘉年华”在上海世博中心召开&#xff0c;这场为期两天的量化科技盛会&#xff0c;多方位呈现了量化科技创新成果&#xff0c;吸引了众多关注。 在嘉年华的第二天&#xff0c;多场主题论坛同步进行。 由华锐技术主办的“极速向未来…

ChatGPT 4 的 6 个最佳使用场景

作者&#xff1a;SYDNEY BUTLER 译者&#xff1a;明明如月 无论是在 ChatGPT 中还是通过 API&#xff0c;对 OpenAI 的 GPT-4 模型的访问比 GPT-3.5 限制更多。这意味着你需要慎重考虑在何种情况下使用 GPT-4&#xff0c;并选择性地将最适合的任务交给它&#xff0c;以便让其发…

短视频seo源代码部署步骤

一、 部署短视频SEO矩阵系统源代码&#xff0c;您需要遵循以下步骤&#xff1a; 准备服务器环境 首先&#xff0c;您需要准备一个服务器环境来托管源代码。您可以选择云服务器&#xff08;例如AWS&#xff0c;阿里云等&#xff09;或自己的私人服务器。 安装所需软件 在服务器…

Hbase

Hbase 思考环节&#xff1a; 1.什么是hbase 1.1简介 HBase 是一个面向列式存储的分布式数据库&#xff0c;其设计思想来源于 Google 的 BigTable 论文。 HBase 底层存储基于 HDFS 实现&#xff0c;集群的管理基于 ZooKeeper 实现。 HBase 良好的分布式架构设计为海量数据的…

图神经网络 GNN 入门

参考链接 A Gentle Introduction to Graph Neural Networks (distill.pub) 零基础多图详解图神经网络&#xff08;GNN/GCN&#xff09;【论文精读】_哔哩哔哩_bilibili 目录 图的基本构成 图的表示方法 图的示例 图网络的基本任务 图网络的处理 影响图网络效果的超参数 …

快速创建Django项目

环境搭建 安装Django之前需要先安装python环境和pycharm。 目前 Django 1.6.x 以上版本已经完全兼容 Python 3.x。 python安装教程&#xff1a;https://blog.csdn.net/David_house/article/details/100110542 项目创建 打开pycharm&#xff0c;选择文件–>新建项目 创建D…

HUAWEI悦盒ec6108v9c 如何刷成海纳思系统(家用低功耗服务器,使用Home Assistant服务)

环境&#xff1a; 1.HW悦盒ec6108v9c一套 2.16G U盘 3.格式化软件USB_format.exe 4.固件 mv100-mdmo1g-usb-flash.zip&#xff08;底层是Ubuntu 20.04系统&#xff09; 5.十字螺丝刀 6.翘片/薄铲子 7.有线网络环境 8.镊子/回形针 问题描述&#xff1a; 最近玩智能家居…

【Linux】基本指令,拥抱Linux的第一步

[Linux]常见指令 Linux基本指令指令的本质ls指令pwd指令cd指令touch指令mkdir指令(重要)rmdir&&rm指令(重要)man指令&#xff08;重要&#xff09;cp指令&#xff08;重要&#xff09;mv指令&#xff08;重要&#xff09;重定向cat指令more指令less指令&#xff08;重要…

Android Retrofit 给你的接口加上缓存

转载请注明出处&#xff1a;https://blog.csdn.net/kong_gu_you_lan/article/details/131200501?spm1001.2014.3001.5501 本文出自 容华谢后的博客 往期回顾&#xff1a; Android Retrofit RxJava使用详解 Android 探讨一下Retrofit封装的最佳姿势 Android 谈谈我所理解的…

export 和 export default 的区别

一、铺垫 ES6模块化主要包含以下3种用法&#xff1a; ① 默认导出和默认导入---export default ② 按需导出和按需导入---export ③ 直接导入并执行模块中的代码 二、默认导出 语法&#xff1a;export default 需要共享的成员 创建一个共享的数据 order.js let name…

详解Eureka服务注册和调用

目录 1.概述 2.环境 2.1.项目结构 2.2.项目架构 2.3.依赖 3.注册中心 3.1.配置使用 3.2.管理页 3.3.集群 4.服务注册 5.服务调用 5.2.Ribbon 5.3.Feign 5.4.OpenFeign 1.概述 我们把从外部进入到微服务集群里的流量称为“南北流量”、微服务集群节点间流转的流量…

从零开发短视频电商 Jmeter插件安装和常用插件

Jmeter插件安装和常用插件 插件安装方式 一种是手动安装各种插件&#xff0c;下载对应的jar包&#xff0c;放到lib\ext目录下就可以使用了。另一种是通过漂亮的 UI &#xff0c;jmeter 插件管理器Plugins Manager可以方便的管理其他插件的下载和更新。安装一次插件管理器&…

数据库SQL查询(一)

本文介绍SQL查询&#xff0c;如何在海量数据中筛选想要数据&#xff1b; 数据库管理系统选择&#xff1a;关系型数据库mysql 数据库管理工具选择&#xff1a;navicat 本文中查询语句和查询案例参考自&#xff1a;https://edu.csdn.net/course/detail/27673?ops_request_mis…

面试专题:计算机网络常见面试点总结

socket、tcp、udp、http 的认识及区别 socket、tcp、udp、http 的认识及区别​ 一、先来一个讲TCP、UDP和HTTP关系的 1、TCP/IP是个协议组&#xff0c;可分为三个层次&#xff1a;网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传…

【Django 网页Web开发】24. 实战项目:moudleForm的文件上传应用到城市管理(17)(保姆级图文)

目录 用户上传文件存放media如何启用1. 在urls.py中进行配置&#xff1a;2. 在settings.py中进行配置&#xff1a;3. 能够通过media的url访问文件 moudleForm上传文件实现城市管理1. moudle.py2. url.py3. city.py4. city.html5. 文件上传小结6. 城市管理效果总结 欢迎关注 『D…