Java实现一个简单的图书管理系统(内有源码)

简介

哈喽哈喽大家好啊,之前作者也是讲了Java不少的知识点了,为了巩固之前的知识点再为了让我们深入Java面向对象这一基本特性,就让我们完成一个图书管理系统的小项目吧。

项目简介:通过管理员和普通用户的两种操作界面,利用其中的方法以及对象之间的交互,来实现对图书的管理

源码

book包

主要包含book对象和book List对象以及Main方法

Book类

描述书的有关信息,构造方法和各种getter,setter方法

public class Book {//书的属性:名字,作者,价格,类型,借出情况private String name;private String author;private int price;private String type;private boolean borrowed;public Book(){}public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return author*/public String getAuthor() {return author;}/*** 设置* @param author*/public void setAuthor(String author) {this.author = author;}/*** 获取* @return price*/public int getPrice() {return price;}/*** 设置* @param price*/public void setPrice(int price) {this.price = price;}/*** 获取* @return type*/public String getType() {return type;}/*** 设置* @param type*/public void setType(String type) {this.type = type;}/*** 获取* @return borrowed*/public boolean isBorrowed() {return borrowed;}/*** 设置* @param borrowed*/public void setBorrowed(boolean borrowed) {this.borrowed = borrowed;}public String toString() {return "Book{name = " + name + ", author = " + author + ", price = " + price + ", type = " + type + "," +/*", borrowed = " + borrowed*/((isBorrowed() == true) ? " 已被借出" : " 未被借出")+ "}";}
}

BookList

作为书架,利用数组存放书籍. 

public class BookList {//定义数组成员表示存放书的数组public Book[] books;//表示书架上存放书的数量private int useSize;//设置最大容量private static final int DEFAULT_CAPACITY = 10;public BookList() {this.books = new Book[DEFAULT_CAPACITY];//先提前放好三本书this.books[0] = new Book("三国演义", "罗贯中", 10, "小说");this.books[1] = new Book("西游记", "吴承恩", 9, "小说");this.books[2] = new Book("红楼梦", "曹雪芹", 19, "小说");this.useSize = 3;}//书架上书的数量的getter和setter方法public int getUseSize() {return useSize;}public void setUseSize(int useSize) {this.useSize = useSize;}//通过下标获取对应书籍的getter方法public Book getBook(int pos) {return books[pos];}//通过下标和传入的书对象设置对应书籍的setter方法public void setBooks(int pos, Book book) {books[pos] = book;}public Book[] getBooks() {return books;}
}

Main方法

主要的操作逻辑 

import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {//可以利用返回值的向上转型 达到发挥的一致性public static User Login() {System.out.println("请输入你的姓名:");Scanner sc = new Scanner(System.in);String name = sc.nextLine();System.out.println("请输入你的身份:1.管理员 2.普通用户 ->");int choice = sc.nextInt();if (choice == 1) {//管理员return new AdminUser(name);} else if (choice == 2) {//普通用户return new NormalUser(name);}return null;}public static void main(String[] args) {BookList booklist = new BookList();//user指向哪个对象 就看返回值User user = Login();while(true) {int choice = user.menu();//System.out.println("choice:" + choice);//根据choice来决定调用哪个方法user.doOperation(choice, booklist);}}
}

user包

主要包含user以及相关对象

父类User

包含基本属性:姓名,menu(菜单)方法的声明,doOperation(执行方法操作)方法的声明。

import book.BookList;
import operation.IOPeration;public abstract class User {protected String name;protected IOPeration[] ioperations;public User(String name) {this.name = name;}public abstract int menu();public void doOperation(int choice, BookList booklist) {ioperations[choice].work(booklist);bao}
}

子类AdminUser

包含管理员使用方法的数组和管理员菜单。

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()};}//管理员专用菜单public int menu() {System.out.println("*************管理员界面*************");System.out.println("hello " + 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("**********************************");System.out.println("请输入你的操作:");Scanner sc = new Scanner(System.in);int choice = sc.nextInt();return choice;}
}

子类NormalUser

包含普通用户使用方法的数组和普通用户菜单。

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 ReturnOperatoin(),};}//普通用户用菜单public int menu() {System.out.println("*************普通用户界面*************");System.out.println("hello " + this.name +"欢迎来到普通用户菜单!");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("************************************");System.out.println("请输入你的操作:");Scanner sc = new Scanner(System.in);int choice = sc.nextInt();return choice;}
}

