当前位置: 首页 > 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…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...