抽象类、接口、枚举
一、抽象类
1.1 简介
作为父类,里面的方法逻辑不能满足任何一个子类的需求,提供的逻辑根本就用不上,那么就不添加方法体了,此时这个方法需要 使用关键字abstract来修饰,表示为抽象方法,而抽象方法所在的类也必须使用抽象abstract来修饰,这个类就是抽象类。
1.2 抽象类的特点
1)由abstract修饰的方法为抽象方法,抽象方法没有方法体,需要使用分号结尾
2)若类中包含抽象方法,那么该类必须使用关键字abstract声明成抽象类,final不能修饰抽象类
3)抽象类里,可以没有抽象方法
4)抽象类里可以提供构造器,但是不能实例化,没有意义。
5)一个类继承了抽象类,那么必须重写里面的所有抽象方法,除非该子类也声明为抽象类。
public abstract class Student extends Person {//抽象类public static void main(String[] args) {Student s = new Student("小花", 18, 100) ;//抽象类不能实例化对象s.setAge(20);s.setName("小红");System.out.println(s.getAge());System.out.println(s.getName()); }
1.3 抽象类的意义
1) 为其子类提供一个公共的父类型
2) 封装子类中重复的内容,如成员变量和方法
3) 定义抽象方法,子类虽然有不同的实现逻辑,但该方法的定义却是一致的。
//一个抽象的Person类 public abstract class Person {private String name;//私有的成员变量nameprivate int age;//私有的成员变量agepublic abstract void sleep();//一个抽象方法Person(){}Person(String name,int age){//实参构造器,用来初始化this.name=name;this.age=age;}public void setName(String name){//公有的set方法this.name=name;}public String getName(){//公有的get方法return name;}public void setAge(int age){this.age=age;}public int getAge(){return age;} }//Student类继承了抽象的Person类 public class Student extends Person {private int score;//自己私有的成员变量scoreStudent() {}Student(String name, int age, int score) {//在构造器中初始化super(name, age);this.score = score;}@Override//重写了抽象父类中的方法public void sleep() {System.out.println("学生睡觉");}public static void main(String[] args) {Student s = new Student("小花", 18, 100) ;//创建了一个对象s,初始化name为小花,age为18,score为100s.setAge(20);//调用了set方法,给age重新赋值s.setName("小红");//调用了set方法,给name重新赋值s.sleep();System.out.println(s.getAge());System.out.println(s.getName());} }
二、接口
有的时候,我们需要从几个不相关的类中派生出一个子类,继承他们的所有成员变量和方法,但是java不支持多继承。此时,我们可以使用接口,来达到多继承的效果
2.1 接口特点
-
使用interface进行定义
-
可以提供成员变量,默认提供public static final进行修饰
-
可以提供成员方法,默认使用public abtract进行修饰
-
接口中不能存在构造器,接口不能实例化,没有任何意义
2.2 实现接口
1) 与继承不同,一个类可以实现多个接口。接口间使用逗号分开。
2) 使用关键字implements进行实现,必须实现接口中的所有抽象方法
3) 若一个类中没有全部实现接口中的抽象方法,那么该类需要使用abstract声明成抽象类
2.3 接口之间的继承
1)接口之间可以存在继承关系,即一个接口通过关键字extends可以继承另一个接口。
2)子接口继承了父接口中的所有抽象方法
练习:
1. USB接口: 充电功能 charge(); 获取信息 getInfo()
2. Computer类型: 属性:两个USB接口: usb1,usb2 ; 方法:两个属性的set方法
3. KeyBoard键盘类: 实现USB接口
4. Mouse鼠标类: 实现USB接口
5. Program测试类:
interface USB {void charge();String getInfo(); }public class Computer {private USB usb1;private USB usb2;public void setUsb1(USB usb1) {this.usb1 = usb1;}public void setUsb2(USB usb2) {this.usb2 = usb2;}public String getUsb1() {return usb1.getInfo();}public String getUsb2() {return usb2.getInfo();} }class Keyboard implements USB{@Overridepublic void charge(){System.out.println("键盘输入");}@Overridepublic String getInfo(){return "键盘";}}class Mouse implements USB{@Overridepublic void charge(){System.out.println("鼠标点击");}@Overridepublic String getInfo(){return "鼠标";}}class Program{public static void main(String[] args) {Computer computer = new Computer();Keyboard keyboard = new Keyboard();Mouse mouse = new Mouse();computer.setUsb1(keyboard);computer.setUsb2(mouse);System.out.println(computer.getUsb1());System.out.println(computer.getUsb2());keyboard.charge();mouse.charge();}}
三、枚举
3.1 简介
在Java中,枚举是一种特殊的引用数据类型,是一个被命名的整型常数的集合,用于声明一组带标识符的常数,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。
主要用途是:将一组常量,也可以说成是一组离散值组织起来。
3.2 定义
1. 如果不想做其他描述, 直接添加枚举的对象,即属性,也就是散列值。
2. 如果想要添加一些描述,提供私有构造器,构造器的形参根据需求而定
注意:一旦添加了形参,那么在提供对象时,必须在对象后添加(有参传参)来表示调用构造器
3. 调用枚举时,格式: 枚举类的名字.值。
4. 如果想要显示描述信息,可以提供描述属性的get方法 或者重写toString方法
public enum Week {周一, 周二, 周三, 周四, 周五, 周六, 周日;public static void main(String[] args) {//获取季节这个枚举中的一个值Season a = Season.AUTUMN;System.out.println(a);} }enum Season{SPRING("春天"),SUMMER("夏天"),AUTUMN("秋天"),WINTER("冬天");private String describe;private Season(String describe){this.describe =describe;}}
相关文章:
抽象类、接口、枚举
一、抽象类 1.1 简介 作为父类,里面的方法逻辑不能满足任何一个子类的需求,提供的逻辑根本就用不上,那么就不添加方法体了,此时这个方法需要 使用关键字abstract来修饰,表示为抽象方法,而抽象方法所在的类…...
GO系列-IO 文件操作
os io 判断文件是否存在 func fileExist(filePath string) (bool, error) {_, err : os.Stat(filePath)if err nil {return true, nil}if os.IsNotExist(err) {return false, nil}return false, &CheckFileExistError{filePath} } 读取文件内容 func readFileContext(…...
【前端】使用WebStorm创建第一个项目
文章目录 前言一、步骤1、启动2、创建项目3、配置Node.js4、运行项目 二、Node.js介绍 前言 根据前面文章中记录的步骤,已经安装好了WebStorm开发软件,接下来我们就用这个IDE开发软件创建第一个项目。 一、步骤 1、启动 启动软件。 2、创建项目 新建…...
自定义类型:结构体,枚举,联合
结构体 结构体的基本声明 基础知识:结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。 //学生 struct Stu {//学生的相关信息char name[20];int age; }s1,s2; //s1,s2是直接创建的结构体变量(全局变…...
柠檬水找零(力扣860)
这道题的贪心很简单,就是体现在对于20元的找零上。根据题意,20元有两种找零方式:1.找一张5元和一张10元;2.找3张5元。但是5元比较万能,因为无论是10还是20都需要用5元来找零,所以我们优先考虑第一种找零方式…...
sprintf和sscanf的用法和区别
sprintf和sscanf是C语言中常用的字符串处理函数,它们各自有不同的用途和用法。 1、sprintf的用法 sprintf函数主要用于将数据格式化为字符串并存储在指定的缓冲区中。其函数原型为: int sprintf(char *str, const char *format, ...); str:…...
deepseek自动化代码生成
使用流程 效果第一步:注册生成各种大模型的API第二步:注册成功后生成API第三步:下载vscode在vscode中下载agent,这里推荐使用cline 第四步:安装完成后,设置模型信息第一步选择API provider: Ope…...
静态时序分析:时钟组间的逻辑独立、物理独立和异步的区别
相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 当设计中存在多个时钟(同步或异步)时,该如何使用SDC命令约束设计呢?本文就将对此进行讨论。 逻辑独立 例1 多个时钟完全逻辑独立 图1 逻辑…...
深入HBase——数据结构与算法
引入 通过前面的文章,我们对HBase已经有了基本认识,下面我们从HBase最核心的算法和数据结构进一步深入HBase。 HBase的一个列簇(Column Family)本质上就是一棵LSM树(Log-Structured Merge-Tree)。LSM树…...
学习Linux准备2
使用win10系统带的wsl配置ubuntu系统,通过wsl功能我们可以更简单更轻松的获得Linux系统环境。 首先开启Windows自带的wsl功能 打开控制面板,选中启用或关闭Windows功能 这里我们点击进入 将上图红√点击上,点击确定,然后重新启动…...
MATLAB图像处理:图像分割方法
图像分割将图像划分为具有特定意义的子区域,是目标检测、医学影像分析、自动驾驶等领域的核心预处理步骤。本文讲解阈值分割、边缘检测、区域生长、聚类分割、基于图的方法等经典与前沿技术,提供MATLAB代码实现。 目录 1. 图像分割基础 2. 经典分割方…...
什么是“可迭代”
在 Python 中,“可迭代”(Iterable)是一个非常重要的概念,它指的是任何可以被逐个访问其元素的对象。换句话说,如果一个对象支持迭代操作(比如可以通过 for 循环逐个访问其元素),那么…...
使用Ubuntu搭建Java部署环境
White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🐹今日诗词:小舟从此逝,江海寄余生🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏 ⛳️点赞 ☀️收藏⭐️关注💬卑微小…...
Linux 文件的三个时间:Access、Modify 和 Change
目录 一、文件的三个时间戳 1. 访问时间(Access Time) 2. 修改时间(Modify Time) 3. 更改时间(Change Time) 二、如何查看文件的三个时间戳 三、文件时间戳的变化规则 1. 修改文件内容 2. 修改文件…...
移植live555 上的 rtsp
一、V4L2视频采集模块(完整示例) #include <linux/videodev2.h> #include <sys/ioctl.h> #include <fcntl.h>// 初始化V4L2摄像头 int init_v4l2_camera(const char* dev_path, int width, int height) {int fd open(dev_path, O_RD…...
基于SpringBoot的“宠物救助及领养平台”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“宠物救助及领养平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 系统首页界面 系统注册页面…...
Gemini 2.0助力科学突破,AI联合科学家系统登场
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
electron提升软件运行权限,以管理员权限运行
大家有任何想法,都可以联系博主沟通。 本系列为实战文章,最终实现的桌面工具软件,获取方式:百度网盘地址:https://pan.baidu.com/s/1yrl0jYpti7QCn8CHBRT2lw?pwd1234 正文开始 前言一、提升electron运行权限的三种方…...
Docker 容器调试技巧
在开发和运维过程中,调试 Docker 容器中的应用或服务是一个常见且重要的任务。由于容器是相互隔离的,容器内部的日志和错误信息可能不像传统的服务器那样直观,因此掌握 Docker 容器调试技巧对于快速定位和解决问题至关重要。 本文将介绍一些…...
TSMaster【第七篇:千机百变——面板设计艺术】
武侠场景导入:唐门暗器阁的启示 江湖传言,唐门暗器之所以独步天下,全凭其「千机匣」中七十二种机关变化。TSMaster面板设计恰似打造暗器机关——控件如同飞镖、机簧、毒针,组合方式不同则威力迥异。昔日某新势力车型因仪表盘刷新…...
ctfshow——robots后台泄露
题目提示:总有人把后台地址写入robots,帮黑阔大佬们引路 题目如上图所示 根据提示,我们可以在URL上查看是否存在robots文件 打开后发现其中的内容如上图所示,存在一个flagishere.txt文件,我们可以继续在URL上进行操作…...
普通人怎样用好Deepseek?
第一章:准备篇(30分钟上手) DeepSeek 是一款功能强大的数据处理和分析工具,广泛应用于数据挖掘、机器学习、商业智能等领域。 本文将通过图文结合的方式,详细介绍 DeepSeek 的安装、配置、基本使用、高级功能以及实用…...
负载均衡集群( LVS 相关原理与集群构建 )
目录 1、LVS 相关原理 1.1、LVS集群的体系结构以及特点 1.1.1 LVS简介 1.1.2 LVS体系结构 1.1.3 LVS相关术语 1.1.4 LVS工作模式 1.1.5 LVS调度算法 1.2 LVS-DR集群介绍 1.2.1 LVS-DR模式工作原理 1.2.2 LVS-DR模式应用特点 1.2.3 LVS-DR模式ARP抑制 1.3 LVS – NA…...
前端面试-JavaScript 数据类型检测全解
目录 一、基础检测方法 二、方法深度解析 1. typeof 运算符 2. instanceof 运算符 3. 终极检测方案 三、特殊场景检测方案 四、手写实现原理 1. 通用类型检测函数 2. 改进版数组检测(兼容旧浏览器) 五、常见面试陷阱 六、最佳实践指南 七、扩…...
百度百舸 DeepSeek 一体机发布,支持昆仑芯 P800 单机 8 卡满血版开箱即用
在私有云环境中成功部署 DeepSeek 满血版并实现性能调优,并不是一件容易的事情。选择合适的 GPU 配置、安装相应的环境、成功部署上线业务、加速推理任务加速、支撑多用户并发 …… 完成业务测试,成功融入生产业务中。 为了帮助企业快速实现 DeepSeek 服…...
微软CEO-纳德拉访谈-AGI计划
在与知名科技播客主播 Dwarkesh Patel 的深度访谈中,微软 CEO 萨提亚・纳德拉围绕 AI、量子计算、微软发展等多方面分享深刻见解,下面是针对访谈内容的介绍,其中还是有很多值得我们学习的地方。 1 AI 领域见解 影响力评估:纳德拉直言行业所标榜的 AGI 里程碑是 “无意义的基…...
Web自动化中Selenium下Chrome与Edge的Webdriver常用Options参数
目录 引言 说明 Add_argument() 添加方式 常用参数 Add_experimental_option() 添加方式 常用方法 任务结束后仍然保持浏览器打开 禁用“Chrome 正受到自动测试软件的控制”提示 设置下载路径 禁用弹窗拦截 禁用图片加载 禁用 JavaScript 注意 引言 …...
1.4 嵌入式系统的软件
嵌入式系统的开发流程中,硬件和固件设计完成后,嵌入式软件承担起实现功能、用户交互、系统集成和性能优化等任务;嵌入式系统软件分为设备驱动、操作系统和应用程序三个层面。 因此嵌入式系统软件开发工程师通常分为三类:嵌入式系统…...
深蓝学院自主泊车第3次作业-IPM
目录 1 题目介绍2 求解 1 题目介绍 已知鱼眼相机的参数, image_width,表示图像的宽度image_height,表示图像的高度 ξ \xi ξ,表示鱼眼相机参数 k 1 k_1 k1、 k 2 k_2 k2,表示径向相机参数 p 1 p_1 p1、 p 2 p…...
Confluence 8.5.18 - windows 安装部署详解
本文我们所讲述的是Confluence - 8.5.18 -windows版本版本的详细安装破解步骤,与Confluence - 8.0.0之前的版本不同的是,部分文件名称发生了变化,以前的破解方式已不适用。 1.首先我们先准备安装所需要的文件 atlassian-confluence-8.5.18-x64.exemysql-connector-java-8.0…...
深入解析过滤器模式:数据筛选与处理的高效工具
过滤器模式:数据筛选与处理的高效工具 在软件开发的复杂领域中,数据的筛选与处理是常见的任务。过滤器模式作为一种实用的设计模式,为解决这类问题提供了有效的解决方案。它允许开发者根据不同的标准对一组对象进行过滤操作,从而…...
linux常用基础命令_最新版
常用命令 查看当前目录下个各个文件大小查看当前系统储存使用情况查看当前路径删除当前目录下所有包含".log"的文件linux开机启动jar更改自动配置文件后操作关闭自启动linux静默启动java服务查询端口被占用查看软件版本重启关机开机启动取别名清空当前行创建文件touc…...
曝光铁三角
一、曝光铁三角的关系解析 光圈(Aperture) 作用:控制光线进入相机的孔径大小,同时影响景深(画面清晰范围)。 数值规则:光圈值(如F/1.8、F/8)越小,孔径越大&am…...
reacct hook useState
useState useState 是一个 React Hook,允许函数组件在内部管理状态。 使用方法 let [str,setStr] useState(‘three’) useState接受的参数为初始值;返回一个数组 第一个元素:当前的状态值;第二个元素:一个更新该状…...
政安晨【零基础玩转各类开源AI项目】DeepSeek 多模态大模型Janus-Pro-7B,本地部署!支持图像识别和图像生成
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 目录 下载项目 创建虚拟环境 安装项目依赖 安装 Gradio(UI) 运…...
计算机毕业设计SpringBoot+Vue.js学生读书笔记共享(源码+LW文档+PPT+讲解+开题报告)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
QEMU源码全解析 —— 内存虚拟化(17)
接前一篇文章:QEMU源码全解析 —— 内存虚拟化(16) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《...
Maven 构建中的安全性与合规性检查
在现代软件开发中,确保应用程序的安全性和合规性至关重要。随着开源软件和第三方依赖的广泛使用,构建过程中对依赖的安全性和合规性检查变得尤为重要。通过 Maven 构建工具,我们可以集成多种安全性和合规性检查机制,帮助开发者检测…...
Deepseek R1 和其他的大模型 共同辅助决策交通出行方案
比一比各家大模型 问题描述一、Deepseek R1通勤方式评估报告(一)评分模型说明(二)各选项评分明细(三)加权总分计算(四)结论 二、文心一言通勤方式评估(一)时间…...
HTTPS 通信流程
HTTPS 通信流程时序图: #mermaid-svg-HWoTbFvfih6aYUu6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HWoTbFvfih6aYUu6 .error-icon{fill:#552222;}#mermaid-svg-HWoTbFvfih6aYUu6 .error-text{fill:#…...
C++——list模拟实现
目录 前言 一、list的结构 二、默认成员函数 构造函数 析构函数 clear 拷贝构造 赋值重载 swap 三、容量相关 empty size 四、数据访问 front/back 五、普通迭代器 begin/end 六、const迭代器 begin/end 七、插入数据 insert push_back push_front 八、…...
开发指南103-jpa的find**/get**全解
平台使用jpa来访问数据库。在dao层可以通过定义find**/get**函数,通过名字直接绑定数据库字段。find**和get**有一定区别: 1.get**方法查询不到数据抛出异常,find**方法查询不到数据则返回null。 2.get**是延迟加载,在真正访问返…...
初学者如何设置以及使用富文本编辑器[eclipse版]
手把手教你设置富文本编辑器 参考来源:UEditor Docs 初学者按我的步骤来就可以啦 一、设置ueditor编辑器 1.提取文件[文章最底部有链接提取方式] 2.解压文件并放到自己项目中,在WebContent目录下: 3. 修改jar包位置路径 到--> 注意&a…...
Flutter 启动优化
Dart VM在Flutter中的作用是什么?它负责执行Dart代码,无论是JIT还是AOT模式都需要它。在JIT模式下,VM随应用一起运行,而在AOT模式下,代码已经被编译成机器码,VM可能不需要运行时存在?不过实际上…...
Java Idea配置问题
在 cmd 里手动切换: set JAVA_HOMEC:\Program Files\Java\jdk1.8.0_192 set PATH%JAVA_HOME%\bin;%PATH%在Idea的终端查看: java -versionClass com.sun.tools.javac.tree.JCTree$JCImport does not have member field ‘com.sun.tools.javac.tre JDK 版本不匹配 …...
百度搜索,能否将DeepSeek变成“内功”?
最近,所有的云平台和主流APP都在努力接入DeepSeek。其中,搜索类APP与搜索引擎更是“战况激烈”。那么问题来了,接入DeepSeek已经变成了标准配置,到底应该如何做出差异化?接入DeepSeek这件事能不能实现11大于2的效果&am…...
【C++委托与事件】函数指针,回调机制,事件式编程与松耦合的设计模式(上)
前言 上一次发文章已经是在两个月前了hhh,期间也是忙忙碌碌做了不少事情也鸽了不少东西… 本文我们来讲讲博主最近在项目中频繁使用的,也就是广泛运用于C#或者Java的一个常用编程机制(思路)-----委托和事件。由于C在语言特性上没…...
【Java学习】抽象类与接口
面向对象系列四 一、抽象方法 二、抽象类 三、意义检查 1.抽象方法的意义 2.意义检查 体现 四、接口 1.级别层次 2.接口变量 3.意义 4.成员 成员变量: 成员方法: 一、抽象方法 没有方法体即没有任何实现的方法是抽象方法,只有在…...
体育电竞比分网开发流程
开发一个体育电竞比分网的流程可以分为以下几个主要步骤: 1. 需求分析 目标用户:确定网站的主要用户群体,如体育迷、电竞爱好者等。 功能需求:列出网站需要实现的功能,如实时比分更新、赛事日程、新闻资讯、用户评论…...
vue2和vue3的主要区别
Vue 2 和 Vue 3 之间有几个主要区别,涉及到性能、功能和架构上的改进。以下是一些核心的区别: Composition API(组合式 API): Vue 2 使用的是选项式 API(Options API),即通过 data, …...