Operation包

主要包含各种操作方法

IOPeration接口

后续使用所有方法继承这个接口,对bookList对象进行相关工作。

package operation;import book.BookList;public interface IOPeration {void work(BookList booklist);
}

AddOperation方法

添加图书的方法

package operation;import book.BookList;
import book.Book;import java.util.Scanner;public class AddOperation implements IOPeration{@Overridepublic void work(BookList booklist) {System.out.println("增加书籍");Scanner sc = new Scanner(System.in);int currentSize = booklist.getUseSize();//用户输入书籍信息System.out.println("请输入书籍的名称:");String name =sc.nextLine();System.out.println("请输入书籍的作者:");String author = sc.nextLine();System.out.println("请输入书籍的类型:");String type = sc.nextLine();//注意:这里将回车放到最后,如果放在前面,下一个nextLine()会读入回车System.out.println("请输入书籍的价格:");int price = sc.nextInt();//创建一个新的book对象导入刚才的信息Book book = new Book(name, author, price, type);//检查书架当中是否有这本书for (int i = 0; i < currentSize; i++) {Book book1 = booklist.getBook(i);//判断书架中的书与新导入书的引用是否相等if(book1 == book) {System.out.println("书架上有这本书,添加失败");return;}}//判断添入书是否超出书架最大容量,未超出则添入书籍if(currentSize == booklist.getBooks().length) {System.out.println("书架已满,添加失败");} else {//在书架中添入书籍booklist.setBooks(currentSize, book);//存放书的数量+1booklist.setUseSize(currentSize + 1);System.out.println("添加成功");}}}

FindOperation方法

寻找图书的方法

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperation implements IOPeration{@Overridepublic void work(BookList booklist) {System.out.println("寻找书籍");Scanner sc = new Scanner(System.in);System.out.println("请输入您要寻找的书籍");String name = sc.nextLine();int currentSize = booklist.getUseSize();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("没有找到这本书");}
}

DelOperation方法

删除图书所使用的方法

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("删除书籍");//1.找到有没有这本书System.out.println("请输入要删除书的名字");Scanner sc = new Scanner(System.in);String name = sc.nextLine();int currentSize = bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)) {//2.如果有,从这本书后面开始,从前往后向前覆盖for (; i < currentSize; i++) {Book book1 = bookList.getBook(i + 1);bookList.setBooks(i, book1);}//3.将最后一本书置为空bookList.setBooks(currentSize - 1, null);//数组最大容量减少bookList.setUseSize(currentSize - 1);System.out.println("删除成功!");return;}}//未删除成功的情况System.out.println("该书不存在,删除失败");return;}
}

ShowOperation方法

显示所有图书的方法

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("删除书籍");//1.找到有没有这本书System.out.println("请输入要删除书的名字");Scanner sc = new Scanner(System.in);String name = sc.nextLine();int currentSize = bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)) {//2.如果有,从这本书后面开始,从前往后向前覆盖for (; i < currentSize; i++) {Book book1 = bookList.getBook(i + 1);bookList.setBooks(i, book1);}//3.将最后一本书置为空bookList.setBooks(currentSize - 1, null);//数组最大容量减少bookList.setUseSize(currentSize - 1);System.out.println("删除成功!");return;}}//未删除成功的情况System.out.println("该书不存在,删除失败");return;}
}

BorrowOperation方法

