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

【Java SE】抽象类/方法、模板设计模式

目录

1.抽象类/方法

1.1 基本介绍

1.2 语法格式

1.3 使用细节

2. 模板设计模式(抽象类使用场景)

2.1 基本介绍

2.2 具体例子


1.抽象类/方法

1.1 基本介绍

① 当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法

② 类中只要存在一个抽象方法,则该类必须为抽象类

 抽象类的价值更多作用在于设计,具体来说:设计者设计好后,让子类继承并实现父类的抽象方法

public class Test {public static void main(String[] args) {Dog dog = new Dog();dog.eat();}
}//抽象类
abstract class Animal{//抽象方法,只知道吃的动作,但不知道具体的动物吃什么东西public abstract void eat();
}class Dog extends Animal{public void eat(){System.out.println("狗吃骨头");}
}

1.2 语法格式

  • 抽象类:被 abstract 修饰的类,一般会被继承,由其子类来实现抽象的方法

[修饰符] abstract class 类名{}
  • 抽象方法:被 abstract 修饰而且没有方法体的方法,也叫做没有实现的方法

[修饰符] abstract 返回值类型 方法名([形参列表]);//不需要方法体{}

1.3 使用细节

① abstract 只能修饰类和方法,不能用来修饰属性和其他的

 使用 abstract 修饰类,只是表示该类为抽象类,类内部的属性和方法不会自动具有 abstract 修饰符

 抽象类不能创建对象实例

 抽象类的本质还是类,可以有类的各种成员。比如:非抽象方法、构造器、非静态方法/属性、静态方法/属性等等,都可以继承给子类

public class Test {public static void main(String[] args) {Dog dog = new Dog();System.out.println(Dog.num);System.out.println(dog.name);dog.eat();}
}//抽象类
abstract class Animal{public static int num = 1;public String name = "小马";public abstract void eat();//抽象方法
}class Dog extends Animal{//实现父类的抽象方法public void eat(){System.out.println("狗吃骨头");}
}
/*输出结果
1
小马
狗吃骨头*/

⑤ 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为 abstract类,否则编译不通过

 ⑥ 抽象方法不能使用 private、final、static 来修饰,因为这些关键字都是和重写相违背的

        private:如果父类的抽象方法用 private 修饰,那其子类没有访问权限,无法实现抽象方法

        final:如果父类的抽象方法用 final 修饰,则该方法不能重写,其子类无法实现抽象方法

        static:static 修饰的方法可以 "直接类.方法名" 调用,而 abstract 修饰的方法没有方法体,因此两者是相悖的【这样理解不知道对不对】

2. 模板设计模式(抽象类使用场景)

2.1 基本介绍

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式

解决的问题

 当功能内部一部分实现是确定的,另一部分实现是不确定的,这时可以把不确定的部分暴露出去,让子类去实现

 换句话说,在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,则易变部分可以抽象出来,供不同子类实现。这就是一种模板模式

看上面的文字可能会觉得很抽象,可以结合具体的例子理解一下

2.2 具体例子

需求:计算不同类各自任务的执行时间

未使用模板设计模式之前

