【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;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37822.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python数据可视化工具:六西格玛及其基础工具概览

在当今数据驱动的时代&#xff0c;数据分析和可视化工具成为了各行业优化流程、提升质量的关键手段。六西格玛&#xff08;Six Sigma&#xff09;作为一种以数据为基础、追求完美质量的管理理念&#xff0c;其实施依赖于一系列基础工具的灵活运用。而Python&#xff0c;凭借其强…

调试 Rust + WebAssembly 版康威生命游戏

1. 启用 Panic 日志 1.1 让 Panic 信息显示在浏览器控制台 如果 Rust 代码发生 panic!()&#xff0c;默认情况下不会在浏览器开发者工具中显示详细的错误信息。这使得排查问题变得困难。 我们可以使用 console_error_panic_hook 这个 Rust crate&#xff0c;将 Panic 信息打…

网络编程中客户端与服务器的搭建与协议包应用

1.客户端的搭建 2.服务器搭建 3.TCP中的粘包现象 tcp协议为了提高发送的效率&#xff0c;会将短时间连续发送的小数据&#xff0c;当做一组数据统一发送 原理是&#xff1a; tcp协议本身存在一个1500字节的缓存区&#xff0c;tcp协议每次write发送数据的时候&#xff0c;总是…

微博ip属地不发微博会不会变

随着社交媒体的普及&#xff0c;微博作为其中的佼佼者&#xff0c;一直备受关注。而且微博上线了显示用户IP属地的功能&#xff0c;这一功能旨在减少冒充热点事件当事人、恶意造谣、蹭流量等不良行为&#xff0c;确保传播内容的真实性和透明度。然而&#xff0c;这也引发了一些…

【初探数据结构】树与二叉树

&#x1f4ac; 欢迎讨论&#xff1a;在阅读过程中有任何疑问&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果你觉得这篇文章对你有帮助&#xff0c;记得点赞、收藏&#xff0c;并分享给更多对数据结构感…

Neo4j GDS(Graph Data Science)库安装(Mac版)

Neo4j GDS&#xff08;Graph Data Science&#xff09;库安装&#xff08;Mac版&#xff09; Neo4j GDS库安装&#xff08;Mac版&#xff09; Neo4j GDS&#xff08;Graph Data Science&#xff09;库安装&#xff08;Mac版&#xff09;前言GDS&#xff08;Graph Data Science&…

DeepSeek 3FS 与 JuiceFS:架构与特性比较

近期&#xff0c;DeepSeek 开源了其文件系统 Fire-Flyer File System (3FS)&#xff0c;使得文件系统这一有着 70 多年历时的“古老”的技术&#xff0c;又获得了各方的关注。在 AI 业务中&#xff0c;企业需要处理大量的文本、图像、视频等非结构化数据&#xff0c;还需要应对…

《南京日报》专题报道 | 耘瞳科技“工业之眼”加码“中国智造”

在江宁开发区&#xff0c;机器人已不再是科幻电影里的遥远想象&#xff0c;他们就像人类的“同事”&#xff0c;在工地上忙着贴砖、刷墙、搬运、检测&#xff1b; 在体育训练场上帮助运动员矫正姿势&#xff1b; 在医院里帮助医生发现帕金森早期征兆&#xff0c;在智慧工厂里…

SpringBoot最佳实践之 - 使用AOP记录操作日志

1. 前言 本篇博客是个人在工作中遇到的需求。针对此需求&#xff0c;开发了具体的实现代码。并不是普适的记录操作日志的方式。以阅读本篇博客的朋友&#xff0c;可以参考此篇博客中记录日志的方式&#xff0c;可能会对你有些许帮助和启发。 2. 需求描述 有一个后台管理系统…

投影算子(Projection Operator)的定义、性质、分类以及应用

文章目录 1. 投影算子的定义2. 投影算子的几何意义3. 一些简单的例子例 1&#xff1a;二维平面上的投影例 2&#xff1a;投影到一条任意方向的直线例 3&#xff1a;三维空间中投影到一个平面 4. 投影算子的性质4.1、幂等性&#xff08;Idempotency&#xff09;&#xff1a; P 2…

