java抽象方法和抽象类
1、抽象方法
如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆盖它,那么,可以把父类的方法声明为抽象方法。
class Person { // 定义抽象方法public abstract void run();
}
把一个方法声明为abstract,表示它是一个抽象方法,本身没有实现任何方法语句。因为这个抽象方法本身是无法执行的,所以Person类无法被实例化。并且编译器会报错无法编译Person类,因为它包含抽象方法。
必须把Person类本身也声明为abstract,才能正确编译它,如:
// 抽象方法必须定义在抽象类中abstract class Person {public abstract void run(); }
2、抽象类
如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。因为无法执行抽象方法,因此这个类也必须申明为抽象类(abstract class)。
使用abstract修饰的类就是抽象类,抽象类无法实例化。
// 编译报错,Person不能被实例化
Person p = new Person();
抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。抽象方法实际上相当于定义了"规范"。
abstract class Person { // 定义抽象类Personpublic abstract void run(); // 抽象方法run()
}class Student extends Person { // 继承抽象类Person@Overridepublic void run() { // 必须覆写父类run()方法,否则会报错System.out.println("Student.run");}
}Student p = new Student();
p.run(); // 运行结果:Student.run
3、面向抽象编程
定义了抽象类Person,以及具体的Student子类的时候,可以通过抽象类Person类型去引用具体的子类实例。
这种引用抽象类的好处在于,对其进行方法调用,并不关心Person类型变量的具体子类型。
// Person类型的引用变量s指向Student实例。
Person s = new Student();
s.run();
这种尽量引用高层类型,避免引用实际子类型的方式,称之为面向抽象编程。
面向抽象编程本质:
(1)上层代码只定义规范
(2)不需要子类就可以实现业务逻辑
(3)具体的业务逻辑由不同的子类实现,调用者并不关心
4、总结
通过abstract定义的方法是抽象方法,它只定义没有实现。抽象方法定义了子类必须实现的接口规范。
定义了抽象方法的class必须被定义为抽象方法,从抽象类继承的子类必须实现抽象方法。
如果不实现抽象方法,则该子类仍是一个抽象类。
面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。
相关文章:
java抽象方法和抽象类
1、抽象方法 如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆盖它,那么,可以把父类的方法声明为抽象方法。 class Person { // 定义抽象方法public abstract void run(); } 把一个方法声明为a…...
echarts鼠标向右/向左绘制实现放大/还原
echarts toolbox 的datazoom提供了绘制放大的功能,但通过鼠标绘制只能进行放大 应需求放大与还原都通过鼠标行为实现,增加从右往左绘制时还原放大结果 demo 结果 重写datazoom的原型方法实现绘制事件的拦截 const comp myChart._model.getComponent(to…...
Go编译DLL与SO
1. 简介 将Go编译成DLL/SO供其他语言调用。 .DLL:文件是 Windows 操作系统的动态链接库文件。.SO 文件是 Unix、Linux 和其他类 Unix 系统的共享库文件。 2. Go编译DLL/SO 注意 export后面导出的方法名一定要大写。 package main/* #include <stdlib.h>…...
css浮动
标准流:也叫文档流,指的是标签在页面中默认的排布规则。 浮动:让块级元素水平排列(float:left/right;)。 特点:浮动后的盒子顶对齐; 浮动后的盒子具备行内块的特点; 浮动后的元素脱…...
小程序怎么开发?怎么开发自己的小程序
一、明确需求与定位 在开发小程序之前,需要明确需求. 首先,明确小程序的定位非常重要。我们需要确定小程序是为了提供便捷的购物体验还是特定领域的服务。明确定位可以帮助我们更好地设计和优化小程序的功能,以符合用户的期望和需求。 其次…...
Unity(第十八部)物理力学,碰撞,触发、关节和材质
1、重力 刚体组件 英文中文描述RigidBody刚体组件physics->rigidbody ,刚体组件使一个物体有了质量,重力等。,use gravity 勾选后,物体才会受到重力,会自动下落,取消勾选就不会。,…...
内网搭建mysql8.0并搭建主从复制详细教程!!!
一、安装mysql 1.1 mysql下载链接: https://downloads.mysql.com/archives/community/ 1.2 解压包并创建相应的数据目录 tar -xvf mysql-8.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local cd /usr/local/ mv mysql-8.2.0-linux-glibc2.28-x86_64/ mysql mkdir…...
MYSQL 解释器小记
解释器的结果通常通过上述表格展示: 1. select_type 表示查询的类型 simple: 表示简单的选择查询,没有子查询或连接操作 primary:表示主查询,通常是最外层的查询 subquery :表示子查询,在主查询中嵌套的查询 derived: 表示派…...
具身智能计算系统,机器人时代的 Android | 新程序员
【导读】具身智能作为一种新兴的研究视角和方法论,正在刷新我们对智能本质及其发展的理解:传统的 AI 模型往往将智能视为一种独立于实体存在的抽象能力,而具身智能则主张智能是实体与其环境持续互动的结果。 本文深度剖析了具身智能计算系统…...
win11开启IPV6并手动设置地址
win11开启IPV6并手动设置地址 ipv6手动设置 假设你想要配置的IPv6地址是2001:0db8:85a3:0000:0000:8a2e:0370:7334,子网前缀长度为64位,并且默认网关是2001:0db8:85a3::1。 手动配置IPv6地址的示例步骤(Windows操作系统)&#x…...
WPF中如何设置自定义控件
1.圆角按钮的设置: 众所周知在WPF中自带有提示信息,当我问创建Button时,点击空格出现如下可选设置 带有小扳手🔧图标为相应的属性,如果Button有CornerRadius(角半径)属性就能够直接设置Button实…...
【Leetcode每日一题】二分查找 - 寻找旋转排序数组中的最小值(难度⭐⭐)(22)
1. 题目解析 Leetcode链接:153. 寻找旋转排序数组中的最小值 这个题目乍一看很长很复杂,又是旋转数组又是最小值的 但是仔细想想,结合题目给的示例,不难看出可以用二分的方法来解决 核心在于找到给定数组里面的最小值 2. 算法原…...
QT C++实战:实现用户登录页面及多个界面跳转
主要思路 一个登录界面,以管理员Or普通用户登录管理员:一个管理员的操作界面,可以把数据录入到数据库中。有返回登陆按钮,可以选择重新登陆(管理员Or普通用户普通用户:一个主界面,负责展示视频…...
我的世界游戏服务器平台推荐哪里找?
我的世界服务器可以在多个平台上租赁,以下是一些推荐的游戏服务器平台。 1.玩家可以通过互联网上的一些平台租用游戏服务器。其中,国内大厂平台有阿里云、腾讯云、华为云等。这些平台提供了丰富的服务器配置和带宽选择,玩家可以根据自己的需求…...
用于制作耳机壳的倒模专用UV树脂有什么特点?
制作耳机壳的UV树脂耳机壳UV胶具有以下特点: 快速固化:UV树脂可以在紫外线的照射下迅速固化,大大缩短了制作时间。高硬度与高耐磨性:UV树脂具有较高的硬度和耐磨性,能够提供良好的保护效果。透明度高:UV树…...
将c、c++变为python
1.编写cpp文件 #include "pycpp.h" #include <iostream>using namespace std;PyCpp::PyCpp(){}void PyCpp::sayHello(int a){cout << "Hello Python, I am C."<<a << endl; }2.编写头文件(声明变量) clas…...
golang学习7,glang的web的restful接口结构体传参
接口: //POST请求 返回json 接口传参json r.POST("/postJson", controller.PostUserInfo) 1.定义结构体 //定义结构体 type Search struct {Id intName string }2.结构体传参 //结构体传参 func PostUserInfo(c *gin.Context) {search : &Searc…...
python模型训练
目录 1、新建模型 train_model.py 2、运行模型 (1)首先会下载data文件库 (2)完成之后会开始训练模型(10次) 3、 训练好之后,进入命令集 4、输入命令:python -m tensorboard.ma…...
逆向案例三:动态xhr包中AES解密的一般步骤,以精灵数据为例
补充知识:进行AES解密需要知道四个关键字,即密钥key,向量iv,模式mode,填充方式pad 一般网页AES都是16位的,m3u8视频加密一般是AES-128格式 网页链接:https://www.jinglingshuju.com/articles 进行抓包结果返回的是密文: 一般思…...
超越CPU和GPU:引领AI进化的LPU
什么是CPU CPU(Central Processing Unit)是由数十亿个晶体管构成的,可以拥有多个处理核心,通常被称为计算机的“大脑”。它对所有现代计算系统至关重要,因为它执行计算机和操作系统所需的命令和进程。CPU在决定程序运…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
