java【抽象类与接口】

news/2024/5/20 5:11:23/文章来源:https://blog.csdn.net/qq_43475751/article/details/131189901

抽象类与接口

  • 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.luyixian.cn/news_show_506539.aspx

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

相关文章

OpenCV 笔记_5

文章目录 笔记_5特征点匹配DMatch 存放匹配结果DescriptorMatcher::match 特征点描述子&#xff08;一对一&#xff09;匹配DescriptorMatcher::knnMatch 特征点描述子&#xff08;一对多&#xff09;匹配DescriptorMatcher::radiusMatch 特征点描述子&#xff08;一对多&#…

C语言之指针详解(8)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 指针和数组笔试题解析 #include<stdio.h> int main() {//一维数组int a[] { 1,2,…

flv 报错 Unsupported codec in video frame: 12

视频播放器播放 flv 报错 [TransmuxingController] > DemuxException: type CodecUnsupported, info Flv: Unsupported codec in video frame: 12 原因 主要是因为我们的播放器不支持 H.265 视频编码&#xff1b; 解决办法 方法一&#xff1a;将设备端的视频编码改为 …

瑞萨RA系列mcu学习笔记--RTT-pwm驱动

方案1&#xff1a;Studio 2.2.6和使用了RASC3.5下使用pwm驱动 开发环境必须说一下&#xff0c;本人在在开发环境的问题上栽了一个跟头&#xff0c; 使用最新版的RTT Studio 2.2.6和使用了RASC4.0的版本生成的公共编译ok&#xff0c;但是一下载到mcu就直接不能运行&#xff1a…

记录一下RocketMQ中遇见的 连环大坑!!!差点没把我摔死

目录 环境&#xff1a;Win10 &#xff0c; 不是 linux 首先我遇见的第一个问题是&#xff1a; No route info of this topic 问题原因&#xff1a; PS&#xff1a; 64位系统环境下&#xff0c;如果软件在安装时安装路径默认c:\progarmfiles即为64位&#xff0c;默认c:\pr…

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

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第三题-火车调度 在线评测链接:P1288 题目描述 塔子哥是一位火车车厢调度员。 这一天&#xff0c;一列带有 n 个编号车厢的列车进站了&#xff0c;编号为 1\rightarrow …

kafka 报错 - Cannot assign requested address

背景 在华为云服务器上跑了 zookeeper 和 kafka 的 broker&#xff0c;想内外网分流&#xff0c;重点就是做不到从外网去消费&#xff0c;比如用自己的 windows 笔记本去消费。 配置 server.properties 的 listener 为 broker 所在机子的的内网 IP 后&#xff0c;终于能 star…

ECC算法学习(一)算法公式

ECC 一、ECC简介优缺点运用 二、算法理论基础1. 椭圆曲线的加法2. 椭圆曲线的二倍运算3. 同余运算4. 有限域5. 乘法逆元 三、算法公式1、有限域的负元2、有限域的加法&#xff0c; P Q P Q PQ3. 斜率计算&#xff08;PQ即要计算P点切线&#xff0c;需要求导&#xff09;4. 椭…

【位图布隆过滤器海量数据面试题】

文章目录 1 位图2 布隆过滤器 1 位图 首先我们来看看一个腾讯的面试题&#xff1a;给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。 分析&#xff1a; 40亿个不重复整形数据&#xff0c;大概有160亿字节…

Axios和Spring MVC[前端和后端的请求和响应处理]

在前后端交互中&#xff0c;Axios和Spring MVC扮演着不同的角色&#xff0c;分别负责前端和后端的请求和响应处理。它们之间的作用如下&#xff1a; Axios&#xff08;前端&#xff09;&#xff1a; 发送HTTP请求&#xff1a;前端使用Axios库发送HTTP请求到后端。可以使用Axi…

机器学习实践(1.1)XGBoost分类任务

前言 XGBoost属于Boosting集成学习模型&#xff0c;由华盛顿大学陈天齐博士提出&#xff0c;因在机器学习挑战赛中大放异彩而被业界所熟知。相比越来越流行的深度神经网络&#xff0c;XGBoost能更好的处理表格数据&#xff0c;并具有更强的可解释性&#xff0c;还具有易于调参…

hard fault on thread: mqtt0解决办法

rt thread版本4.1.0 使用paho mqtt软件包 运行一段时间后出现 psr: 0x21000000 r00: 0x5036fc8f r01: 0x5036fc88 r02: 0x00000000 r03: 0x5036fc8f r04: 0x00000007 r05: 0x00000063 r06: 0x00005f70 r07: 0x2001f1d8 r08: 0xdeadbeef r09: 0xdeadbeef r10: 0xdeadbeef r11…

关于Java SSM框架的面试题

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

28.vite

目录 1 一些概念 1.1 单页面应用程序SPA 1.2 vite 2 初始化vite项目 3 项目中的文件 1 一些概念 1.1 单页面应用程序SPA 单页面应用程序是只有一个页面的前端&#xff0c;切换页面通过前端路由来切换 特点如下 实现了前后端分离&#xff0c;后端仅出接口&#…

动态规划III (买股票-121、122、123、188、309)

CP121 买股票的最佳时机 题目描述&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利…

YOLOv5-7.0添加解耦头

Decoupled Head Decoupled Head是由YOLOX提出的用来替代YOLO Head&#xff0c;可以用来提升目标检测的精度。那么为什么解耦头可以提升检测效果呢&#xff1f; 在阅读YOLOX论文时&#xff0c;找到了两篇引用的论文&#xff0c;并加以阅读。 第一篇文献是Song等人在CVPR2020发表…

【59天|503.下一个更大元素II ● 42. 接雨水】

503.下一个更大元素II class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {stack<int> st;int n nums.size();vector<int> res (n, -1);for(int i0; i<2*n;i){while(!st.empty()&&nums[i%n]>nums[st.t…

随机的乐趣和游戏

1、猜数字游戏 #GuessingGame.py import random the_number random.randint(1, 10) print("计算机已经在1到10之间随机生成了一个数字&#xff0c;") guess int(input("请你猜猜是哪一个数字: ")) while guess ! the_number:if guess > the_number:p…

PHP设计模式21-工厂模式的讲解及应用

文章目录 前言基础知识简单工厂模式工厂方法模式抽象工厂模式 详解工厂模式普通的实现更加优雅的实现 总结 前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 学会好设计模式&#xff0c;能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的非常…

淘宝详情页分发推荐算法总结:用户即时兴趣强化

转子&#xff1a;https://juejin.cn/post/6992169847207493639 商品详情页是手淘内流量最大的模块之一&#xff0c;它加载了数十亿级商品的详细信息&#xff0c;是用户整个决策过程必不可少的一环。这个区块不仅要承接用户对当前商品充分感知的诉求&#xff0c;同时也要能肩负起…