VLAN综合实验报告

一、实验拓扑 网络拓扑结构包括三台交换机&#xff08;LSW1、LSW2、LSW3&#xff09;、一台路由器&#xff08;AR1&#xff09;以及六台PC&#xff08;PC1-PC6&#xff09;。交换机之间通过Trunk链路相连&#xff0c;交换机与PC、路由器通过Access或Hybrid链路连接。 二、实验…

coding ability 展开第五幕(二分查找算法)超详细!!!!

. . 文章目录 前言二分查找搜索插入的位置思路 x的平方根思路 山脉数组的峰顶索引思路 寻找旋转排序数组中的最小值思路 总结 前言 本专栏上篇博客已经把滑动指针收尾啦 现在还是想到核心——一段连续的区间&#xff0c;有时候加上哈希表用起来很爽 今天我们来学习新的算法知识…

文献阅读篇#2:YOLO改进类的文章如何高效进行文献阅读(对于初学者)

对于初学者来说&#xff0c;文献阅读是非常非常重要的一个学习方式&#xff0c;好的文献阅读方法会让学习的效率翻倍。我希望能够总结出一套比较有效的文献阅读方法&#xff0c;并通过记录的方法来找到不足和可改进之处 一、文献检索 对于初学者来说&#xff0c;应当先从中文…

数智读书笔记系列021《大数据医疗》:探索医疗行业的智能变革

一、书籍介绍 《大数据医疗》由徐曼、沈江、余海燕合著&#xff0c;由机械工业出版社出版 。徐曼是南开大学商学院副教授&#xff0c;在大数据驱动的智能决策研究领域颇有建树&#xff0c;尤其在大数据驱动的医疗与健康决策方面有着深入研究&#xff0c;曾获天津优秀博士论文、…

MarsCode AI实战:利用DeepSeek 快速搭建你的口语学习搭子

资料来源&#xff1a;火山引擎-开发者社区 成品抢先看&#xff01; 自从MarsCode AI Chat模型全新升级&#xff0c;接入 Deepseek-R1、Deepseek-V3和豆包大模型1.5 三大模型&#xff0c;越来越多朋友注意到了AI编程能给我们带来的无限可能&#xff0c;也开始跃跃欲试想要尝试从…

Linux环境变量:深入解析与实用指南

目录 一、环境变量概述 二、环境变量的作用 三、环境变量的类型 3.1系统环境变量 3.2用户环境变量 四、环境变量的操作 4.1查看环境变量 4.2设置环境变量 4.3删除环境变量 五、环境变量的配置文件 六、环境变量的最佳实践 七、总结 环境变量是Linux系统中至关重要的…

C++20 线程协调类:从入门到精通

文章目录 1. 初识线程协调2. std::barrier&#xff1a;多线程同步的屏障2.1 核心函数2.2 示例代码2.3 高级用法2.4 适用场景 3. std::latch&#xff1a;一次性同步原语3.1 核心函数3.2 示例代码3.3 高级用法3.4 适用场景 4. std::counting_semaphore&#xff1a;可重用的同步原…

【Linux网络】手动部署并测试内网穿透

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

MySQL中的锁机制:从全局锁到行级锁

目录 1. 锁的基本概念 2. 全局锁 2.1 全局锁的定义 2.2 全局锁的类型 2.3 全局锁的使用场景 2.4 全局锁的实现方式 2.5 全局锁的优缺点 2.6 全局锁的优化 3. 表级锁 3.1 表级锁的类型 3.2 表级锁的使用场景 3.3 表级锁的优缺点 4. 意向锁&#xff08;Intention Lo…

2025年渗透测试面试题总结- 某亭-安全研究员(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 一、SQL注入过滤单引号绕过方法 二、MySQL报错注入常用函数 三、报错注入绕WAF 四、MySQL写文件函数…