Java实现图书管理系统

news/2024/4/29 14:44:48/文章来源:https://blog.csdn.net/m0_56911284/article/details/127177051

作者:~小明学编程 

文章专栏:JavaSE基础

格言:目之所及皆为回忆,心之所想皆为过往
在这里插入图片描述

今天给大家带来的是用Java实现的图书管理系统。

目录

需求

图书类

创建图书类

创建书架

Operation

IOperation接口

添加图书AddOperation

借阅图书BorrowOperation

删除图书DelOperation

打印图书DisplayOperation

退出系统ExitOperation

查询书籍FindOperation

归还书籍ReturnOperation

user

User

NormalUser

AdminUser

Main

演示


需求

1、简单的登录
2、管理端
查阅书籍
增加书籍
删除书籍
打印书籍列表
退出
3、用户端
查询书籍
借阅书籍
归还书籍
退出

图书类

首先我们创建一个book包,在包里面放一个Book类和一个BookList类。

然后创建一个operation里面放的是我们的各种操作方法。

接着是我们的user类,里面分别放我们的管理员的类和普通成员的类。

最后就是我们的Main类,我们的程序从这里开始执行。

创建图书类

首先我们需要创建一个图书类,该类里面是我们的图书属性例如书名,作者名,价格等等。

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)?",已借出":",未借出") +'}';}
}

定义好我们的基本变量之后,然后给出set和get方法,方便之后对数据的修改,最后重写一下我们的toString()方法,便于直接打印。

创建书架

创建好我们书的类之后就是该创建书架了,所谓书架就是存放我们的书的,这里我们可以在里面给一个数组,用于存放不同的书。

然后就是给出我们书的数量,这里我们定义一个userSize用来记录我们图书的数量。

public class BookList {private Book[] books = new Book[10];private int userSize;public BookList() {books[0] = new Book("三体","刘慈欣",80,"科幻");books[1] = new Book("平凡的世界","路遥",88,"文学");books[2] = new Book("明朝那些事儿","当年明月",180,"历史");this.userSize = 3;}public int getUserSize() {return userSize;}public void setUserSize(int userSize) {this.userSize = userSize;}//获取到pos位置的书public Book getPos(int pos) {return this.books[pos];}//设置pos位置下标的一本书public void setBooks(int pos,Book book) {this.books[pos] = book;}
}

然后就是set和get方法用于我们对userSize的调整,同时我们给出了调整我们书架里面书的方法。

这里我们给了一个构造方法,用于给我们的书架初始化放上三本书(小编我最爱看的对我影响最大的三本书哈哈),并且指定了书的个数userSize的大小为3。

Operation

该包里面装着我们的所有的对bookList的操作,还有一个接口IOperation,

IOperation接口

public interface IOperation {void work(BookList bookList);
}

添加图书AddOperation

public class AddOperation implements IOperation {public void work(BookList bookList) {Scanner scanner = new Scanner(System.in);System.out.println("添加图书操作");System.out.println("请输入书名:");String name = scanner.nextLine();System.out.println("请输入作者:");String Author = scanner.nextLine();System.out.println("请输入类型:");String type = scanner.nextLine();System.out.println("请输入价格:");int price = scanner.nextInt();Book book = new Book(name,Author,price,type);bookList.setBooks(bookList.getUserSize(),book);bookList.setUserSize(bookList.getUserSize()+1);}
}

借阅图书BorrowOperation

