java实现简单图书管理系统(附带源码)

项目要求

该项目会用到类和对象,封装、继承、多态、接口、等,会帮你巩固并加强这类知识

设计要求及思路 

        1.要求有两套系统分别给管理员普通用户使用,经过开始的选择会有两个对应功能不同的菜单,这里两种角色我们可以放一个包里并且用到继承和多态,可以去很多冗余 

f3b4aa1661744b2d977012c638f0557b.pngd5f0b697a3e948439daeda830421b862.png

        2. 功能项目,对应有七个不同的功能,我们需要用到接口

        3. 定义一个书本类使用封装,并用书架来接受书本数组

        4. 包的创建,每个方法放在对应的包下面

3f9e2661a60e4984a41923d13e288d62.png

项目实现

book包

        Book类

        书类就是存放一些书的属性:书名,作者,价格,类型,是否被借出,以上用封装包装好,并用get and set方法提供接口并需要,对参数进行重写,提供一个to string()方法的重写,用于后续对书本的打印,大部分都可以通过编译器快速生成。

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=" + (isBorrowed==false?"未借出":"借出") +'}';}
}

        BookList类

        书架类创建的作用就是用来存放一个书本类的数组,并定义一个变量记录书本的个数,这里的也是用到封装,参数都用private修饰,所以需要定义get and set方法,但是这里对数组的方法需要注意一下,直接生成的完成不了我们想要的功能,需要修改一下

public class BookList {private Book[] books;private int BookSize;public BookList(){//构造里面初始化数据一定要加上thisthis.books=new Book[10];this.books[0]=new Book("sgyy","lgz",10,"xiaoshuo");this.books[1]=new Book("hlm","cxq",10,"xiaoshuo");this.books[2]=new Book("xyj","wce",10,"xiaoshuo");this.BookSize=3;}public Book getBooks(int pos) {return books[pos];//通过调用BookLis.getBook(i),传入pos参数,可以获得pos1····位置对应的书}public void setBooks(Book book,int pos) {books[pos]=book;//将传入的Book覆盖到pos位置}public int getBookSize() {return BookSize;}public void setBookSize(int bookSize) {BookSize = bookSize;}
}

user包

        user父类

        这里因为需要有两个不同的菜单,所以我们定义一个user类,让AdminUser和NormalUser分别继承这个类,且都需要不同的菜单,所以在user定义一个抽象菜单,所以user也就需要为抽象类

package user;
import book.BookList;
import operation.IOperation;public abstract class User {protected String name;public User(String name) {this.name = name;}protected IOperation[] iOperations;//创建操作数组public void doIoperation(int choice,BookList bookList){this.iOperations[choice].work(bookList);//会通过传递的choice参数调用不同的方法}public abstract int menu();
}

         AdminUser类 & NormalUser类

        两个类分别构造自己的功能数组重写自己的菜单,并且需要返回一个选择

//管理员类
package user;
import operation.*;
import java.util.Scanner;public class AdminUser extends User{public AdminUser(String name){super(name);this.iOperations=new IOperation[]{new ExitOperation(),//这里排列是有讲究的,第一个元素对应数组第一个元素new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation(),};}@Overridepublic 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 scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}

 

//普通用户类
package user;
import operation.*;
import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name){super(name);this.iOperations=new IOperation[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation(),new ShowOperation(),};}@Overridepublic 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 scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}

这里因为两种用户需要调用的方法不一样,菜单也不一样,所以我们在父类定义一个功能数组,并在子类调用时对其实例化,其中doOperation方法就是功能菜单和功能数组之间的桥梁,通过菜单返回的不同的值调用不同的功能方法,也就是实现功能数组的choice下标对应的方法

Main类

import book.BookList;
import user.*;
import java.util.Scanner;public class Main {public static User login(){System.out.println("请输入你的姓名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();System.out.println("1.管理员 2.普通用户");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.doIoperation(choice,bookList);}}
}

 这里主函数内容就是新建一个书架,并通过login()选择出用户是管理员还是普通用户,再对其用户死循环获取菜单返回值,并执行该返回值对应的功能方法

 operation包

        IOperation类

        该类是接口,其中主要是为了被operation包其他类其他继承后重写work方法,其中传递BookList就是为了 功能方法的实施对象是新建的booklist

package operation;
import book.BookList;public interface IOperation {public void work(BookList bookList);
}

         ExitOperation类

        该类就是两个菜单都有的退出方法,也是最简单的

package operation;
import book.BookList;public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统");System.exit(0);}
}

        ShowOperation类

展示所有图书的功能,获取当前书本的个数 int size=bookList.getBookSize();通过booklist获取书书本的个数并用size来接受,for循环打印

package operation;
import book.Book;
import book.BookList;public class ShowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("展示所有图书");int size=bookList.getBookSize();for (int i = 0; i < size; i++) {Book book=bookList.getBooks(i);System.out.println(book);}}
}

