【java】图书管理系统
有了前几篇文章关于封装、继承、多态、接口等的介绍,想必各位读者对java面向对象的思想有了一定的认识。接下来这篇文章就让我们趁热打铁,利用所学知识做一个小项目图书管理系统吧

目录
一、图书类
1、book类
2、bookList类
二、功能实现
1、IOperation接口
2、查找图书
3、借阅图书
4、归还图书
5、新增图书
6、删除图书
7、显示图书
8、退出系统
三、用户类
四、主函数逻辑实现
总结
一、图书类
图书管理系统,顾名思义,起码要先有书被管理。因此我们应当先定义好于书相关的类。
1、book类
先定义一下单本书的特性,一本书肯定会包含书名、作者、价格等信息,我们可以建立一个book类来描述每本书的特性:
package book;public class Book {private String name;private String author;private int price;private boolean IsBorrowed;public Book(String name, String author, int price) {this.name = name;this.author = author;this.price = price;}public String getName() {return name;}public boolean isBorrowed() {return IsBorrowed;}public void setBorrowed(boolean borrowed) {this.IsBorrowed = borrowed;}@Overridepublic String toString() {return "name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +(IsBorrowed?", 已借出":", 未借出");}
}
2、bookList类
既然要做管理系统,那就不可能只处理一本书了,我们需要管理的是许多本特性各异的书。那么如何来存储这些信息呢?我们可以建立一个列表类来记录我们的图书信息:
package book;public class BookList {private Book[] books=new Book[20];private int userSize;public BookList() {books[0]=new Book("海贼王","尾田荣一郎",17);books[1]=new Book("火影忍者","尾田荣一郎",19);books[2]=new Book("红楼梦","曹雪芹",45);books[3]=new Book("西游记","吴承恩",40);books[4]=new Book("三国演义","罗贯中",37);this.userSize=5;}public int getUserSize() {return userSize;}public void setUserSize(int userSize) {this.userSize = userSize;}public boolean isFull(){if(this.userSize==books.length){return true;}else{return false;}}public Book getBook(int pos){return books[pos];}public void setBook(int pos,Book book){books[pos]=book;}
}
二、功能实现
已经存储好书本信息后, 我们就要明确我们究竟要实现哪些功能?


具体实现就由小编来带大家一一介绍吧
1、IOperation接口
为了功能实现的方便,我们通过接口来实现各个功能,先定义一个接口IOperation:
public interface IOperation {void work(BookList bookList);
}
接着就可以通过重写接口中的work方法来实现各个的功能了,并且由于多态性,我们可以将各种不同功能的接口按顺序放在一个数组里,通过数组访问来实现不同功能,大大提高了效率。
如果你不知道多态是什么的话,可以看看小编之前的文章面向对象三大特性之多态 哦
2、查找图书
public class FindOperatino implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("查找图书………………");System.out.println("请输入你要查找的书名:");Scanner in =new Scanner(System.in);String bookname=in.nextLine();int Size= bookList.getUserSize();for(int i=0;i<Size;i++){Book book=bookList.getBook(i);if(book.getName().equals(bookname)){System.out.println("找到了这本书:");System.out.println(book);return;}}System.out.println("没有你要找的书!");}
}

3、借阅图书
public class BorrowedOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("借阅图书………………");System.out.println("请输入你要借阅的书名:");Scanner in =new Scanner(System.in);String bookname=in.nextLine();int Size= bookList.getUserSize();for(int i=0;i<Size;i++){Book book=bookList.getBook(i);if(book.getName().equals(bookname)){System.out.println("借阅成功!");book.setBorrowed(true);//System.out.println(book);return;}}System.out.println("没有你要借阅的书!");}
}

4、归还图书
public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("归还图书………………");System.out.println("请输入你要归还的图书:");Scanner in =new Scanner(System.in);String bookname=in.nextLine();int Size= bookList.getUserSize();for(int i=0;i<Size;i++){Book book=bookList.getBook(i);if(book.getName().equals(bookname)&&book.isBorrowed()){System.out.println("归还成功!");book.setBorrowed(false);//System.out.println(book);return;}}System.out.println("没有你要归还的书!");}
}

5、新增图书
public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("新增图书………………");Scanner in=new Scanner(System.in);if(bookList.isFull()){System.out.println("书架满了,无法新增图书了!");return;}System.out.println("请输入图书的名称:");String name=in.nextLine();System.out.println("请输入图书的作者:");String author=in.nextLine();System.out.println("请输入图书的价格:");int price=in.nextInt();Book book=new Book(name,author,price);int pos= bookList.getUserSize();bookList.setBook(pos,book);bookList.setUserSize(pos+1);}
}

