【JAVA学习笔记】40 - 抽象类、模版设计模式(抽象类的使用)
项目代码
https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/abstract_
一、抽象类的引入
很多时候在创建类的时候有一个父类,比如animal类,他的子类会有各种方法,为了复用需要进行方法的重写,比如子类Cat会eat(),所以不得已只能在animal类内也需要写eat()方法,但没有意义。
所以当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类。
abstract class Animal{// public void eat(){System.out.println("eat但不知道谁在吃");}//所以需要抽象方法//这里实现了eat(),但其实没有什么意义//即 父类方法不确定性的问题//===>考虑该方法设计为抽象(abstract)方法//==>所谓抽象方法就是没有实现的方法//===>所谓没有实现就是指,没有方法体abstract public void eat();//注意 当一个类中存在抽家方法时,需要将该类声明为abstract类//所以一般是子类来实现这个抽象方法的重写
}
class Cat extends Animal{public void eat(){System.out.println("小猫在吃....");}
}
二、抽象类的基本介绍
1)用abstract关键字来修饰个类时,这个类就叫抽象类访问修饰符abstract类名{
2)用abstract关键字来修饰一个方法时,这个方法就是抽象方法访问修饰符abstract返回类型方法名(参数列表)//没有方法体

3)抽象类的价值更多作用是在于设计,是设计者设计好后,让子类继承并实现抽象类()
4)抽象类,是考官比较爱问的知识点在框架和设计模式使用较多
三、抽象类的注意事项和细节讨论
1)抽象类不能被实例化
报错'A' is abstract; cannot be instantiated

2)抽象类不定要包含abstract方法。 也就是说抽象类可以没有abstract方法
同上 上图的抽象类A类并没有抽象方法
3)一旦类包含了abstract方法,则这个类必须声明为abstract

4) abstract只能修饰类和方法,不能修饰属性和其它的。

5)抽象类可以有任意成员(抽象类本质还是类),比如:非抽象方法、构造器、静态属性等等
注意不能实例对象。
public class AbstractDetail02 {public static void main(String[] args) {D.nihao();}
}
abstract class D{public int n1 = 10;public static String name = "yinhai";public D(){}{}static {}public abstract void hello();public void ok(){}public static void nihao (){}
}
6)抽象方法不能有主体,即不能实现如图所示abstract void aaa(){};
7)如果个类继承 了抽象类, 则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类。
abstract class E{public abstract void hi();
}
abstract class F extends E{}
class G extends E{@Overridepublic void hi() {//这里G类子类实现了父类E的抽象方法,就是有方法体}
}
8)抽象方法不能使用private,final和static来修饰,因为这些关键字都是和重写相违背的。

四、抽象类的课堂练习
1)题1.思考: abstract final class A{}能编译通过吗,why?
// 不能 因为抽象的本意是继承重写
//final修饰就已经是最终类了
2)题2,思考: abstract public static void test2(); 能编译通过吗,why?
//不能 静态的方法是不能重写的
3)题3,思考: abstract private void test30;能编译通过吗,why?
//不能 除了public以外都不行
4)编写一个Employee类,声明为抽象类,包含如下三个属性: name, id, salary.提供必要的构造器和抽象方法: work0. 对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。请使用继承的思想,设计CommonEmployee类和Manager类.要求类中提供必要的方法进行属性访问,实现work().提示"经理/普通员工名字工作中....
public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}
}
class Maanager extends Employee{private double bonus;public Maanager(String name, String id, double salary, double bonus) {super(name, id, salary);this.bonus = bonus;}public void work(){System.out.println("经理 " + getName() + "正在工作中");}
}
class CommonEmployee extends Employee{public void work(){System.out.println("普通员工 " + getName() + "正在工作中");}public CommonEmployee(String name, String id, double salary) {super(name, id, salary);}
}