        FindOperation类

这里的if(book.getName().equals(name))比较费解一点,就是将当前输入的a书名i位置的书名equals()方法比较,equals()结果就是true或者false

public class FindOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("查书");System.out.println("请输入要查找的书名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int size=bookList.getBookSize();for (int i = 0; i < size; i++) {Book book=bookList.getBooks(i);if(book.getName().equals(name)){System.out.println("已查找到该书");System.out.println(book);return;}}System.out.println("抱歉暂无此书");}
}

        AddOperation类

        添加函数,这里需要注意2点

  1. 就是添加的书本是否已经在书架上,如果在就不需要添加了,如果不在就可以继续添加
  2.   在用完scanner.nextInt();需要用到scanner.nextLine();//吞回车,不然会出现报错
package operation;
import book.*;
import java.util.Scanner;public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("增加图书");System.out.println("请输入要增加的书名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int size=bookList.getBookSize();for (int i = 0; i < size; i++) {Book book=bookList.getBooks(i);if(book.getName().equals(name)){System.out.println("已有该图书无需再添加");return;}}System.out.println("请输入作者");String author=scanner.nextLine();System.out.println("请输入价格");int price=scanner.nextInt();scanner.nextLine();//吞回车System.out.println("请输入书类型");String type=scanner.nextLine();Book book=new Book(name,author,price,type);bookList.setBooks(book,size);bookList.setBookSize(size+1);}
}

        DelOperation类

删除方法,这里需要注意几点

  1. 当前书架是否有需要删除的a书,如果本来就没有a书就不需要删除,这里用到index的值来检查是否有a书
  2. 删除方法选择的是从后向前覆盖
  3. 最后覆盖完会有一个本书出现两次,就将最后的位置置空
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;public class DelOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("删除图书");System.out.println("请输入要删除的书名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int index=-1;//索引int size=bookList.getBookSize();for (int i = 0; i < size; i++) {Book book=bookList.getBooks(i);if(book.getName().equals(name)){index=i;}}if(index==-1){System.out.println("未找到该书");return;}for (int j = index; j < size-1; j++) {Book book=bookList.getBooks(j+1);bookList.setBooks(book,j);}bookList.setBookSize(size-1);System.out.println("删除成功");}
}

          BorrowOperation类

           借阅方法,需要注意两点 

  1. book.isBorrowed(),获取到的是true或者false,如果是借阅,需要a书是false状态
  2.  book.setBorrowed(true);//改为借出
package operation;
import book.*;
import java.util.Scanner;public class BorrowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("借书");System.out.println("请输入要借阅的书名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int size=bookList.getBookSize();for (int i = 0; i < size; i++) {Book book=bookList.getBooks(i);if(book.getName().equals(name)){if(!book.isBorrowed()) {//未借出的是falsebook.setBorrowed(true);//改为借出System.out.println("借阅成功");return ;}}}System.out.println("抱歉暂无此书");}
}

   

        ReturnOperation类