6、删除图书
public class DeleteOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("删除图书………………");System.out.println("请输入你要删除的图书:");Scanner in =new Scanner(System.in);String bookname=in.nextLine();int Size= bookList.getUserSize();for(int i=0;i<Size;i++){Book book=bookList.getBook(i);if(book.getName().equals(bookname)){for(int j=i;j<Size;j++){Book bookl=bookList.getBook(j+1);bookList.setBook(j,bookl);}bookList.setUserSize(Size-1);System.out.println("删除成功!");//System.out.println(book);return;}}System.out.println("没有你要删除的书!");}
}

7、显示图书
public class ShowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("显示图书………………");int Size= bookList.getUserSize();for(int i=0;i<Size;i++){Book book=bookList.getBook(i);System.out.println(book);}}
}

8、退出系统
public class ExitOperation implements IOperation {@Overridepublic void work(Bookshelf bookshelf) {System.out.println("退出图书...");int sz=bookshelf.getBooknum();// 遍历置为 nullfor (int i = 0; i <sz ; i++) {bookshelf.setBooks(i,null);}System.out.println("图书系统正在退出中...");// 系统退出System.exit(-1);}
}

这时我们就可以用如下方法来整合了:
super(name);this.iOperations=new IOperation[]{new ExitOperation(),new FindOperatino(),new AddOperation(),new DeleteOperation(),new ShowOperation()};
这样就可以通过数组的不同下标来实现功能了,会变得方便许多。
三、用户类
作为一个图书管理系统,我们应当设置不同的用户特性,如增删书籍应该是管理员才有的权限,借阅书籍是普通用户需要实现的功能,但同时他们又有许多的共性,如姓名等信息,这时我们就可以利用继承的思想先定义一个父类User来记录用户的共性:
abstract public class User {protected String name;protected IOperation[] iOperations;public User(String name) {this.name = name;}public void doIoperation(int choice, BookList bookList){this.iOperations[choice].work(bookList);}public abstract int menu();
}
接着我们就可以写出各个具体的子类用户了
管理员用户:
public class AdminUser extends User {public AdminUser(String name) {super(name);this.iOperations=new IOperation[]{new ExitOperation(),new FindOperatino(),new AddOperation(),new DeleteOperation(),new ShowOperation()};}public int menu(){System.out.println("*********管理员菜单*********");System.out.println("1.查找图书");System.out.println("2.新增图书");System.out.println("3.删除图书");System.out.println("4.显示图书");System.out.println("0.退出系统");System.out.println("**************************");System.out.println("请输入你的操作:");Scanner in=new Scanner(System.in);int choice=in.nextInt();return choice;}
}

普通用户:
public class NormalUser extends User{public NormalUser(String name) {super(name);this.iOperations=new IOperation[]{new ExitOperation(),new FindOperatino(),new BorrowedOperation(),new ReturnOperation()};}public int menu(){System.out.println("*********普通用户菜单*******");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("**************************");System.out.println("请输入你的操作:");Scanner in=new Scanner(System.in);int choice=in.nextInt();return choice;}
}

四、主函数逻辑实现
public class Main {public static User login(){Scanner in =new Scanner(System.in);System.out.println("欢迎来到图书管理系统");System.out.println("请输入你的名字:");String name=in.nextLine();System.out.println("请输入你的身份:");String identity=in.nextLine();if(identity.equals("管理员")){AdminUser adminUser=new AdminUser(name);return adminUser;}else{NormalUser normalUser=new NormalUser(name);return normalUser;}}public static void main(String[] args) {BookList bookList=new BookList();User user=login();while(true){int choice=user.menu();user.doIoperation(choice,bookList);}}
}
通过主函数逻辑来整合我们写过的各个模块,从而实现最终功能。
总结
从这个项目中我们可以看到,在父类User中实例化了iOperations对象,建立了一个以IOperation为元素的数组,接着在子类中按顺序建立创建好的功能接口,从而可以直接用下标来访问相应接口,这利用继承、多态、接口等思想,可谓是对面向对象思想的深度诠释。
那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。作者还是一个萌新,如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

相关文章:
【java】图书管理系统
有了前几篇文章关于封装、继承、多态、接口等的介绍,想必各位读者对java面向对象的思想有了一定的认识。接下来这篇文章就让我们趁热打铁,利用所学知识做一个小项目图书管理系统吧 目录 一、图书类 1、book类 2、bookList类 二、功能实现 1、IOpera…...
C#实现约瑟夫环算法
目录 1.约瑟夫环定义 2.约瑟夫环算法实现需要注意的地方 3.通过一个例子来演示这个过程 4.三人的约瑟夫环示例 4.十二人的约瑟夫环示例 1.约瑟夫环定义 约瑟夫环即设有n个人坐成一个圈,从某个人开始报数,数到m的人出列,接着从出列的下一…...
游戏服务端配置“热更”及“秒启动”终极方案(golang/ygluu/卢益贵)
游戏服务端配置“热更”及“秒启动”终极方案 ygluu 卢益贵 关键词:游戏微服务架构、游戏服务端热更、模块化解耦、golang 目录 一、前言 二、异步线程加载/重载方案 三、配置表碎片化方案 四、指针间接引用 五、重载通知 六、示例代码 七、相关连接 一、…...
鸿蒙开发的入门
鸿蒙开发的入门 注册并实名认证华为开发者账户 华为官网 注册 有账户可以直接登录 并进行实名认证 下载并安装开发工具 鸿蒙开发使用的语言 java js c/c 仓颉 手机app java 硬件 c/c 应用开发工具的下载地址 Windows(64-bit) 下载地址 程序的运行过程 解析config.j…...
为什么要减少Http的请求以及如何减少Http请求
为什么要减少Http的请求 减少 HTTP 请求的数量是优化网页性能的一个重要策略,原因有以下几点: 1.延迟:每个 HTTP 请求都会有一定的网络延迟。即使数据量很小,请求和响应的往返时间也可能相当长,特别是在网络条件不好…...
Linux性能测试工具整理
性能测试工具:Unixbench lmbench stream iozone fio netperf spec2000 spec2006 一、unixbench unixbench主要是用于系统基础性能测试,unixbench也包含一些非常简单的2D和3D图形测试 UnixBench一个基于系统的基准测试工具,不单纯是CPU 内存 …...
前端路由history路由和hash路由的区别?原理?
前端路由是指在单页应用程序(SPA)中通过改变 URL 路径来实现页面切换和导航的机制。在前端开发中,有两种主要的前端路由实现方式:基于 History API 的路由(history-based routing)和基于哈希(Ha…...
AcWing 727. 菱形——像拼图一样做题
题目描述] 分析: 利用程序根据输入的整数,画出由字符*构成的该整数阶的实心菱形。给出一个示例: n 7 n7 n7。 * * * * * * * * * * * * * * * * * * * * * * * * * 我们将采取拆解问题,通过四个部分的…...
深入理解生成型大型语言模型:自监督预训练、细调与对齐过程及其应用
分析概述 本文主要介绍了生成型大型语言模型(LLM)的预训练过程,特别是通过下一个令牌(token)预测的自监督学习方法,以及后续的细调(finetuning)和对齐(alignment&#x…...
个人简历主页搭建系列-03:Hexo+Github Pages 介绍,框架配置
今天的更新内容主要是了解为什么选择这个网站搭建方案,以及一些前置软件的安装。 Why Hexo? 首先我们了解一下几种简单的网站框架搭建方案,看看对于搭建简历网站的需求哪个更合适。 在 BuiltWith(网站技术分析工具)上我们可以…...
【堆、位运算、数学】算法例题
目录 十九、堆 121. 数组中的第K个最大元素 ② 122. IPO ③ 123. 查找和最小的K对数字 ② 124. 数据流的中位数 ③ 二十、位运算 125. 二进制求和 ① 126. 颠倒二进制位 ① 127. 位1的个数 ① 128. 只出现一次的数字 ① 129. 只出现一次的数字 II ② 130. 数字范围…...
IDEA 多个git仓库项目放一个窗口
1、多个项目先通过新建module或者CtrlAltShiftS 添加module引入 2、重点是右下角有时候git 分支视图只有一个module的Repositories。这时候需要去设置把多个git仓库添加到同一个窗口才能方便提交代码。 3、如果Directory Mappings已经有相关项目配置,但是灰色的&…...
全球变暖(蓝桥杯,acwing每日一题)
题目描述: 你有一张某海域 NN 像素的照片,”.”表示海洋、”#”表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. .......其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就…...
多数据源 - dynamic-datasource | 集成 Quartz 及 ShardingJDBC
文章目录 集成 Quartz引入 quartz-starter配置数据源参数创建任务配置 Quartz 实际使用的数据源方式一: 自定义 SchedulerFactoryBeanCustomizer方式二: 使用@QuartzDataSource来指明quartz数据源集成 ShardingJDBC项目引入 shardingsphere 依赖分别配置shardingjdbc和多数据…...
四连杆机构运动学仿真 | 【Matlab源码+理论公式文本】| 曲柄滑块 | 曲柄摇杆 | 机械连杆
【程序简介】💻🔍 本程序通过matlab实现了四连杆机构的运动学仿真编程,动态展现了四连杆机构的运动动画,同时给出了角位移、角速度和角加速度的时程曲线,除了程序本身,还提供了机构运动学公式推导文档&…...
Lightroom Classic 2024 for mac 中文激活:强大的图像后期处理软件
对于追求极致画面效果的摄影师来说,Lightroom Classic 2024无疑是Mac平台上的一款必备软件。它凭借其强大的功能和出色的性能,赢得了众多摄影师的青睐。 软件下载:Lightroom Classic 2024 for mac 中文激活版下载 在Lightroom Classic 2024中…...
程序员下班以后做什么副业合适?
我就是一个最普通的网络安全工程师,出道快10年了,不出意外地遭遇到瓶颈期,但是凭技术在各大平台挖漏洞副业,硬是妥妥扛过来了。 因为对于程序员来讲,这是个试错成本很低、事半功倍的选择。编程技能是一种强大生产力&a…...
HSE化工应急安全生产管理平台:衢州某巨大型化工企业的成功应用
在化工行业中,安全生产一直是至关重要的议题。为了提高生产安全性、降低成本并提升企业形象,衢州某巨大型化工企业引入了HSE化工应急安全生产管理平台,取得了显著的改善和获益。 该平台的核心功能包括风险管理和应急预案制定。通过对化工生产…...
塑料工厂5G智能制造数字孪生可视化平台,推进塑料行业数字化转型
塑料工厂5G智能制造数字孪生可视化平台,推进塑料行业数字化转型。塑料制造行业作为重要的工业领域,亟需借助这一平台实现产业升级与转型,以适应市场的变化和提高生产效率。传统的塑料制造过程往往存在生产效率低下、资源浪费、环境污染等问题…...
HTML万字学习总结
html文本标签特殊符号图片音频与视频超链接表单列表表格语义标签(布局) html文本标签 标签简介<html></html>根目录<head></head>规定文档相关的配置信息(元数据<body></body>元素表示文档的内容<meta></meta>表示…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