public class BorrowOperation implements IOperation {public void work(BookList bookList) {System.out.println("借书操作");Scanner scanner = new Scanner(System.in);System.out.println("请输入想要借阅的书:");String name = scanner.nextLine();for (int i = 0; i < bookList.getUserSize(); i++) {if (name.equals(bookList.getPos(i).getName())==true) {if(bookList.getPos(i).isBorrowed()==true) {//判断一下该书是否已经被借阅了System.out.println("该书已经被借阅");} else {bookList.getPos(i).setBorrowed(true);System.out.println("借阅成功!");}return;}}System.out.println("您想要借阅的书不存在");}
}

删除图书DelOperation

public class DelOperation implements IOperation {public void work(BookList bookList) {System.out.println("删除图书操作");Scanner scanner = new Scanner(System.in);System.out.println("输入想要删除图书的名称:");String name = scanner.nextLine();//循环遍历所有图书for (int i = 0; i < bookList.getUserSize(); i++) {//找到书名后进行删除if (name.equals(bookList.getPos(i).getName())==true) {for (int j = i; j < bookList.getUserSize()-1; j++) {bookList.setBooks(j,bookList.getPos(j+1));}bookList.setBooks(bookList.getUserSize(), null);//防止内存泄漏bookList.setUserSize(bookList.getUserSize()-1);System.out.println("删除完毕!");return;}}System.out.println("您要删除的图书不存在");}
}

打印图书DisplayOperation

public class DisplayOperation implements IOperation {public void work(BookList bookList) {System.out.println("打印图书操作");for (int i = 0; i < bookList.getUserSize(); i++) {System.out.println(bookList.getPos(i));}}
}

退出系统ExitOperation

public class ExitOperation implements IOperation {public void work(BookList bookList) {System.out.println("退出操作");System.exit(0);}
}

查询书籍FindOperation

public class FindOperation implements IOperation {public void work(BookList bookList) {System.out.println("查询操作");Scanner scanner = new Scanner(System.in);System.out.println("请输入查找的书名:");String name = scanner.nextLine();for (int i = 0; i < bookList.getUserSize(); i++) {if (name.equals(bookList.getPos(i).getName())==true) {System.out.println("信息如下");System.out.println(bookList.getPos(i));return;}}System.out.println("没有找到该书!");}
}

归还书籍ReturnOperation

public class ReturnOperation implements IOperation {public void work(BookList bookList) {System.out.println("返回操作");Scanner scanner = new Scanner(System.in);System.out.println("请输入想要归还的书:");String name = scanner.nextLine();for (int i = 0; i < bookList.getUserSize(); i++) {if (name.equals(bookList.getPos(i).getName())==true) {if(bookList.getPos(i).isBorrowed()==false) {//判断一下该书是否已经被借阅了System.out.println("该书已经归还");} else {bookList.getPos(i).setBorrowed(false);System.out.println("归还成功!");}return;}}System.out.println("您想要归还的书不存在");}
}

以上就是我们对BookList的操作部分。

user

我们的user这个部分是我们的分部管理,因为我们登录的时候会提醒我们是普通用户登录还是管理员登录,所以我们至少需要创建两个类,但是这两个类肯定会有很多相似的方法和成员,所以这个时候我们就再创建一个User的抽象类,然后让我们AdminUser管理员的类和我们的NormalUser普通类分别继承我们的User

User

public abstract class User {protected String name;    //用户姓名protected IOperation[] iOperation;    //定义接口类型的数组每个元素指向实现接口的对象public User(String name) {this.name = name;}//此时的menu为后续的动态绑定做准备public abstract int menu();public void doWork(int choice, BookList bookList) {iOperation[choice].work(bookList);}
}

这里我们的抽象类有name成员,还有IOperation类型的数组,这里也解释了为什么我们刚刚要创建接口,因为有了接口我们后面可以向接口里面放我们的操作方法,因为其它的类都实现了我们的接口并且重写了接口里面的work()方法。

NormalUser

public class NormalUser extends User{public NormalUser(String name) {super(name);this.iOperation = new IOperation[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation(),};}public int menu() {System.out.println("********管理员菜单********");System.out.println("     欢迎"+this.name+"进入菜单");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);int choice = scanner.nextInt();return choice;}}

这里首先是我们的构造方向,先帮父类构造,然后将IOperation进行初始化里面放着是我们普通用户所能进行的一系列操作,再下面就是我们的菜单方法,因为我们的普通用户和管理员所能进行的操作是不一样的,同时选择我们需要的操作。

AdminUser

public class AdminUser extends User{public AdminUser(String name) {super(name);this.iOperation = new IOperation[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new DisplayOperation(),};}public int menu() {System.out.println("********管理员菜单********");System.out.println("      欢迎"+this.name+"进入菜单");System.out.println("1.查找图书");System.out.println("2.新增图书");System.out.println("3.删除图书");System.out.println("4.显示图书");System.out.println("0.退出系统");System.out.println("************************");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}

管理员类就是菜单里面的方法和IOperation数组与前面有一点区别。

Main

public class Main {public static User login() {System.out.println("请输入你的姓名:");Scanner scanner  = new Scanner(System.in);String name = scanner.nextLine();System.out.println("请输入你的身份:1->管理员 0->普通用户");int choice = scanner.nextInt();//根据选择直接返回我们的对象。if (choice==1) {return new AdminUser(name);} else {return new NormalUser(name);}}public static void main(String[] args) {BookList bookList = new BookList();//发生向上转型User user = login();//此时将发生动态绑定while (true) {int choice = user.menu();user.doWork(choice, bookList);}}}

首先看我们的主函数,我么new了一个BookList也就是我们的书架,然后开始登录操作输入身份之后最后返回一个用户的对象,此时我们拥有了两个对象,一个是书架bookList,还有就是我们的用户对象,然后我们的用户就可以对我们的书架进行一系列的操作了。

首先就是打印我们的菜单,顺便返回我们的操作,接着拿着我们的操作choice和我们的书架bookList去执行,user.doWork(),拿着我们的choice找到我们IOperation找到对应的操作最后完成指定的功能。

演示

 

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

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

相关文章

【考研复试】计算机专业考研复试英语常见问题三(个人选择/学业规划篇)

相关链接&#xff1a; 【考研复试】计算机专业考研复试英语常见问题一&#xff08;家庭/家乡/学校篇&#xff09;【考研复试】计算机专业考研复试英语常见问题二&#xff08;研究方向/前沿技术/本科毕设篇&#xff09;【考研复试】计算机专业考研复试英语常见问题三&#xff0…

kubernetes集群基于kubeadm部署以及常见问题解决

文章目录集群类型主机规划环境初始化检查操作系统版本关闭防火墙设置主机名主机名解析时间同步关闭 SELinux关闭 swap 分区将桥接的IPv4流量传递到iptables的链开启ipvs安装容器运行时&#xff08;Docker&#xff09;卸载Docker旧版本&#xff1a;安装 gcc 相关安装Docker设置阿…

一个Adapter+recycleview实现多种布局,区分布局中

文章目录&#x1f353;&#x1f353;简述&#x1f353;&#x1f353;效果图&#x1f353;&#x1f353;代码&#x1f96d;&#x1f96d;AllAdapter.java&#x1f96d;&#x1f96d; FuritAdapter3.java&#x1f96d;&#x1f96d;MainActivity.java(主函数)&#x1f96d;&#…

【全网热点】打造全网最全爱心代码仓库【火速领取爱心】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【代码实践】 目录&#x1f319;正文&#x1f30f;部分效果在线演示&#x1f30f;部分效果截屏&#x1f338;文末祝…

个人设计web前端大作业 基于html5制作美食菜谱网页设计作业代码

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Linux的前世今生

14天学习训练营导师课程&#xff1a; 互联网老辛《 符合学习规律的超详细linux实战快速入门》 努力是为了不平庸~ 学习有些时候是枯燥的&#xff0c;但收获的快乐是加倍的&#xff0c;欢迎记录下你的那些努力时刻&#xff08;学习知识点/题解/项目实操/遇到的bug/等等&#xf…

2022年深度学习最新研究成果

一、开源深度学习编译器 二、 开源深度学习加速器 三、AITemplate引擎 四、微型机器学习框架 参考文献&#xff1a;https://arxiv.org/pdf/1510.00149.pdf 五、Contrastive Learning 对比学习综述 六、Diffusion Model 扩散模型综述 Diffusion Models: A Comprehensive Surv…

Java面向对象中阶(七)

面向对象中阶 1、包 2、访问修饰符 3、封装 4、继承 5、方法重写(override) 6、多态 7、Object类的常用方法 8、断点调试 1、包 包的本质&#xff1a; 实际上就是创建不同的文件夹来保存类文件 包的三大作用&#xff1a; 区分相同名字的类当类很多时&#xff0c;可以…

【freeRTOS】操作系统之六-低功耗模式

六&#xff0c;低功耗模式 本章节为大家讲解 FreeRTOS 本身支持的低功耗模式 tickless 实现方法&#xff0c;tickless 低功耗机制是当前小型 RTOS 所采用的通用低功耗方法&#xff0c;比如 embOS&#xff0c;RTX 和 uCOS-III&#xff08;类似方法&#xff09;都有这种机制。ti…

原来背后都是商业利益,看到网易和暴雪的解约之后,原来是要定以后的KPI,坐地起价,但是一个时代已经结束了,都留在了记忆之中

1&#xff0c;大瓜新闻&#xff0c;2023年1月暴雪游戏中国将不会续约&#xff1f;&#xff1f; 2&#xff0c;原因是主要坐地起价&#xff0c;提高分成设置KPI 还好网易有自研游戏&#xff0c;估计早知道会有现在这样的情况。 提前做好了准备。还记得有个公司叫 九城吗&#x…

创建自己的函数库

创建自己的函数库前言一、什么是STM32标准函数库1.定义&#xff1a;2.作用&#xff1a;3.对比&#xff1a;二、构建库函数1.修改寄存器地址封装2.定义访问的结构体指针和引脚3.创建封装函数3.1创建拉低引脚函数3.2创建引脚初始化函数总结前言 回顾一下&#xff0c;前面点亮led…

堆 (带图详解)

文章目录1.堆的基本概念1. 概念2.性质1.必须为完全二叉树2.满足大堆/小堆成立的条件3.存储方式1.逻辑结构2.物理结构4. 孩子与父亲之间下标的关系2.堆的基本实现1.push——插入1.代码2. 情况分析情况1情况23. 向上调整算法1.过程分析2. 临界条件的判断2. pop—— 删除1.代码2. …

redis哨兵系列1

需要配合源码一起康~ 9.1 哨兵基本概念 官网手册yyds&#xff1a;https://redis.io/docs/manual/sentinel/ redis主从模式&#xff0c;如果主挂了&#xff0c;需要人工将从节点提升为主节点&#xff0c;通知应用修改主节点的地址。不是很友好&#xff0c;so Redis 2.8之后开…

C# async / await 用法

目录 一、简介 二、异步等待返回结果 三、异步方法返回类型 四、await foreach 五、Task.Delay 结束 一、简介 await 运算符暂停对其所属的 async 方法的求值&#xff0c;直到其操作数表示的异步操作完成。 异步操作完成后&#xff0c;await 运算符将返回操作的结果&…

使用STM32CubeMX实现按下按键,电平反转

需提前学习&#xff1a;使用STM32CubeMX实现LED闪烁 目录 原理图分析 按键部分原理图分析 LED部分原理图分析 STM32CubeMX配置 关于STM32CubeMXSYS的Debug忘记配置Serial Wire处理办法 GPIO配置 LED的GPIO配置 KEY1配置 关于PA0后面这个WKUP是什么&#xff1f; 那么啥…

利用ogg微服务版将oracle同步到kafka

ogg微服务版可以再界面上配置抽取、复制进程&#xff0c;不必进入到shell中进行配置&#xff0c;并且图形化界面可以看到更多信息。 系统架构 源端安装ogg for oracle 19C , 目标端安装ogg for bigdata 21C kafka 2.2 数据库&#xff1a;19C 所有软件安装在同台服务器上&#…

理解Linux32位机器下虚拟地址到物理地址的转化

文章目录前言一、基本概念介绍二、虚拟地址到物理地址的转化过程总结前言 简要介绍LINUX32位系统下虚拟地址到物理地址的转化过程。 一、基本概念介绍 在32位机器下&#xff0c;IO的基本单位是块&#xff08;块&#xff1a;4kb),在程序编译成可执行程序时也划分好了以4kb为单…

JVM【类加载与GC垃圾回收机制】

JVM【类加载与GC垃圾回收机制】&#x1f34e;一.JVM&#x1f352;1.1JVM简介&#x1f352;1.2JVM执行流程&#x1f34e;二.JVM运行时数据区&#x1f352;2.1 程序计数器(线程私有)&#x1f352;2.2 栈(线程私有)&#x1f352;2.3 堆(线程共享)&#x1f352;2.4 方法区(线程共享…

OWASP API SECURITY TOP 10

目录 1. API 安全风险 2. 细说TOP10 1. Broken Object Level Authorization 2. Broken User Authentication 3 Excessive Data Exposure 4 Lack of Resources & Rate Limiting 5 Broken Function Level Authorization 6 Mass Assignment 7 security misconfigura…

【原创】使用Golang的电商搜索技术架构实现

作者&#xff1a;黑夜路人 时间&#xff1a;2022年11月 一、背景&#xff1a; 现在搜索技术已经是非常主流的应用技术&#xff0c;各种优秀的索引开源软件已经很普遍了&#xff0c;比如 Lucene/Solr/Elasticsearch 等等主流搜索索引开源软件&#xff0c;让我们搭建一个优秀的…