五、模版设计模式
需求
1.有多个类,完成不同的任务job
2.要求统计各自得到各自完成任务的时间
3.编程实现
引出模版设计模式
public class TestTemplate {public static void main(String[] args) {AA aa = new AA();aa.job();BB bb = new BB();bb.job();}
}class AA {public void job() {//得到开始的时间long start = System.currentTimeMillis();long num = 0;for (long i = 0; i < 1000000; i++) {num += i;}//得到结束的时间long end = System.currentTimeMillis();System.out.println("执行时间" + (end - start) + "ms");}public void job2(){//得到开始的时间long start = System.currentTimeMillis();long num = 0;for (long i = 0; i < 3000000; i++) {num += i;}//得到结束的时间long end = System.currentTimeMillis();System.out.println("执行时间" + (end - start) + "ms");}
}class BB {public void job() {//得到开始的时间long start = System.currentTimeMillis();long num = 0;for (long i = 0; i < 2000000; i++) {num += i;}//得到结束的时间long end = System.currentTimeMillis();System.out.println("执行时间" + (end - start) + "ms");}
}

如果在每个单类里面写job和计算时间的代码块,复用性会很差,所以就引出模版设计,设计一个父类,里面塞进去共有的计算时间的方法,然后塞入抽象job方法,因为每一个对象在运行的时候会从本类开始查找,所以构成了重写抽象job方法,所以这种设计理念就相当于把父类作为一个模版,其他继承。
所以改进该代码
public class TestTemplate {public static void main(String[] args) {AA aa = new AA();BB bb = new BB();aa.calWorkTime();bb.calWorkTime();}
}
abstract class Template{public abstract void job();public void calWorkTime(){long start = System.currentTimeMillis();job();//动态绑定机制,调用的是对象所在类内的方法,没有再往上查找long end = System.currentTimeMillis();System.out.println("执行时间" + (end - start) + "ms");}
}
class AA extends Template{public void job() {long num = 0;for (long i = 0; i < 1000000; i++) {num += i;}}
}
class BB extends Template{public void job() {long num = 0;for (long i = 0; i < 2000000; i++) {num += i;}}
}

相关文章:
【JAVA学习笔记】40 - 抽象类、模版设计模式(抽象类的使用)
项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/abstract_ 一、抽象类的引入 很多时候在创建类的时候有一个父类,比如animal类,他的子类会有各种方法,为了复用需要进行方法的重写&…...
如何通过在线培训考试系统进行远程教育
随着互联网技术的不断发展,远程教育正在成为一种新型的学习方式,它使学生能够在任何地点、任何时间通过在线培训考试系统接受教育。 利用在线培训考试系统进行远程教育具有很大的灵活性。学生可以根据自己的时间和需求自由选择课程,无需受制…...
2021-arXiv-The Power of Scale for Parameter-Efficient Prompt Tuning
2021-arXiv-The Power of Scale for Parameter-Efficient Prompt Tuning Paper: https://arxiv.org/abs/2104.08691 Code: https://github.com/google-research/ text-to-text-transfer-transformer/ blob/main/released_checkpoints.md# lm-adapted-t511lm100k 在这项工作中&…...
计算机视觉与深度学习 | 非线性优化理论:图优化、高斯牛顿法和列文伯格-马夸尔特算法
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 计算机视觉与深度学习 | SLAM国内外研究现状 计算机视觉与深度学习 | 视…...
一文说尽零售数据分析指标体系
零售的本质业务模式是通过在各种渠道上吸引客户来购买我们的商品来实现盈利,其实就是客户-渠道-商品,也就是我们常说的“人、场、货”,除此之外还有供应链、财务等起到重要的辅助作用。因此如果要构建起系统化的零售数据分析指标体系…...
AT2659一款卫星导航低噪声放大器芯片(LNA)
产品介绍 AT2659 是一款专门针对中国 BDS(北斗卫星导航系统),美国的 GPS,俄罗斯的 GLONASS 和欧盟的 GALILEO 导航系统应用而设计的高增益、低噪声系数射频放大器。 AT2659 具有 23dB 高增益和 0.71dB 的低噪声系数。芯片支持 …...
GoLong的学习之路(二)语法之基本数据类型
书接上回:我在GoLong的学习之路(一)中在常量最后说了iota的作用。今天这里我在介绍一下我学习Go语言中基本数据类型。 文章目录 Go中的基本数据类型整型特殊整型数字字面语法 浮点型复数布尔值字符串字符串转义符多行字符字符串的常用操作&am…...
网关概念及java项目中用使用网关场景
网关(Gateway)是一个在网络系统中起到入口和出口的作用的组件或服务。它位于客户端和服务器之间,负责处理进出网络的流量,实现一些重要的功能,如路由、安全认证、协议转换等。 网关在网络架构中扮演了多种角色&#x…...
网页禁止右键 禁止F12 JavaScript禁止F12 禁止右键菜单 包含 js、Jquery、Vue
网页禁止右键 禁止F12 Jquery禁止F12 禁止右键菜单 包含 Jquery、Vue 网页禁止右键 禁止F12 JavaScript禁止F12 禁止右键菜单 jsJavaScript 中Jquery 中Vue 中 这样设置通常是出于安全性或保护内容的目的,不想让别人看到源代码等信息 网页禁止右键 禁止F12 JavaScr…...
Linux系统编程07
线程 为什么有了进程还需要线程 进程切换的时候会花费很大的代价 (1)上下文切换,CPU寄存器需要切换 (2)虚拟地址和物理地址的映射需要切换 进程间通信麻烦 线程是轻量级的进程 (1)线程是一个正…...
html web前端 登录,短信验证码登录
html web前端 登录,短信验证码登录 1,手机号码格式校验 2,按钮点击60秒倒计时,按钮限制点击 3,验证码/或密码长度校验(被注释,公司发的验证码长度不一致,不一定是6位) 4…...
(免费领源码)php#Thinkphp#MYSQL校园二手交易app 99211-计算机毕业设计项目选题推荐
目 录 摘要 Abstract 1 绪论 1.1 研究背景 1.2国内外研究现状 1.3论文结构与章节安排 2 校园二手物品交易app系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析…...
用Python做数据分析之数据筛选及分类汇总
1、按条件筛选(与,或,非) 为数据筛选,使用与,或,非三个条件配合大于,小于和等于对数据进行筛选,并进行计数和求和。与 excel 中的筛选功能和 countifs 和 sumifs 功能相似…...
RabbitMQ高级篇 笔记
这是一些高级的内容。 RabbitMQ还是运行在网络上的,倘若遇到了网络故障,mq自己挂了,出异常了,都会造成最终状态不一致的问题。这就是可靠性问题。 可靠性:一个消息发送出去之后,至少被消费1次。 要解决这3个…...
javaEE -9(7000字详解TCP/IP协议)
一: IP 地址 IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物…...
在mybatis的xml中使用枚举来做判断条件
1.枚举类 import com.baomidou.mybatisplus.annotation.IEnum; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import com.shinkeer.common.utils.StringUtils;import java.util.HashMap; import java.util.Map;…...
scala集合的partition方法使用
在Scala中,partition 方法用于将集合(例如 List、Array ,Set等)中的元素根据给定的条件分成两个部分,并返回一个元组,其中包含两个新的集合,第一个包含满足条件的元素,另一个包含不满…...
18 Transformer 的动态流程
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from333.1007.0.0 b 站直接看 配套 github 链接:https://github.com/nickchen121/Pre-training-language-model 配套博客链接:https://www.cnblogs.com/nickchen121/p/15105048.html 机…...
Android Studio新功能-设备镜像Device mirroring-在电脑侧显示手机实时画面并可控制
下载最新的灰测版本-蜥蜴 成功运行到真机后,点击右侧Running Devices选项卡,再点击号 选中当前设备; 非常丝滑同步,在电脑侧也可以顺畅控制真机 该功能大大方便了我们视线保持在显示器上专注开发,并且便于与UI视觉进行…...
MySQL身份验证绕过漏洞
搭建 vmihub靶场:vulhub靶场搭建与使用_剁椒鱼头没剁椒的博客-CSDN博客 运行漏洞: # 这里要改成自己的 /vulhub-master 存放目录 cd /etc/docker/vulhub-master/mysql/CVE-2012-2122# 关闭防火墙,不然就要放行3306端口 systemctl stop firewalld# 重启 Docker 服务 servic…...
避坑指南:STM32CubeMX配置TouchGFX时,LTDC时钟与SDRAM地址那些容易出错的地方
STM32CubeMX与TouchGFX深度调优:LTDC时钟与SDRAM地址的工程实践 当你在深夜调试STM32F429的TouchGFX界面时,突然发现屏幕出现雪花般的噪点,或是触摸操作引发界面频繁闪烁——这种场景对嵌入式GUI开发者来说再熟悉不过。本文将带你深入LTDC时…...
PFC-FLAC3D耦合学习案例解析
pfc-flac3D耦合学习案例 !岩土工程师的桌面摆满了数值模拟手册 在边坡监测现场见到裂缝的那一刻,我突然意识到离散元与连续介质耦合不再是教科书里的概念——PFC的颗粒崩落和FLAC的应力云图必须握手言和。今天咱们用Python当翻译官,看看这对冤家怎么在滑…...
新手前端第一课:在快马平台用ai生成一个属于自己的“notepad++”
作为一个刚接触前端开发的新手,我最近在InsCode(快马)平台上尝试做了一个简易版的文本编辑器,感觉特别适合用来理解基础的前端开发逻辑。整个过程就像搭积木一样有趣,现在把学习心得分享给大家。 项目构思阶段 我想做一个类似notepad的简易编…...
别再让死区拖后腿!用MATLAB Simulink给SVPWM逆变器做个精准‘补偿手术’
电力电子工程师实战:用MATLAB Simulink实现SVPWM逆变器的死区补偿 在电力电子系统设计中,死区效应就像电路板上的隐形杀手——它不会立即摧毁你的系统,却会悄无声息地降低整体性能。作为一名长期奋战在电机控制一线的工程师,我见过…...
声学模拟实战:用Python实现格林函数计算声场分布(附完整代码)
声学模拟实战:用Python实现格林函数计算声场分布(附完整代码) 在噪声控制、建筑声学和工业设备设计中,声场模拟技术正成为工程师的必备技能。传统商业软件虽然功能强大,但往往价格昂贵且难以定制化。本文将带您用Pyth…...
OpenClaw+百川2-13B量化模型:3个提升效率的自动化脚本
OpenClaw百川2-13B量化模型:3个提升效率的自动化脚本 1. 为什么选择这个组合? 去年冬天,我的下载文件夹已经积累了2000多个未整理文件。每次找文档都像在垃圾堆里翻钥匙,直到尝试用OpenClaw百川2-13B搭建自动化工作流。这个组合…...
探索人机协同:在快马平台上用Cursor实践AI辅助开发工作流
最近在尝试用AI辅助开发时,发现了一个特别有意思的工作模式:通过自然语言描述需求,让AI生成代码,然后直接在页面上展示和编辑。这种"描述-生成-调整"的循环,让开发效率提升了不少。今天就来分享一下在InsCod…...
C#多线程编程实战:Interlocked类如何帮你避免数据竞争(附性能对比)
C#多线程编程实战:Interlocked类如何帮你避免数据竞争(附性能对比) 当你在开发一个需要处理高并发的C#应用时,是否遇到过计数器结果不准确、标志位莫名其妙被重置的诡异情况?这些看似简单的多线程问题,往往…...
UniRig:革新3D模型自动化绑定的智能骨骼生成技术
UniRig:革新3D模型自动化绑定的智能骨骼生成技术 【免费下载链接】UniRig One Model to Rig Them All: Diverse Skeleton Rigging with UniRig 项目地址: https://gitcode.com/gh_mirrors/un/UniRig 在3D内容创作领域,骨骼绑定一直是制约效率的关…...
open_clip技术解构:从核心原理到产业级应用
open_clip技术解构:从核心原理到产业级应用 【免费下载链接】open_clip An open source implementation of CLIP. 项目地址: https://gitcode.com/GitHub_Trending/op/open_clip 一、价值定位:重新定义多模态AI开发范式 核心问题:为什…...
