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);}
}
操作示例
这里展示一下管理员界面的部分操作逻辑:
补充
缺点:没有做到持久化存储。以后可以进行升级:将数据存储到数据库或者文件夹中
当前用到的只是数组。后期可以做成网页交互。
好了,图书管理系统就说到这里,大家再见!
相关文章:
Java实现一个简单的图书管理系统(内有源码)
简介 哈喽哈喽大家好啊,之前作者也是讲了Java不少的知识点了,为了巩固之前的知识点再为了让我们深入Java面向对象这一基本特性,就让我们完成一个图书管理系统的小项目吧。 项目简介:通过管理员和普通用户的两种操作界面࿰…...
网络安全等级保护2.0
等保介绍 信息系统运维安全管理规定(范文)| 资料 等保测评是为了符合国家法律发挥的需求,而不是安全认证(ISO) 一般情况没有高危安全风险一般可以通过,但若发现高位安全风险则一票否决 二级两年一次 三…...
【sql】MongoDB 增删改查 高级用法
【sql】MongoDB 增删改查 高级用法 相关使用文档 MongoDB Query API — MongoDB Manual https://www.mongodb.com/docs/manual/reference/sql-comparison //增 //新增数据2种方式 db.msg.save({"name":"springboot😀"}); db.msg.insert({&qu…...
怎么做才能有效更新和优化产品手册文档
更新和优化产品手册文档是确保用户获得准确和最新信息的重要步骤。如果不及时地更新和优化信息,很容易导致我们的产品有滞后性,不能满足客户最新的需求。所以looklook总结了一些相关内容,以下是一些建议来更新和优化产品手册文档:…...
#P0867. 小武老师的烤全羊
问题描述 小武老师特别喜欢吃烤全羊,小武老师吃烤全羊很特别,为什么特别呢?因为他有 1010 种配料(芥末、孜然等),每种配料可以放 11 到 33 克,任意烤全羊的美味程度为所有配料质量之和。 现在&…...
视频汇聚/视频云存储/视频监控管理平台EasyCVR提升网络稳定小tips来啦!
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...
C 语言学习
数组的指针 在c中,几乎所以使用数组名的表达式中,数组名的值是一个指针常量,也就是数组 第 一个元素的地址。注意这个值是指针常量,不是变量。 int a[10]{ ….....}; int *q; q&a[0] ; <>…...
TCP网络连接异常情况的处理
在网络连接中,经常会出现一些意外情况,导致TCP连接不能正常工作,对于这些意外情况,TCP内部有自己的解决方法 一.进程崩溃 在网络通讯时可能会出现进程突然崩溃的情况,当进程崩溃后进程就没了,就会导致进程…...
单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.10语句
1 表达式语句 表达式语句由表达式加上分号“;”组成。其一般形式为: 表达式; 执行表达式语句就是计算表达式的值。例如 caa; 2 函数调用语句 由函数名、实际参数加上分号“;”组成。其一般形式为: 函数名(实际参数表); 例如 printf(“Hello !”);…...
Windows 通过服务名称搜索软件启动路径启动软件
文章目录 Windows 通过服务名称搜索软件启动路径启动软件 Windows 通过服务名称搜索软件启动路径启动软件 注意:QQ管家和360安全,正常情况下使用 taskkill 无法停止,因为在安全设置中有个“自保护”,正常情况下会默认勾选上&#…...
如何更高效的写出更健全的代码,一篇文章教会你如何拥有一个良好的代码风格
前言:在平常的写代码的过程中,或多或少的遇到很多奇怪的 bug ,尤其是一些大的程序,明明上一部分都是好好的,写下一块的时候突然多几百个 bug 的情况,然后这一块写完了后编译的时候直接傻眼了,看…...
Java如何调用接口API并返回数据(两种方法)
Java如何调用接口API并返回数据(两种方法) java处理请求接口后返回的json数据-直接处理json字符串 处理思路: 将返回的数据接收到一个String对象中(有时候需要自己选择性的取舍接收) 再将string转换为JSONObject对象 …...
极狐GitLab 价值流管理之「总时间图」使用指南
本文来源:about.gitlab.com 作者:Haim Snir 译者:极狐(GitLab) 市场部内容团队 对于软件研发管理者来说,了解在整个研发过程中时间都耗费在了哪些地方,是进行交付价值优化的关键洞察。GitLab / 极狐GitLab 新的价值流分…...
Mybatis入门和环境搭建
文章目录 一. Mybatis的简介1. 什么是ORM?2. 什么是持久层?3. Mybatis的作用 二. Mybatis环境搭建1. 搭建一个数据库2. 创建maven项目并导入相关依赖3. Mybatis相关插件安装4. Mybatis.cfg.xml核心配置文件 三. 基于ssm逆向工程的使用1. 配置generatorConfig.xml2.…...
React 全栈体系(二)
第二章 React面向组件编程 一、基本理解和使用 1. 使用React开发者工具调试 2. 效果 2.1 函数式组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>1_函数式组件</title> </head> &l…...
【Linux】socket编程(二)
目录 前言 TCP通信流程 TCP通信的代码实现 tcp_server.hpp编写 tcp_server.cc服务端的编写 tcp_client.cc客户端的编写 整体代码 前言 上一章我们主要讲解了UDP之间的通信,本章我们将来讲述如何使用TCP来进行网络间通信,主要是使用socket API进…...
七大出海赛道解读,亚马逊云科技为行业客户量身打造解决方案
伴随全球化带来的新机遇和国内市场的进一步趋于饱和,近几年,中国企业出海快速升温,成为了新的创业风口和企业的第二增长曲线。从范围上看,出海市场由近及远,逐步扩张。从传统的东南亚市场,到成熟的北美、欧…...
【Maven教程】(三)基础使用篇:入门使用指南——POM编写、业务代码、测试代码、打包与运行、使用Archetype生成项目骨架~
Maven基础使用篇 1️⃣ 编写 POM2️⃣ 编写业务代码3️⃣ 编写测试代码4️⃣ 打包和运行5️⃣ 使用 Archetype生成项目骨架 1️⃣ 编写 POM 到目前为止,已经大概了解并安装好了Maven环境, 现在,我们开始创建一个最简单的 Hello World 项目。如果你是初次…...
Spring Boot + Spring Data JPA 实现数据库操作的标准示例
环境搭建 本篇使用H2内存数据库演示Spring Data JPA 的使用。 导入JPA和H2的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><…...
JVM——类加载器
回顾一下类加载过程 类加载过程:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义…...
async/await 编程理解
博客主要是参考 Asynchronous Programming in Rust ,会结合简单的例子,对 async 和 await 做比较系统的理解,如何使用 async 和 await 是本节的重点。 async 和 await 主要用来写异步代码,async 声明的代码块实现了 Future 特性&a…...
1. Java基础知识介绍
文章目录 1. Java基础知识介绍1. 简单输入输出1.1 输入1.2 输出 2. 数据类型2.1 基本数据类型2.2 引用数据类型 3. 函数4. 类基础知识5. 小结 1. Java基础知识介绍 1. 简单输入输出 在Java编程中,我们经常需要与用户进行交互,以获取输入并输出结果。Ja…...
基础shell小技巧01
1. 命令替换 shell脚本中最有用的特性之一是可以从命令输出中提取信息并将其赋给变量。把输出赋给变量之后,就可以随意在脚本中使用了。在脚本中处理数据时,这个特性显得尤为方便。 有两种方法可以将命令输出赋给变量。 反引号(࿰…...
微信小程序--data的赋值与取值的几种方式
通过小程序官方文档可知: 赋值一定需要注意。需要setData的使用,这样页面才刷新,数据才会改变,并且分清that和this的使用 Page() 函数用来注册一个页面。接受一个 object 参数,其指定页面的初始数据、生命周期函数、事…...
条码通讯配置
由Leuze(劳易测) LSIS 222 M5M-R1/MA208i系统组成 连接说明及器件明细: 打开条码调试软件BPS Configuration tool对M208i进行ip 和端口号进行配置,条码选择作为客户端,输入ip和端口号,选择串口通讯波特…...
知网G4期刊《高考》简介及投稿要求
知网G4期刊《高考》简介及投稿要求 一、《高考》期刊简介: 主管单位:长春市委宣传部 主办单位:长春出版社 国内刊号22-1372/G4 国际刊号1673-6265 代号12-240 编辑单位:《高考》杂志社 出版周期:旬刊 类 …...
第7章 CPU前端优化
接下来讨论如何使用CPU监控特性寻找CPU上运行的代码中可被调优的位置。 标准的算法和数据结构在性能敏感型工作负载并不总能表现的很好。例如,在“扁平化”数据结构的冲击下,链表基本上快被放弃了。传统链表中的每个节点都是动态分配的,除了…...
idea新建Java-maven项目时,出现Dependency‘xxx(jar包名)‘ not found的解决方案
项目场景: 项目场景:使用idea创建maven项目时,导入简单依赖时(本文以mysql-connector-java为例)。 问题描述 问题: 首先,在创建新的maven项目中,出现下列两种情况: &am…...
STM32--USART串口
文章目录 通信接口串口通信硬件电路电平标准参数时序 USART主要特性框图 数据帧发送器 波特率发生器SWART串口发送与接收工程串口收发数据包 通信接口 通信接口是指连接中央处理器(CPU)和标准通信子系统之间的接口,用于实现数据和控制信息在不…...
2023年Java毕业设计题目推荐,怎样选题?500道毕业设计题目推荐
大家好,我是程序员徐师兄,最近有很多同学咨询,说毕业设计了,不知道选怎么题目好,有哪些是想需要注意的。 今天,我整理了一些Java毕业设计的题目,可以参考一下,希望对大家有所帮助 文章目录 一、…...
做一个中文域名购物网站要多少钱/如何建立个人网址
报错信息如上图所示,解决步骤: 1. 首先是检查这个MainActivity.java是不是真的存在,且包名和路径无误; 2. 如果文件存在,且包名和路径没有问题,那么就打开你项目所在的/android/app/build.gradle文件&#…...
仙桃做企业网站的/好用的推广平台
import pandas as pd def convert_to_html(result,title):d {}index 0for t in title:d[] result[index]index 1df pd.DataFrame(d)#如数据过长,可能在表格中无法显示,加上pd.set_option语句可以避免这一情况pd.set_option(max_colwidth,200)df df …...
公司网站建设济南/seo免费推广软件
现在大多数人使用的计算机操作系统都是64位的,最近开了一门微机原理的课,需要对汇编语言编写的程序进行调试,但是64位的系统默认不搭载debug程序,编写的程序无法用系统自带的dos模式调试。在网上查了很多经验已完美解决windows下调…...
wordpress首显示全文页/上海百度搜索排名优化
又是期末又是实训TA的事耽搁了好久……先把写好的放上博客吧相关随笔:使用额外的文件假如你跑的job除了输入以外还需要一些额外的文件(side data),有两种选择:大文件所谓的大文件就是大小大于设置的local.cache.size的文件,默认是…...
杭州网企业网站建设/网站搜索引擎优化的方法
30 words a day 4.1-4.8每日蓝桥5题 4.10开始每日力扣2题 5.1开始每日一章《数据结构与算法之美》 第6周:结束面向对象下,预习javaFX 3.31学完接口,内部类,lambda。 4.1学完枚举类,对象与回收垃圾,修…...
wordpress主题制作全过程(三):html静态模板制作/识图找图
1.设置系统环境变量,找到Path,在Path的值后面添加Oracle Client路径,每个值之间用英文的;隔开,即你的Oracle Client的解压目录。D:\DEV\instantclient_12_12.添加一个新的系统变量键的名称:TNS_ADMIN值:D:\…...