当前位置: 首页 > news >正文

【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_ 一、抽象类的引入 很多时候在创建类的时候有一个父类&#xff0c;比如animal类&#xff0c;他的子类会有各种方法&#xff0c;为了复用需要进行方法的重写&…...

如何通过在线培训考试系统进行远程教育

随着互联网技术的不断发展&#xff0c;远程教育正在成为一种新型的学习方式&#xff0c;它使学生能够在任何地点、任何时间通过在线培训考试系统接受教育。 利用在线培训考试系统进行远程教育具有很大的灵活性。学生可以根据自己的时间和需求自由选择课程&#xff0c;无需受制…...

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国内外研究现状 计算机视觉与深度学习 | 视…...

一文说尽零售数据分析指标体系

零售的本质业务模式是通过在各种渠道上吸引客户来购买我们的商品来实现盈利&#xff0c;其实就是客户-渠道-商品&#xff0c;也就是我们常说的“人、场、货”&#xff0c;除此之外还有供应链、财务等起到重要的辅助作用。因此如果要构建起系统化的零售数据分析指标体系&#xf…...

AT2659一款卫星导航低噪声放大器芯片(LNA)

产品介绍 AT2659 是一款专门针对中国 BDS&#xff08;北斗卫星导航系统&#xff09;&#xff0c;美国的 GPS&#xff0c;俄罗斯的 GLONASS 和欧盟的 GALILEO 导航系统应用而设计的高增益、低噪声系数射频放大器。 AT2659 具有 23dB 高增益和 0.71dB 的低噪声系数。芯片支持 …...

GoLong的学习之路(二)语法之基本数据类型

书接上回&#xff1a;我在GoLong的学习之路&#xff08;一&#xff09;中在常量最后说了iota的作用。今天这里我在介绍一下我学习Go语言中基本数据类型。 文章目录 Go中的基本数据类型整型特殊整型数字字面语法 浮点型复数布尔值字符串字符串转义符多行字符字符串的常用操作&am…...

网关概念及java项目中用使用网关场景

网关&#xff08;Gateway&#xff09;是一个在网络系统中起到入口和出口的作用的组件或服务。它位于客户端和服务器之间&#xff0c;负责处理进出网络的流量&#xff0c;实现一些重要的功能&#xff0c;如路由、安全认证、协议转换等。 网关在网络架构中扮演了多种角色&#x…...

网页禁止右键 禁止F12 JavaScript禁止F12 禁止右键菜单 包含 js、Jquery、Vue

网页禁止右键 禁止F12 Jquery禁止F12 禁止右键菜单 包含 Jquery、Vue 网页禁止右键 禁止F12 JavaScript禁止F12 禁止右键菜单 jsJavaScript 中Jquery 中Vue 中 这样设置通常是出于安全性或保护内容的目的&#xff0c;不想让别人看到源代码等信息 网页禁止右键 禁止F12 JavaScr…...

Linux系统编程07

线程 为什么有了进程还需要线程 进程切换的时候会花费很大的代价 &#xff08;1&#xff09;上下文切换&#xff0c;CPU寄存器需要切换 &#xff08;2&#xff09;虚拟地址和物理地址的映射需要切换 进程间通信麻烦 线程是轻量级的进程 &#xff08;1&#xff09;线程是一个正…...

html web前端 登录,短信验证码登录

html web前端 登录&#xff0c;短信验证码登录 1&#xff0c;手机号码格式校验 2&#xff0c;按钮点击60秒倒计时&#xff0c;按钮限制点击 3&#xff0c;验证码/或密码长度校验&#xff08;被注释&#xff0c;公司发的验证码长度不一致&#xff0c;不一定是6位&#xff09; 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、按条件筛选&#xff08;与&#xff0c;或&#xff0c;非&#xff09; 为数据筛选&#xff0c;使用与&#xff0c;或&#xff0c;非三个条件配合大于&#xff0c;小于和等于对数据进行筛选&#xff0c;并进行计数和求和。与 excel 中的筛选功能和 countifs 和 sumifs 功能相似…...

RabbitMQ高级篇 笔记

这是一些高级的内容。 RabbitMQ还是运行在网络上的&#xff0c;倘若遇到了网络故障&#xff0c;mq自己挂了&#xff0c;出异常了&#xff0c;都会造成最终状态不一致的问题。这就是可靠性问题。 可靠性&#xff1a;一个消息发送出去之后&#xff0c;至少被消费1次。 要解决这3个…...

javaEE -9(7000字详解TCP/IP协议)

一&#xff1a; IP 地址 IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址&#xff0c;又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一个逻辑地址&#xff0c;以此来屏蔽物…...

在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中&#xff0c;partition 方法用于将集合&#xff08;例如 List、Array &#xff0c;Set等&#xff09;中的元素根据给定的条件分成两个部分&#xff0c;并返回一个元组&#xff0c;其中包含两个新的集合&#xff0c;第一个包含满足条件的元素&#xff0c;另一个包含不满…...

18 Transformer 的动态流程

博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from333.1007.0.0 b 站直接看 配套 github 链接&#xff1a;https://github.com/nickchen121/Pre-training-language-model 配套博客链接&#xff1a;https://www.cnblogs.com/nickchen121/p/15105048.html 机…...

Android Studio新功能-设备镜像Device mirroring-在电脑侧显示手机实时画面并可控制

下载最新的灰测版本-蜥蜴 成功运行到真机后&#xff0c;点击右侧Running Devices选项卡&#xff0c;再点击号 选中当前设备&#xff1b; 非常丝滑同步&#xff0c;在电脑侧也可以顺畅控制真机 该功能大大方便了我们视线保持在显示器上专注开发&#xff0c;并且便于与UI视觉进行…...

MySQL身份验证绕过漏洞

搭建 vmihub靶场:vulhub靶场搭建与使用_剁椒鱼头没剁椒的博客-CSDN博客 运行漏洞: # 这里要改成自己的 /vulhub-master 存放目录 cd /etc/docker/vulhub-master/mysql/CVE-2012-2122# 关闭防火墙,不然就要放行3306端口 systemctl stop firewalld# 重启 Docker 服务 servic…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...