 这里就和借阅方法没什么区别了

package operation;
import book.*;
import java.util.Scanner;public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("还书");System.out.println("请输入要还的书名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int size=bookList.getBookSize();for (int i = 0; i < size; i++) {Book book=bookList.getBooks(i);if(book.getName().equals(name)){if(book.isBorrowed()) {//借出的是truebook.setBorrowed(false);//改为借出System.out.println("还书成功");return ;}}}System.out.println("抱歉此书不在还书范围中");}
}

 

好了以上就是图书管理系统的全部内容了,希望可以多多点赞评论收藏支持一下 

java代码: 欢迎您,哈哈哈哈哈哈哈哈https://gitee.com/poetics-c/java-code-.git这里是我的码云图书管理系统代码在20240413文件下,感谢大家点赞收藏支持

 

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

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

相关文章

华为ensp中nat地址转换(静态nat 动态nat NAPT 和Easy IP)配置命令

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月15日12点03分 实验拓扑 接下来我会分几个方面初步将静态nat和napt easy ip 首先基本的环境配置 AR1的基本配置 //基本的IP配置和默认路由指向外网 <Huawei&…

神仙级Python入门教程(超级详细),从零基础入门到精通,从看这篇开始

一、初聊Python 1.为什么要学习Python&#xff1f; 在学习Python之前&#xff0c;你不要担心自己没基础或“脑子笨”&#xff0c;我始终认为&#xff0c;只要你想学并为之努力&#xff0c;就能学好&#xff0c;就能用Python去做很多事情。在这个喧嚣的时代&#xff0c;很多技…

Java反序列化-(LazyMap)CC1链与CC6链

(LazyMap)CC1链 原版的CC1链&#xff1a; https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections1.java可以发现对比之前的 TransformMap版本的CC1链&#xff0c;从这里开始就不一样了 分析LazyMap.get() 直接进入到Laz…

OnlyOffice配置minio文件存储

OnlyOffice配置minio文件存储 一、部署minio测试环境 拉取minio镜像 为了快速验证&#xff0c;此处使用docker安装部署minio服务。先拉取minio最新版镜像资源。 -bash-4.2# docker pull minio/minio:latest -bash-4.2# docker images | grep minio minio/minio …

企业业务系统与呼叫中心话务系统的无缝对接实现方案

在当今的商业环境中&#xff0c;企业的业务系统与呼叫中心话务系统的对接显得尤为重要。这种对接不仅提高了企业的运营效率&#xff0c;还增强了客户服务的体验。本文将探讨如何实现企业业务系统与呼叫中心话务系统的无缝对接&#xff0c;并分析其带来的好处。 一、对接的必要性…

用html写一个有趣的鬼魂动画

<!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>一个有趣的鬼魂动画</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.m…

2024第十五届蓝桥杯 JAVA B组

目录 前言&#xff1a;试题 A: 报数游戏试题 B: 类斐波那契循环数试题C:分布式队列 前言&#xff1a; 没参加这次蓝桥杯算法赛&#xff0c;十四届蓝桥杯被狂虐&#xff0c;对算法又爱又恨&#xff0c;爱我会做的题&#xff0c;痛恨我连题都读不懂的题&#x1f62d;,十四届填空只…

如何在Linux系统部署Joplin笔记并结合内网穿透实现无公网IP远程访问

文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具&#xff0c;拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能&#xff0c;…

简单粗暴解决 wampapache 突然无法启动错误1053

问题是因为没有安装:vc_redist_x64 导致的 全网最简单粗暴解决下 DirectX_v4.1修复

芯来科技、IAR和MachineWare携手加速符合ASIL标准RISC-V汽车芯片创新

支持软件开发团队在虚拟硬件平台上进行固件和MCAL开发 芯来科技&#xff08;Nuclei&#xff09;、IAR和MachineWare紧密合作&#xff0c;加速RISC-V ASIL合规汽车解决方案的创新。此次合作简化了汽车电子的固件和MCAL开发&#xff0c;提供了虚拟和物理硬件平台之间的无缝集成。…

SQL单表查询(2)

对查询结果排序 ◆使用ORDER BY子句 – 可以按一个或多个属性列排序 – 升序&#xff1a;ASC&#xff1b;降序&#xff1a;DESC&#xff1b;缺省值为升序 ◆ 当排序列含空值时 – ASC&#xff1a;排序列为空值的元组最后显示 – DESC&#xff1a;排序列为空值的元组最先显…

护眼台灯哪个牌子好?护眼灯十大品牌推荐,绝对真香!

对于有孩子的家庭&#xff0c;特别是阅读爱好者&#xff0c;晚上阅读时的光线问题至关重要。昏暗环境长时间阅读&#xff0c;会严重伤害孩子的眼睛。因此&#xff0c;选择一款合适的护眼台灯显得尤为重要。但市场上品牌众多&#xff0c;护眼台灯哪个牌子好?这往往让人难以抉择…

Linux 5.10 Pstore 学习之(二) 原理学习

目录 编译框架模块初始化pstore子系统ramoops模块初始化实例化注册回调数据结构 pstore_blk模块pstore_zone模块 测试扩展调试 编译框架 目标结构 linux_5.10/fs/pstore/ ├── blk.c ├── ftrace.c ├── inode.c // 核心1 ├── internal.h ├── Kconfig ├── …

(四)C++自制植物大战僵尸游戏启动流程

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/ErelL 一、启动方式 鼠标左键单机VS2022上方工具栏中绿色三角按钮&#xff08;本地Windows调试器&#xff09;进行项目启动。第一次启动项目需要编译项目中所有代码文件&#xff0c;编译生成需要一定的时间。不同性能的电…

CentOS7使用Docker搭建Joplin Server并实现多端同步与公网使用本地笔记

文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具&#xff0c;拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能&#xff0c;…

基于springboot实现常州地方旅游管理系统项目【项目源码+论文说明】

基于springboot实现旅游管理系统演示 摘要 随着旅游业的迅速发展&#xff0c;传统的旅游信息查询方式&#xff0c;已经无法满足用户需求&#xff0c;因此&#xff0c;结合计算机技术的优势和普及&#xff0c;针对常州旅游&#xff0c;特开发了本基于Bootstrap的常州地方旅游管…

内存卡乱码?别担心,这里有你的数据恢复秘籍!

一、乱码困扰&#xff1a;内存卡数据成迷团 在数字化时代&#xff0c;内存卡作为我们存储数据的重要工具&#xff0c;承载着大量的照片、视频、文档等重要信息。然而&#xff0c;当有一天我们插上内存卡&#xff0c;发现原本井井有条的文件变成了乱码&#xff0c;那种焦虑和无…

5.Godot节点和功能及Node节点属性分析

1. 节点和功能的关系 节点 Node &#xff0c;用于实现一种功能&#xff0c;例如&#xff0c;Sprite 节点&#xff0c;用于图片的显示一个节点的功能取决于它挂载了哪些子节点&#xff0c;它包含了哪些功能的子节点&#xff0c;就包含了对应子节点表示的功能节点是可选的&#…

在个人电脑上,本地部署llama2-7b大模型

文章目录 前言原理效果实现 前言 我想也许很多人都想有一个本地的ai大语言模型,当然如果能够摆脱比如openai,goole,baidu设定的语言规则,可以打破交流界限,自由交谈隐私之类的,突破规则,同时因为部署在本地也不担心被其他人知道,那最好不过了 那究竟有没有这样的模型呢? llam…

怎么修改图片大小?在线图片处理的方法介绍

在日常生活中&#xff0c;我们经常需要调整图片大小以适应不同的网络上传要求。不管是微信、QQ换头像背景图片&#xff0c;还是各种社交媒体相册&#xff0c;都需要对图片改大小&#xff0c;今天就介绍几个关于修改图片大小的方法&#xff0c;可以不用下载安装就能在线图片处理…