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

【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】图书管理系统

有了前几篇文章关于封装、继承、多态、接口等的介绍&#xff0c;想必各位读者对java面向对象的思想有了一定的认识。接下来这篇文章就让我们趁热打铁&#xff0c;利用所学知识做一个小项目图书管理系统吧 目录 一、图书类 1、book类 2、bookList类 二、功能实现 1、IOpera…...

C#实现约瑟夫环算法

目录 1.约瑟夫环定义 2.约瑟夫环算法实现需要注意的地方 3.通过一个例子来演示这个过程 4.三人的约瑟夫环示例 4.十二人的约瑟夫环示例 1.约瑟夫环定义 约瑟夫环即设有n个人坐成一个圈&#xff0c;从某个人开始报数&#xff0c;数到m的人出列&#xff0c;接着从出列的下一…...

游戏服务端配置“热更”及“秒启动”终极方案(golang/ygluu/卢益贵)

游戏服务端配置“热更”及“秒启动”终极方案 ygluu 卢益贵 关键词&#xff1a;游戏微服务架构、游戏服务端热更、模块化解耦、golang 目录 一、前言 二、异步线程加载/重载方案 三、配置表碎片化方案 四、指针间接引用 五、重载通知 六、示例代码 七、相关连接 一、…...

鸿蒙开发的入门

鸿蒙开发的入门 注册并实名认证华为开发者账户 华为官网 注册 有账户可以直接登录 并进行实名认证 下载并安装开发工具 鸿蒙开发使用的语言 java js c/c 仓颉 手机app java 硬件 c/c 应用开发工具的下载地址 Windows(64-bit) 下载地址 程序的运行过程 解析config.j…...

为什么要减少Http的请求以及如何减少Http请求

为什么要减少Http的请求 减少 HTTP 请求的数量是优化网页性能的一个重要策略&#xff0c;原因有以下几点&#xff1a; 1.延迟&#xff1a;每个 HTTP 请求都会有一定的网络延迟。即使数据量很小&#xff0c;请求和响应的往返时间也可能相当长&#xff0c;特别是在网络条件不好…...

Linux性能测试工具整理

性能测试工具&#xff1a;Unixbench lmbench stream iozone fio netperf spec2000 spec2006 一、unixbench unixbench主要是用于系统基础性能测试&#xff0c;unixbench也包含一些非常简单的2D和3D图形测试 UnixBench一个基于系统的基准测试工具&#xff0c;不单纯是CPU 内存 …...

前端路由history路由和hash路由的区别?原理?

前端路由是指在单页应用程序&#xff08;SPA&#xff09;中通过改变 URL 路径来实现页面切换和导航的机制。在前端开发中&#xff0c;有两种主要的前端路由实现方式&#xff1a;基于 History API 的路由&#xff08;history-based routing&#xff09;和基于哈希&#xff08;Ha…...

AcWing 727. 菱形——像拼图一样做题

题目描述] 分析&#xff1a; 利用程序根据输入的整数&#xff0c;画出由字符*构成的该整数阶的实心菱形。给出一个示例&#xff1a; n 7 n7 n7。 * * * * * * * * * * * * * * * * * * * * * * * * * 我们将采取拆解问题&#xff0c;通过四个部分的…...

深入理解生成型大型语言模型:自监督预训练、细调与对齐过程及其应用

分析概述 本文主要介绍了生成型大型语言模型&#xff08;LLM&#xff09;的预训练过程&#xff0c;特别是通过下一个令牌&#xff08;token&#xff09;预测的自监督学习方法&#xff0c;以及后续的细调&#xff08;finetuning&#xff09;和对齐&#xff08;alignment&#x…...

个人简历主页搭建系列-03:Hexo+Github Pages 介绍,框架配置

今天的更新内容主要是了解为什么选择这个网站搭建方案&#xff0c;以及一些前置软件的安装。 Why Hexo? 首先我们了解一下几种简单的网站框架搭建方案&#xff0c;看看对于搭建简历网站的需求哪个更合适。 在 BuiltWith&#xff08;网站技术分析工具&#xff09;上我们可以…...

【堆、位运算、数学】算法例题

目录 十九、堆 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已经有相关项目配置&#xff0c;但是灰色的&…...

全球变暖(蓝桥杯,acwing每日一题)

题目描述&#xff1a; 你有一张某海域 NN 像素的照片&#xff0c;”.”表示海洋、”#”表示陆地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. .......其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿&#xff0c;例如上图就…...

多数据源 - dynamic-datasource | 集成 Quartz 及 ShardingJDBC

文章目录 集成 Quartz引入 quartz-starter配置数据源参数创建任务配置 Quartz 实际使用的数据源方式一: 自定义 SchedulerFactoryBeanCustomizer方式二: 使用@QuartzDataSource来指明quartz数据源集成 ShardingJDBC项目引入 shardingsphere 依赖分别配置shardingjdbc和多数据…...

四连杆机构运动学仿真 | 【Matlab源码+理论公式文本】| 曲柄滑块 | 曲柄摇杆 | 机械连杆

【程序简介】&#x1f4bb;&#x1f50d; 本程序通过matlab实现了四连杆机构的运动学仿真编程&#xff0c;动态展现了四连杆机构的运动动画&#xff0c;同时给出了角位移、角速度和角加速度的时程曲线&#xff0c;除了程序本身&#xff0c;还提供了机构运动学公式推导文档&…...

Lightroom Classic 2024 for mac 中文激活:强大的图像后期处理软件

对于追求极致画面效果的摄影师来说&#xff0c;Lightroom Classic 2024无疑是Mac平台上的一款必备软件。它凭借其强大的功能和出色的性能&#xff0c;赢得了众多摄影师的青睐。 软件下载&#xff1a;Lightroom Classic 2024 for mac 中文激活版下载 在Lightroom Classic 2024中…...

程序员下班以后做什么副业合适?

我就是一个最普通的网络安全工程师&#xff0c;出道快10年了&#xff0c;不出意外地遭遇到瓶颈期&#xff0c;但是凭技术在各大平台挖漏洞副业&#xff0c;硬是妥妥扛过来了。 因为对于程序员来讲&#xff0c;这是个试错成本很低、事半功倍的选择。编程技能是一种强大生产力&a…...

HSE化工应急安全生产管理平台:衢州某巨大型化工企业的成功应用

在化工行业中&#xff0c;安全生产一直是至关重要的议题。为了提高生产安全性、降低成本并提升企业形象&#xff0c;衢州某巨大型化工企业引入了HSE化工应急安全生产管理平台&#xff0c;取得了显著的改善和获益。 该平台的核心功能包括风险管理和应急预案制定。通过对化工生产…...

塑料工厂5G智能制造数字孪生可视化平台,推进塑料行业数字化转型

塑料工厂5G智能制造数字孪生可视化平台&#xff0c;推进塑料行业数字化转型。塑料制造行业作为重要的工业领域&#xff0c;亟需借助这一平台实现产业升级与转型&#xff0c;以适应市场的变化和提高生产效率。传统的塑料制造过程往往存在生产效率低下、资源浪费、环境污染等问题…...

HTML万字学习总结

html文本标签特殊符号图片音频与视频超链接表单列表表格语义标签(布局) html文本标签 标签简介<html></html>根目录<head></head>规定文档相关的配置信息&#xff08;元数据<body></body>元素表示文档的内容<meta></meta>表示…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...