JAVA实现图书管理系统(初阶)
一.抽象出对象:
1.要有书架,图书,用户(包括普通用户,管理员用户)。根据这些我们可以建立几个包,来把繁杂的代码分开,再通过一个类来把这些,对象整合起来实现系统。说到整合,肯定缺不了,相关接口,我们再定义一个,放接口,和扩展这个接口的方法。
如图:



二.构思:
1.先在书架类上,初始化好默认书籍,其他构造方法(如:getBook,setBook(在具体的下标,放书和返回书)),具体,在写实现接口的方法时,来增加。
public class BookList {//组合的方式,初始化书架private Book[] books = new Book[10];private int usedSize;//实际放的,书的个数//初始化书架(放书)public BookList() {this.books[0] = new Book("三国演义", "罗贯中", 12, "小说");this.books[1] = new Book("红楼梦", "曹雪芹", 13, "小说");this.books[2] = new Book("西游记", "吴承恩", 14, "小说");this.usedSize = 3;}//返回一本,pos(要找的书)下标的书public Book getBook(int pos) {return books[pos];}//插入一本书的方法(相当于,要初始化好,书架原来已有的书)public void setBook(int pos, Book books) {this.books[pos] = books;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public Book[] getBooks() {return books;}public void setBooks(Book[] books) {this.books = books;}
}
2.在book类中写一些图书对象的,基本属性,和给成员变量初始化,的方法。
public class Book {private String name;//书籍名字private String author;//书籍作者private int price;//书籍价格private String type;//书籍类型private boolean isBorrowed;//受否被借出public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public String getType() {return type;}public void setType(String type) {this.type = type;}public boolean isBorrowed() {return isBorrowed;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +"," +((isBorrowed == true) ? "已借出" : "未借出") +/*" isBorrowed=" + isBorrowed*/'}';}
}
3.在User类中,定义好name和,相关构造方法,以及接口命名的数组,为后面,到达调用,扩展了接口的类,里的方法,做铺垫。
public abstract class User {protected String name;//定义,接口命名,类型的数组,后续配合,// 【return new AdminUser(name);】就可以看出,再加上接口调用的方法,就知道,操作了哪一个方法protected IOperation[] iOperations;//要根据子类,来初始化,父类成员变量public User(String name) {this.name = name;}public abstract int menu();//这里封装一个方法,提供给,Main调用。public void DoIOperation(int choice, BookList bookList) {//这里,iOperations数组,里有我们要的对象,通过,数组里的对象,调用接口里的方法iOperations[choice].work(bookList);}
}
4.管理员类中(AdminUser)和普通用户类中(NormalUser)继承了user类,初始化好系统菜单,相关构造方法。(这个构造方法很关键,用接口作为,数组相当于实例化了,扩展了接口的类,的方法,达到调用系统具体方法的作用 )
public class NormalUser extends User{public NormalUser(String name) {super(name);//通过【return new AdminUser(name);】,再加上实现接口的方法,就知道,操作了哪一个方法//登录界面,选择了哪个,角色(NormalUser)或者(AdminUser),this就是哪个的引用this.iOperations = new IOperation[] {//这些对象都实现了,iOperations接口,所以不会报错//下面相当于实例化了,扩展了接口的类,的方法,达到调用系统具体方法的作用new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation(),};}public int menu() {System.out.println("欢迎" + this.name + "使用图书系统");System.out.println("********普通用户菜单********");System.out.println("1. 查找图书");System.out.println("2. 借阅图书");System.out.println("3. 归还图书");System.out.println("0. 退出系统");System.out.println("*************************");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的操作:");int choice = scanner.nextInt();return choice;}}
5.在Main类中写好,登录界面,及整合一下,如何实例化对象,来操作系统。
public static void main(String[] args) {//实例化书架BookList bookList = new BookList();//通过返回值,向上转型,确定用户//这里的user是,返回的(AdminUser),或者(NormalUser)User user = login();while (true) {//然后,通过返回信息,调用恰当的菜单int choice = user.menu();//发生了,动态绑定/*** 根据choice,返回值看看,调用了哪个方法** 1.哪个对象?* 答:User user = login();** 2.哪个方法?-》进一步,还要确定,当前对象,包含了这些方法*答:在构造方法【return new AdminUser(name)】运行时,会初始化好,对应的操作对象。** 注意:后面通过父类对象,调用方法,(int choice = user.menu();),通过choice判断* 调用了,哪个方法 ,接下来就要对,父类,进行操作*/user.DoIOperation(choice, bookList);}}}
6.初始化好,接口和,菜单里操作系统的work方法(实现了这个接口的,类就是,每个操作系统的方法)
public interface IOperation {//这个接口,有操作书架的方法,在其他类实现,就可以,操作性的区分,不同用户的方法public void work(BookList bookList);
}
7.接下来就是实现了,接口的每一个类(每个操作系统的方法)
以下是管理员菜单方法:
(1).查找图书:
public class FindOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("查找图书");int currentSize = bookList.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("请输入你要查找的图书");String name = scanner.nextLine();for (int i = 0; i < currentSize; i++) {//遍历,书架,已初始化的书Book book = bookList.getBook(i);if (book.getName().equals(name)) {System.out.println("找到了");System.out.println(book);return;}}System.out.println("没有你要找的书...");}
}
(2).新增图书:
public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {//1.判断书架(数组)是否满了int currentSize = bookList.getUsedSize();if (currentSize == bookList.getBooks().length) {System.out.println("该书架满了,不能放了");return;}//2.构建对象Scanner scanner = new Scanner(System.in);System.out.println("请输入新增的书名");String name = scanner.nextLine();System.out.println("请输入新增的作者");String author = scanner.nextLine();System.out.println("请输入新增的价格");int price = scanner.nextInt();System.out.println("请输入新增的类型");String type = scanner.next();Book newBook = new Book(name, author, price, type);//3.判断书架是否,已经存在这本书for (int i = 0; i < currentSize; i++) {//遍历,书架,已初始化的书Book book = bookList.getBook(i);if (book.getName().equals(name)) {System.out.println("书已经存在了,不用再添加了");return;}}//插入图书bookList.setBook(currentSize, newBook);bookList.setUsedSize(currentSize+1);}
}
(3).删除图书:
public class DelOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("删除图书");int currentSize = bookList.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("请输入你要删除的图书");String name = scanner.nextLine();int pos = 0;int i = 0;for (; i < currentSize; i++) {//遍历,书架,已初始化的书Book book = bookList.getBook(i);if (book.getName().equals(name)) {//找到要删除的,位置pos = i;break;}}if (i == currentSize) {System.out.println("没有找到你要删除的图书");}//开始删除for (int j = pos; j < currentSize-1; j++) {//思路:bookList[j] = bookList[j+1];//先找到j+1,那个位置,然后覆盖Book book = bookList.getBook(j+1);bookList.setBook(j, book);}//更新下标bookList.setUsedSize(currentSize-1);System.out.println("删除成功");}
}
(4).显示图书:
public class ShowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("显示图书");int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {//遍历下标,把找到的图书打印出来Book book = bookList.getBook(i);System.out.println(book);}}}
(5).退出系统:
public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统");System.exit(0);}
}
以下是普通用户菜单方法:
(1).退出系统和查找图书,是普通人员和管理员的共同方法
(2)归还图书:
public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("归还图书");int currentSize = bookList.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("请输入你要归还的图书");String name = scanner.nextLine();for (int i = 0; i < currentSize; i++) {//遍历,书架,已初始化的书Book book = bookList.getBook(i);if (book.getName().equals(name)) {//看看isBorrowed返回,ture(已借出),还是false(未借出)if (book.isBorrowed()) {book.setBorrowed(false);return;}}}System.out.println("错误,没有你要归还的图书");}
}
(3)借阅图书:
public class BorrowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("借阅图书");int currentSize = bookList.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("请输入你要借阅的图书");String name = scanner.nextLine();for (int i = 0; i < currentSize; i++) {//遍历,书架,已初始化的书Book book = bookList.getBook(i);if (book.getName().equals(name)) {//看看isBorrowed返回,ture(已借出),还是false(未借出)if (book.isBorrowed()) {System.out.println("该书已经被借出");return;}book.setBorrowed(true);//置为借出System.out.println("借阅成功");return;}}System.out.println("没有找到你要借阅的那本书");}
}
相关文章:
JAVA实现图书管理系统(初阶)
一.抽象出对象: 1.要有书架,图书,用户(包括普通用户,管理员用户)。根据这些我们可以建立几个包,来把繁杂的代码分开,再通过一个类来把这些,对象整合起来实现系统。说到整合…...
【Torch学习笔记】
作者:zjk 和 的区别是逐元素相乘,是矩阵相乘 cat stack 的区别 cat stack 是用于沿新维度将多个张量堆叠在一起的函数。它要求所有输入张量具有相同的形状,并在指定的新维度上进行堆叠。...
LeetCode算法题:42. 接雨水(Java)
题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3…...
LINGO:存贮问题
存贮模型中的基本概念 模型: 基本要素: (1)需求率:单位时间内对某种物品的需求量,用D表示。 (2)订货批量:一次订货中,包含某种货物的数量,用 Q表…...
《微服务王国的守护者:Spring Cloud Dubbo的奇幻冒险》
5. 经典问题与解决方案 5.3 服务追踪与链路监控 在微服务架构的广袤宇宙中,服务间的调用关系错综复杂,如同一张庞大的星系网络。当一个请求穿越这个星系,经过多个服务节点时,如何追踪它的路径,如何监控整个链路的健康…...
(九)npm 使用
视频链接:尚硅谷2024最新版微信小程序 文章目录 使用 npm 包自定义构建 npmVant Weapp 组件库的使用Vant Weapp 组件样式覆盖使用 npm 包 目前小程序已经支持使用 npm 安装第三方包,因为 node_modules 目录中的包不会参与小程序项目的编译、上传和打包, 因此在小程序项目中要…...
Thinkphp5内核宠物领养平台H5源码
源码介绍 Thinkphp5内核流浪猫流浪狗宠物领养平台H5源码 可封装APP,适合做猫狗宠物类的发信息发布,当然懂的修改一下,做其他信息发布也是可以的。 源码预览 源码下载 https://download.csdn.net/download/huayula/89361685...
一、Elasticsearch介绍与部署
目录 一、什么是Elasticsearch 二、安装Elasticsearch 三、配置es 四、启动es 1、下载安装elasticsearch的插件head 2、在浏览器,加载扩展程序 3、运行扩展程序 4、输入es地址就可以了 五、Elasticsearch 创建、查看、删除索引、创建、查看、修改、删除文档…...
NL6621 实现获取天气情况
一、主要完成的工作 1、建立TASK INT32 main(VOID) {/* system Init */SystemInit();OSTaskCreate(TestAppMain, NULL, &sAppStartTaskStack[NST_APP_START_TASK_STK_SIZE -1], NST_APP_TASK_START_PRIO); OSStart();return 1; } 2、application test task VOID TestAp…...
SpringCloud配置文件bootrap
解决方案: 情况一、SpringBoot 版本 小于 2.4.0 版本,添加以下依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId> </dependency> 情况二、SpringBoot…...
经典面试题:进程、线程、协程开销问题,为什么进程切换的开销比线程的大?
上下文切换的过程? 上下文切换是操作系统在将CPU从一个进程切换到另一个进程时所执行的过程。它涉及保存当前执行进程的状态并加载下一个将要执行的进程的状态。下面是上下文切换的详细过程: 保存当前进程的上下文: 当操作系统决定切换到另…...
鸿蒙 DevEco Studio 3.1 Release 下载sdk报错的解决办法
鸿蒙 解决下载SDK报错的解决方法 最近在学习鸿蒙开发,以后也会记录一些关于鸿蒙相关的问题和解决方法,希望能帮助到大家。 总的来说一般有下面这样的报错 报错一: Components to install: - ArkTS 3.2.12.5 - System-image-phone 3.1.0.3…...
QGIS开发笔记(二):Windows安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境Demo
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139136356 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
设计一套Kafka到RocketMQ的双写+双读技术方案,实现无缝迁移!
设计一套Kafka到RocketMQ的双写双读技术方案,实现无缝迁移! 1、背景2、方案3、具体逻辑 1、背景 假设你们公司本来线上的MQ用的主要是Kafka,现在要从Kafka迁移到RocketMQ去,那么这个迁移的过程应该怎么做呢?应该采用什…...
Mysql下Limit注入方法(此方法仅适用于5.0.0<mysql<5.6.6的版本)
SQL语句类似下面这样:(此方法仅适用于5.0.0<mysql<5.6.6的版本) SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT (注入点) 问题的关键在于,语句中有 order by 关键字,mysql…...
Makefile学习笔记15|u-boot顶层Makefile01
Makefile学习笔记15|u-boot顶层Makefile01 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。 这里是目录 版本号信息 # SPDX-License-Identifier: GPL-2.0VERSION 2024 PATCHLEVEL 01 SUBLEVEL EXTRAVERSION -rc4 NAME 这里定义了u-bo…...
C++笔记之Unix时间戳、UTC、TSN、系统时间戳、时区转换、local时间笔记
C++笔记之Unix时间戳、UTC、TSN、系统时间戳、时区转换、local时间笔记 ——2024-05-26 夜 code review! 参考博文 C++笔记之获取当前本地时间以及utc时间...
leetcode338-Counting Bits
题目 给你一个整数 n ,对于 0 < i < n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n 1 的数组 ans 作为答案。 示例 1: 输入:n 2 输出:[0,1,1] 解释: 0 --> 0 1 --&…...
sql server怎么存储图片
sql server怎么存储图片 在SQL Server中,可以使用VARBINARY数据类型来存储图片。以下是一个简单的例子,展示了如何将图片存储到数据库中,并从数据库中检索出来。 首先,创建一个表来存储图片数据: CREATE TABLE Image…...
大模型提示词Prompt学习
引言 关于chatGPT的Prompt Engineer,大家肯定耳朵都听起茧了。但是它的来由?,怎么能用好?很多人可能并不觉得并不是一个问题,或者说认定是一个很快会过时的概念。但其实也不能说得非常清楚(因为觉得没必要深…...
Le Git Graph终极故障排除指南:15个常见问题解决方案大全
Le Git Graph终极故障排除指南:15个常见问题解决方案大全 【免费下载链接】le-git-graph Browser extension to add git graph to GitHub website. 项目地址: https://gitcode.com/gh_mirrors/le/le-git-graph Le Git Graph是一款强大的浏览器扩展࿰…...
Latex写论文必看:如何从谷歌学术获取完整的BibTeX引用信息(含Springer/Elsevier/IEEE案例)
LaTeX论文写作进阶:精准获取BibTeX引用数据的全流程指南 作为科研工作者,我们都经历过这样的场景:深夜赶论文时,发现从谷歌学术导出的BibTeX条目缺少关键字段,特别是那些期刊要求的卷号(number)、页码或DOI信息。这种…...
OpenClaw(小龙虾)Windows 11 一键部署教程|2026 最新版|零代码・免配置・解压即用
适用系统:Windows 11 专业版 / 家庭版 / 正式版(全版本兼容) 项目介绍:OpenClaw 是 GitHub 星标 28W 的开源本地 AI 智能体,可自动操控电脑、整理文件、浏览器自动化、办公自动化,被国内用户称为小龙虾&am…...
智能体“记忆力”评估基准:如何量化记忆的准确性、相关性与时效性?
智能体“记忆力”评估基准:如何量化记忆的准确性、相关性与时效性?二、摘要/引言 (一)开门见山:智能体“失忆症”的真实场景与商业/技术痛点 2025年CES展会首日,某全球TOP3消费电子厂商推出的AI家居管家2.0…...
从玩具到工具:用Unity Vuforia给老旧产品手册做个‘AR说明书’(实战案例分享)
从玩具到工具:用Unity Vuforia给老旧产品手册做个‘AR说明书’(实战案例分享) 想象一下,当客户翻阅一本印刷精美的工业设备手册时,只需用手机扫描页面上的产品示意图,就能在屏幕上看到设备内部结构的3D拆解…...
Matlab处理遥感影像必看:地理坐标和投影坐标的GeoTIFF读写,别再搞混了!
Matlab遥感影像处理实战:地理坐标与投影坐标的GeoTIFF读写全解析 遥感影像处理中,坐标系的选择与正确读写是许多初学者容易踩坑的环节。今天我们就来深入探讨Matlab环境下如何处理这两种不同坐标系的GeoTIFF文件,从原理到实践,帮你…...
FPGA图像处理避坑指南:实现CLAHE时,你的直方图统计与插值模块可能踩的这些雷
FPGA图像处理避坑指南:CLAHE实现中的直方图统计与插值模块陷阱解析 第一次在FPGA上实现CLAHE算法时,我盯着屏幕上那些奇怪的边界伪影和忽明忽暗的色块,整整三天没想明白问题出在哪。直到把示波器接到开发板上,才发现直方图统计模块…...
MVP.css代码块和引用样式终极指南:提升内容可读性的完整秘诀
MVP.css代码块和引用样式终极指南:提升内容可读性的完整秘诀 【免费下载链接】mvp MVP.css — Minimalist classless CSS stylesheet for HTML elements 项目地址: https://gitcode.com/gh_mirrors/mv/mvp MVP.css是一个极简主义的无类CSS样式表,…...
2026普通人如何逆袭进大模型圈?吴师兄亲授4大方向+3坑避坑+真实学习路线
站在现在回头看,会发现一个有趣的现象: AI 大潮滚滚 2 年,流量的风向能变,岗位的 JD 能变,各家模型能天天更新,但真正能落地的东西,并没有变。 这 2 年里,我带过很多转行同学&#…...
MCP协议对接太慢?从零到上线仅需22分钟,Python模板封装的7层自动适配机制全曝光
第一章:MCP协议对接瓶颈与Python模板化破局之道MCP(Model Control Protocol)作为新兴的模型协同控制规范,在多智能体系统与LLM服务编排中展现出强大潜力,但其原始协议栈缺乏统一抽象层,导致开发者频繁陷入重…...