借入图书的方法

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class BorrowOperation implements IOPeration{@Overridepublic void work(BookList booklist) {System.out.println("借出书籍");/** 1.你要借阅什么书* 2.你要借阅的书存不存在* 3.如何完成借阅过程 isBorrowed->true 已借出 isBorrowed->false 未借出* */System.out.println("请输入你要借阅的图书名字");Scanner sc = new Scanner(System.in);String name = sc.nextLine();int currentSize = booklist.getUseSize();for (int i = 0; i < currentSize; i++) {Book book = booklist.getBook(i);//该图书存在的情况if(book.getName().equals(name) && book.isBorrowed() == false) {book.setBorrowed(true);System.out.println("借出成功");System.out.println(book);return;}}//未被借出的情况System.out.println("该图书已被借出或者不存在,借阅失败");return;}
}

ReturnOperation方法

归还图书的方法

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class ReturnOperatoin implements IOPeration{@Overridepublic void work(BookList booklist) {System.out.println("归还书籍");System.out.println("请输入你要归还的图书");Scanner sc = new Scanner(System.in);String name = sc.nextLine();int currentSize = booklist.getUseSize();for (int i = 0; i < currentSize; i++) {Book book = booklist.getBook(i);//该图书存在的情况if(book.getName().equals(name) && book.isBorrowed() == true) {book.setBorrowed(false);System.out.println("归还成功");System.out.println(book);return;}}//未被借出的情况System.out.println("该图书已被归还或者不存在,归还失败");return;}
}

ExitOperation方法

退出系统所使用的方法。

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

操作示例

这里展示一下管理员界面的部分操作逻辑:

 

 

补充

缺点:没有做到持久化存储。以后可以进行升级:将数据存储到数据库或者文件夹中

           当前用到的只是数组。后期可以做成网页交互。

好了,图书管理系统就说到这里,大家再见!

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

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

相关文章

主力吸筹指标及其分析和使用说明

文章目录 主力吸筹指标指标代码分析使用说明使用配图主力吸筹指标 VAR1:=REF(LOW,1); VAR2:=SMA(MAX(LOW-VAR1,0),3,1)/SMA(ABS(LOW-VAR1),3,1)*100; VAR3:=EMA(VAR2,3); VAR4:=LLV(LOW,34); VAR5:=HHV(VAR3,34); VAR7:=EMA(IF(LOW<=VAR4,(VAR3+VAR5*2)/2,0),3); /*底线:0,…

让eslint的错误信息显示在项目界面上

1.需求描述 效果如下 让eslint中的错误&#xff0c;显示在项目界面上 2.问题解决 1.安装 vite-plugin-eslint 插件 npm install vite-plugin-eslint --save-dev2.配置插件 // vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue import e…

基于黄金正弦算法优化的BP神经网络(预测应用) - 附代码

基于黄金正弦算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于黄金正弦算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.黄金正弦优化BP神经网络2.1 BP神经网络参数设置2.2 黄金正弦算法应用 4.测试结果&#xff1a;5…

C语言练习1(巩固提升)

C语言练习1 选择题 前言 “人生在勤&#xff0c;勤则不匮。”幸福不会从天降&#xff0c;美好生活靠劳动创造。全面建成小康社会的奋斗目标&#xff0c;为广大劳动群众指明了光明的未来&#xff1b;全面建成小康社会的历史任务&#xff0c;为广大劳动群众赋予了光荣的使命&…

采用typescript编写,实现ofd前端预览、验章

前言 浏览器内核已支持pdf文件的渲染&#xff0c;这极大的方便了pdf文件的阅读和推广。ofd文件作为国产板式标准&#xff0c;急需一套在浏览器中渲染方案。 本人研究ofd多年&#xff0c;分别采用qt、c# 开发了ofd阅读器。本人非前端开发人员&#xff0c;对js、typescript并不熟…

android Bitmap没有recycle()导致native内存暴增

android Bitmap没有recycle()导致native内存暴增 android8.0后&#xff0c;Bitmap从Java层转移到native层&#xff0c;此举虽然缓解了JVM的内存压力&#xff0c;也提升了图形的加载速度&#xff0c;但不恰当的Bitmap分配/释放逻辑&#xff0c;将导致内存问题深藏到native层&am…

windows开发环境搭建

下载msys2&#xff0c;官网下载即可&#xff1a; MSYS2 安装其他的编译工具&#xff08;貌似不需要把中间的命令全部执行&#xff09;&#xff1a; MSYS2使用教程——win10系统64位安装msys2最新版&#xff08;msys2-x86_xxxx.exe&#xff09;_msys64_Dreamhai的博客-CSDN博…

Maven 一键部署到 SSH 服务器

简介 利用 Maven Mojo 功能一键部署 jar 包或 war 包到远程服务器上。 配置 在 maven 的setting.xml 配置服务器 SSH 账号密码。虽然可以在工程的 pom.xml 直接配置&#xff0c;但那样不太安全。 <servers><server><id>iq</id><configuration&…

【C++代码】有序数组的平方,长度最小的子数组,螺旋矩阵 II--代码随想录

题目&#xff1a;有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 题解 数组其实是有序的&#xff0c; 只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的…

食品制造行业云MES系统解决方案

食品饮料行业大致可以分为初级产品加工、二次加工、食品制造、食品分装、调味品和饲料加工等几大类。由于处于产业链不同的位置&#xff0c;其管理存在一定的差异&#xff0c;那么食品行业的MES应该怎么建设呢&#xff1f; 食品饮料行业生产管理特点&#xff1a; 食品饮料行业…

定时任务,Timer,Quartz,Spring Task,Xxl-Job(分布式任务调度框架)

一、定时任务解决方案 1.Thread&#xff0c;Timer&#xff0c;Quartz&#xff0c;Spring Task Thread线程等待&#xff08;最原始最简单方式&#xff09;&#xff0c;创建一个thread&#xff0c;然后让它在while循环里一直运行着&#xff0c;通过sleep方法来达到定时任务的效…

全球Salesforce顾问薪资大揭秘!顾问如何升职加薪?

Salesforce顾问通过针对业务挑战提出、记录和分析需求&#xff0c;提供解决方案&#xff0c;从而帮助企业改善Salesforce的流程和效率。顾问是企业和Salesforce之间的桥梁。 Salesforce顾问的薪资一直是生态系统中的热门话题&#xff0c;备受求职者关注。本篇文章将分享提高顾…

Grafana Dashboard 备份方案

文章目录 Grafana Dashboard 备份方案引言工具简介支持的组件要求配置备份安装使用 pypi 安装grafana备份工具配置环境变量使用Grafana Backup Tool 进行备份恢复备份 Grafana Dashboard恢复 Grafana Dashboard结论Grafana Dashboard 备份方案 引言 每个使用 Grafana 的同学都…

基于微信小程序的物流管理系统3txar

在此基础上&#xff0c;结合现有物流管理体系的特点&#xff0c;运用新技术&#xff0c;构建了以 springboot为基础的物流信息化管理体系。首先&#xff0c;以需求为依据&#xff0c;对目前传统物流管理基础业务进行了较为详尽的了解和分析。根据需求分析结果进行了系统的设计&…

MyBatis动态sql

文章目录 一、MyBatis动态sql1.1 概述1.2 if元素1.3 foreach元素 二、模糊查询2.1 使用#{字段名}2.2 使用${字段名}2.3 使用concat{%,#{字段名},%}2.4 mybatis中#与$的区别 三、MyBatis结果映射3.1 区别3.2 应用场景 一、MyBatis动态sql 1.1 概述 MyBatis是一个Java持久化框架…

学习网络编程No.4【socket编程实战】

引言 北京时间&#xff1a;2023/8/19/23:01&#xff0c;耍了好几天&#xff0c;主要归咎于《我欲封天》这本小说&#xff0c;听了几个晚上之后逐渐入门&#xff0c;在闲暇时间又看了一下&#xff0c;小高潮直接来临&#xff0c;最终在三个昼夜下追完了&#xff0c;哈哈哈&…

【uni-app】压缩图片并添加水印

总体思路 dom 结点 这里的 cvHeight 和 cvWidth 初始时要设置为你后续需要压缩后的最大宽高。假设我们在图片上传后图片最大为 350 * 350 <u-upload :fileList"baseInfoFormData.entrustFileList" afterRead"afterFileRead" multiple></u-uploa…

容器和云原生(二):Docker容器化技术

目录 Docker容器的使用 Docker容器关键技术 Namespace Cgroups UnionFS Docker容器的使用 首先直观地了解docker如何安装使用&#xff0c;并快速启动mysql服务的&#xff0c;启动时候绑定主机上的3306端口&#xff0c;查找mysql容器的ip&#xff0c;使用mysql -h contain…

wireshark 基本使用

在Wireshark中&#xff0c;你可以使用过滤器来根据接口名称定位到特定的包。下面是一些常见的过滤器示例&#xff1a; 根据源或目的IP地址过滤&#xff1a; ip.src 192.168.0.1&#xff1a;过滤源IP地址为192.168.0.1的包。ip.dst 192.168.0.1&#xff1a;过滤目的IP地址为…