public class demo {public static void main(String[] args) {new JobA().job();new JobB().job();}
}class JobA{public void job(){int result = 0;long startTime = System.currentTimeMillis();//开始时间for(int i=0;i<100000;i++){result += i;}long endTime = System.currentTimeMillis();//结束时间long duration = endTime - startTime;System.out.println("任务执行时间: " + duration + "毫秒");}
}class JobB{public void job(){int result = 1;long startTime = System.currentTimeMillis();//开始时间for(int i=0;i<8000;i++){result *= i;}long endTime = System.currentTimeMillis();//结束时间long duration = endTime - startTime;System.out.println("任务执行时间: " + duration + "毫秒");}
}

缺点:代码冗余,复用性差,可以看到代码整体的步骤是很固定的,如下:

①  记录任务开始时间

②  执行任务

③  记录任务结束时间

④  打印任务执行时间

其中,① ③ ④ 是固定不变的,变的只有 ② ,这就有了改进的空间

引入模板设计模式

优点:利用抽象类+动态绑定机制使得模板类中的 job() 可以动态调用执行方法,代码复用性高  

public class demo {public static void main(String[] args) {new JobA().calculateJobTime();new JobB().calculateJobTime();}
}//模板类
abstract class Template{public abstract void job();//抽象方法//计算任务执行时间public void calculateJobTime(){long startTime = System.currentTimeMillis();//开始时间job();//动态绑定机制long endTime = System.currentTimeMillis();//结束时间long duration = endTime - startTime;System.out.println("任务执行时间: " + duration + "毫秒");}
}class JobA extends Template{//重写抽象方法public void job(){int result = 0;for(int i=0;i<100000;i++){result += i;}}
}class JobB extends Template{//重写抽象方法public void job(){int result = 1;for(int i=0;i<8000;i++){result *= i;}}
}

相关文章:

【Java SE】抽象类/方法、模板设计模式

目录 1.抽象类/方法 1.1 基本介绍 1.2 语法格式 1.3 使用细节 2. 模板设计模式&#xff08;抽象类使用场景&#xff09; 2.1 基本介绍 2.2 具体例子 1.抽象类/方法 1.1 基本介绍 ① 当父类的某些方法&#xff0c;需要声明&#xff0c;但是又不确定如何实现时&#xff…...

文件相关函数的总结与记忆

1.字符的输入输出 char ch getchar();//不需要传递参数 putchar(a)putc、getc与fputc、fgetc一致 //必须用int接受&#xff0c;因为返回int类型&#xff0c;char因为编译器不同而可能为无符号和有符号 int ch if( (ch getchar() ) ! EOF) 2.行的输入输出 也可以用于二进制…...

SpringBoot有几种获取Request对象的方法

HttpServletRequest 简称 Request&#xff0c;它是一个 Servlet API 提供的对象&#xff0c;用于获取客户端发起的 HTTP 请求信息。例如&#xff1a;获取请求参数、获取请求头、获取 Session 会话信息、获取请求的 IP 地址等信息。 那么问题来了&#xff0c;在 Spring Boot 中…...

Unix 域套接字(本地套接字)

Unix 域套接字&#xff08;Unix Domain Sockets&#xff09;&#xff0c;也称为本地套接字&#xff08;Local Sockets&#xff09;&#xff0c;是一种用于同一主机上进程间通信&#xff08;IPC&#xff09;的机制。Unix 域套接字提供了一种高效的进程间通信方式&#xff0c;它利…...

Nordic nRF 蓝牙的 Direct Test Mode (DTM) 测试介绍

目录 概述 1. 核心物理层参数 1.1 射频频率 (RF Channel Frequency) 1.2 发射功率 (TX Power) 1.3 调制方式 (Modulation) 1.4 数据包类型 (Packet Type) 1.5 测试模式 (Test Mode) 2. 参数配置方法 2.1 通过 HCI 命令配置 2.2 示例&#xff08;nRF52 系列&#xff0…...

go安装lazydocker

安装 先安装go环境 https://blog.csdn.net/Yqha1/article/details/146430281?fromshareblogdetail&sharetypeblogdetail&sharerId146430281&sharereferPC&sharesourceYqha1&sharefromfrom_link 安装lazydocker go install github.com/jesseduffield/laz…...

LangChain开发(一)介绍和第一个例子

文章目录 简介LangChain框架组成LangChain库&#xff08;Libraries&#xff09;LangChain任务处理流程核心概念1. LLMs2. Chat Models3. 消息&#xff08;Message&#xff09;4. 提示&#xff08;prompts&#xff09;5. 输出解析器&#xff08;Output Parsers&#xff09;6.Ret…...

Chrome-Edge-IDEA-Win 常用插件-工具包

Chrome-Edge-IDEA-Win 常用插件-工具包 Chrome-Edge-IDEA-Win 常用插件-工具包谷歌插件chropathJSONViewOctotree - GitHub code treeXPath Helper书签侧边栏篡改猴Print Edit WEEdge浏览器插件IDEA插件CodeGlance Pro 代码迷你缩放图插件Alibaba Cloud ToolkitAlibaba Java Co…...

电加热产品亚马逊审核标准UL499报告

很多亚马逊卖家都上架应季产品 像加热垫 加热杯垫 加热毯等产品 都少不了亚马逊UL测试的报告 亚马逊明确要求 电子产品在亚马逊销售就必须需要有UL报告 不然就产品就被有下架的风险。由于 UL 标准也就是美洲的安全测试标准&#xff0c;因此亚马逊出于对安全的考虑会加强对带电的…...

从实践到创新:低代码驱动教育行业数字化转型

随着数字化转型浪潮席卷教育领域&#xff0c;低代码开发平台因其“低门槛、高效率、强适配”特性&#xff0c;正成为教育行业信息化改革的新工具。本文将结合低代码技术在教育场景中的典型应用案例&#xff0c;分享其对教学管理、科研创新及人才培养模式的变革价值。 一、政策与…...

@AuthenticationPrincipal user null

AuthenticationPrincipal user: null 当使用 AuthenticationPrincipal 注解时&#xff0c;如果注入的 user 为 null&#xff0c;通常是因为以下原因之一&#xff1a; 1. 用户未登录 原因 当前请求没有经过身份验证&#xff0c;Spring Security 的 SecurityContext 中没有用户…...

dfs刷题排列问题 + 子集问题 + 组和问题总结

文章目录 一、排列问题全排列II题解代码 优美的排列题解代码 二、子集问题字母大小写全排列题解代码 找出所有子集的异或总和再求和题解代码 三、组合问题电话号码的字母组合题解代码 括号生成题解代码 组合题解代码 目标和题解代码 组合总和题解代码 总结 一、排列问题 全排列…...

citrix安装部署

在Citrix环境中&#xff0c;特别是在Citrix XenApp或Citrix XenDesktop的部署中&#xff0c;涉及到多个步骤和考虑因素。Citrix是一家提供虚拟化桌面和应用程序解决方案的公司&#xff0c;其产品可以帮助企业实现桌面和应用虚拟化&#xff0c;从而提升灵活性、安全性和管理效率…...

ffmpeg库视频硬编码使用流程

‌一、硬件编码核心流程‌ ‌硬件设备初始化 // 创建CUDA硬件设备上下文‌ AVBufferRef *hw_device_ctx NULL; av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_CUDA, NULL, NULL, 0);// 绑定硬件设备到编码器上下文‌ codec_ctx->hw_device_ctx av_buffer_…...

996引擎-接口测试:消息Tips

996引擎-接口测试:消息Tips 发送视野内广播消息 sendrefluamsg发送聊天框消息 sendmsg发送地图消息 sendmapmsg打印消息到控制台 release_print发送自定义颜色的文字信息 guildnoticemsg测试NPC参考资料发送视野内广播消息 sendrefluamsg function npc_test_onclick1(player)-…...

【入门初级篇】布局类组件的使用(1)

【入门初级篇】布局类组件的使用&#xff08;1&#xff09; 视频要点 &#xff08;1&#xff09;章节大纲介绍 &#xff08;2&#xff09;布局类组件类型介绍&#xff1a;行布局、列布局、标题 &#xff08;3&#xff09;实操演示&#xff1a;列表统计查询布局模型 点击访问my…...

JavaWeb之WebSocket

目录 一、 websocket 概念二、WebSocket原理三、WebSocket特点四、WebSocket应用场景五、Websocket基本使用1、创建Websocket对象2、Websocket事件3、Websocket方法4、前端服务程序 六、聊天室案例1、Tomcat版本&#xff1a;8.0.442、Maven 依赖&#xff1a;3、前端代码4、后端…...

算法2--两数相加

题目描述 解题思路 题目说的很详细了&#xff0c;也就是把每个数倒序写成链表进行输入&#xff0c;然后让你计算两个倒序数组的和&#xff0c;要保证跟预期的结果一样。 首先应该考虑的是两个数组的长度问题&#xff0c;对于链表的每一位进行加法运算&#xff0c;如果两个列表…...

突破边界:Tauri 2.0全局状态管理的原子级实践

精心打造的Tauri 2.0全局状态管理深度指南&#xff0c;融合最新框架特性与企业级实践方案&#xff1a; 一、Tauri 2.0状态管理新范式 1.1 量子态存储模型 #mermaid-svg-paiGRksb0JRQ3TqJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fil…...

Springboot的jak安装与配置教程

目录 Windows系统 macOS系统 Linux系统 Windows系统 下载JDK&#xff1a; 访问Oracle官网或其他JDK提供商网站&#xff0c;下载适合Windows系统的JDK版本。网站地址&#xff1a;Oracle 甲骨文中国 | 云应用和云平台点击进入下滑&#xff0c;点击进入下载根据自己的系统选择&…...

Axure大屏可视化模板:赋能多领域,开启数据展示新篇章

在当今这个数据爆炸的时代&#xff0c;数据已经成为各行各业的核心资产。然而&#xff0c;如何高效、直观地展示数据&#xff0c;并将其转化为有价值的决策依据&#xff0c;成为了许多企业和组织面临的共同挑战。Axure大屏可视化模板&#xff0c;作为一款强大的数据展示工具&am…...

大模型训练为什么选择交叉熵损失(Cross-Entropy Loss):均方误差(MSE)和交叉熵损失的深入对比

交叉熵损失&#xff1a;深度学习中的基石与洞见 交叉熵损失&#xff08;Cross-Entropy Loss&#xff09;是现代深度学习中分类任务的核心损失函数&#xff0c;尤其在训练大规模模型&#xff08;如 transformers 等大型语言模型 LLM&#xff09;时&#xff0c;几乎无处不在。对…...

C++|GLog开源库的使用 如何实现自定义类型消息日志

参考&#xff1a; C glog使用教程与代码演示 C第三方日志库Glog的安装与使用超详解 GLOG从入门到入门 glog 设置日志级别_glog C版本代码分析 文章目录 日志等级自定义消息创建使用宏定义 日志等级 在 glog 中&#xff0c;日志的严重性是通过 LogSeverity 来区分的&#xff0c…...

cursor常用快捷键(JetBrains Darcula主题风格)

一、基础操作速查 打开/创建项目 打开项目&#xff1a;Ctrl Shift O&#xff08;选择文件夹&#xff09;新建文件&#xff1a;Ctrl N保存文件&#xff1a;Ctrl S关闭当前标签页&#xff1a;Ctrl F4 代码编辑 复制当前行&#xff1a;Ctrl D删除当前行&#xff1a;Ctrl …...

区块链学习总结

Hardhat 是一个用于 Ethereum 智能合约开发 的开发环境&#xff0c;专为 Solidity 语言编写的智能合约提供工具支持。它能够帮助开发者 编译、部署、测试和调试 智能合约&#xff0c;并提供一个本地的以太坊测试网络。 Hardhat 的核心功能 本地开发网络&#xff08;Hardhat Ne…...

《深入剖析鸿蒙生态原生应用:一次开发多端部署的技术革新》

在数字化时代飞速发展的浪潮中&#xff0c;鸿蒙生态以其独特的技术理念和强大的创新能力&#xff0c;为开发者和用户带来了全新的体验。其中&#xff0c;“一次开发多端部署”作为鸿蒙生态原生应用开发的核心技术之一&#xff0c;不仅是技术上的重大突破&#xff0c;更是对未来…...

知识蒸馏:让大模型“瘦身“而不失智慧的魔术

引言&#xff1a;当AI模型需要"减肥" 在人工智能领域&#xff0c;一个有趣的悖论正在上演&#xff1a;大模型的参数规模每年以10倍速度增长&#xff0c;而移动设备的算力却始终受限。GPT-4的1750亿参数需要价值500万美元的GPU集群运行&#xff0c;但现实中的智能设备…...

JavaScript 获取 URL 中参数值的详解

JavaScript 获取 URL 中参数值的详解 1. 了解 URL 参数2. 使用 URLSearchParams 获取参数值2.1 什么是 URLSearchParams&#xff1f;2.2 示例代码2.3 优缺点 3. 使用正则表达式获取参数值3.1 示例代码3.2 分析 4. 自定义解析函数4.1 示例代码4.2 分析 5. 小结与注意事项 在开发…...

识别并脱敏上传到deepseek/chatgpt的文本文件中的身份证/手机号

本文将介绍一种简单高效的方法解决用户在上传文件到DeepSeek、ChatGPT,文心一言,AI等大语言模型平台过程中的身份证号以及手机号等敏感数据识别和脱敏问题。 DeepSeek、ChatGPT,Qwen,Claude等AI平台工具快速的被接受和使用,用户每天上传的文本数据中潜藏着大量敏感信息,…...

ruoyi-vue部署4

1.jdk-linux安装 2.tomcat-linux安装 3.ruoy后台部署 4.nginx-linux安装5.ruoyi前端部署​​​​​​​...