【javaSE】 实现图书管理系统

目录

整体思路

Book包

Book类

BookList类

user包

User类

NormalUser类

AdminUser管理员类

testmain包

opera包

IOPeration接口

普通用户

ExitOperation类

FindOperation类

BrrowOperation类

ReturnOperation类

管理员

AddOperation类

 DelOperation类

ShowOperation类

总结


整体思路

首先我们先来看一下我们要达到的效果

我们得有登录的姓名,与身份的选择

选择不同的身份对应不同的功能

比如选择管理员

选择普通用户

  

得有我们的图书

 博主在这里实现图书管理系统分为四个包进行实现

不会创建包的小伙伴可以去下方链接了解一下

【javaSE】面向对象程序三大特性之封装_遇事问春风乄的博客-CSDN博客https://blog.csdn.net/m0_71731682/article/details/132001012?spm=1001.2014.3001.5501

book包里面实现书类和书架类

opera包里我们用接口实现我们所需要在图书管理系统里实现的功能

testmain包里是我们的主函数所在

user包里用继承来实现我们所需要的管理者与借阅者类

实现所有类如下

接下来我会就每个里面的类进行讲解

Book包

Book类

在这个类实现的是我们图书该有的属性,与相应的构造方法,以及为了方便我们打印而重写的toString方法

代码实现如下

package book;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?"  已借阅":"  未借阅")+'}';}
}

BookList类

这里我们需要实现的有可以存放很多Book的数组

可以与增加、删除等功能的对应方法

代码实现

package book;public class BookList {//定义常量private static final int DEFAULT_SIZE = 20;//创建一个Book类型的数组,books里面存放的是多个book类型实例化的对象private Book[] books = new Book[DEFAULT_SIZE];//记录当前books数组当中 有多少本书?private int usedSize;public BookList() {books[0] = new Book("剑来","烽火戏诸侯",88,"修仙小说") ;books[1] = new Book("雪中悍刀行","烽火戏诸侯",66,"武侠小说");books[2] = new Book("流浪地球","刘慈欣",99,"科幻小说");books[3] = new Book("木苏里","某某",88,"爱情小说") ;books[4] = new Book("天官赐福","墨香铜臭",66,"爱情小说");books[5] = new Book("镇魂","priest",99,"爱情小说");//表示最初是三本this.usedSize = 6;}//读取这一本书public Book getBooK(int pos) {return this.books[pos];}//将该书写入该下标对应的位置,可以实现增加图书public void setBook(Book book) {this.books[usedSize] = book;}//后面会用于读取图书public int getUsedSize() {return usedSize;}//用于写入数组下标,与增加删除功能都有关系public void setUsedSize(int usedSize) {this.usedSize = usedSize;}}

user包

User类

这里的User类是作为NormalUser类与AdminUser类的父类

有相应的属性name与构造方法

会提供一个数组,供子类进行使用

有一个抽象类实现菜单

有一个方法会对用户选择后的结果进行传达,然后调用相对应功能的方法

实现代码

package user;import book.BookList;
import opera.IOPeration;public abstract class User {protected String name;protected IOPeration[] ioPerations;public User(String name) {this.name = name;}//创建一个抽象类,实现菜单public abstract int menu();//通过对象的相应调用与所传参数实现操作者选择的功能public void doWork(int choice, BookList bookList) {this.ioPerations[choice].work(bookList);}
}

NormalUser类

普通用户类,继承于User类

这里涉及一个数组,里面用于存放一些对象,来实现普通用户的功能

一个可以让用户选择的菜单,以及返回用户所做的选择

package user;import opera.*;import java.util.Scanner;
/*** @Author 12629* @Description:*/
public class NormalUser extends User{public NormalUser(String name) {super(name);//对ioPerations数组进行初始化,里面放的是使用者所需要功能类的对象ioPerations = new IOPeration[] {//0.退出系统new ExitOperation(),//1.查找图书new FindOperation(),//2.借阅图书new BrrowOperation(),//3.归还图书new ReturnOperation()};}public int menu() {System.out.println("****************************");System.out.println("hello "+name+" 欢迎来到阳光图书馆");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;}}

AdminUser管理员类

管理员类,继承于User类

这里涉及一个数组,里面用于存放一些对象,来实现管理员的功能

一个可以让管理员选择的菜单,以及返回管理员所做的选择

package user;import opera.*;import java.util.Scanner;public class AdminUser extends User{public AdminUser(String name) {super(name);//对ioPerations数组进行初始化,里面放的是管理员所需要功能类的对象ioPerations = new IOPeration[] {//0.退出系统new ExitOperation(),//1、查找图书new FindOperation(),//2.新增图书new AddOperation(),//3.删除图书new DelOperation(),//4.显示图书new ShowOperation()};}public int menu() {System.out.println("****************************");System.out.println("hello "+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 scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}}

testmain包

这里需要实现的是

可以根据用户选择不同的身份以及选择身份后所要进行的功能,调用相应的对象实现

代码实现

package testmain;import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;/*** @Author 12629* @Description:*/
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();//根据 choice 和   user 来确定 我到底 调用哪个对象的哪个操作user.doWork(choice, bookList);}}
}

opera包

这个包利用接口来实现这些功能

IOPeration接口

会有一个work的抽象方法,参数类型为BookList的

代码实现

package opera;import book.BookList;public interface IOPeration {void work(BookList bookList);
}

普通用户

ExitOperation类

用于退出该系统

这里的实现很简单,使用System.exit(0);就好

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

FindOperation类

用于查找图书

根据书名对Books数组里面的每一Book类的名字进行比对

package opera;import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperation  implements IOPeration{@Overridepublic void work(BookList bookList) {int currenSize = bookList.getUsedSize();System.out.println("请输入要查找书的名字");Scanner sc = new Scanner(System.in);String input = sc.nextLine();for(int i = 0;i < currenSize;i++) {Book book = bookList.getBooK(i);if(book.getName().equals(input)){System.out.println(book);return;}}System.out.println("查找书不存在");}}

BrrowOperation类

实现借阅功能

根据书名进行遍历是否有该图书

判断该图书的状态

借阅后改变该图书的状态,改为已借阅

代码实现如下

import java.util.Scanner;public class BrrowOperation implements IOPeration {public void work(BookList bookList) {System.out.println("借阅书籍!");System.out.println("请输入你要借阅的图书的名字:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBooK(i);if(name.equals(book.getName())) {if(book.isBorrowed()) {System.out.println("该书已经被借出! ");}else {book.setBorrowed(true);System.out.println("借阅图书成功!");}return;}}System.out.println("没有你要借阅的图书!");}}

ReturnOperation类

归还图书

根据书名进行遍历是否有该图书

判断该图书的状态

归还后改变该图书的状态,改为未借阅

代码实现如下

package opera;import book.Book;
import book.BookList;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 currentSize = bookList.getUsedSize();;for (int i = 0; i < currentSize; i++) {Book book = bookList.getBooK(i);if(name.equals(book.getName())) {book.setBorrowed(true);System.out.println("归还图书成功!");return;}}System.out.println("没有你要归还的图书!");}
}

管理员

ExitOperation类与FindOperation类为两种身份共有的,这里就不再赘述

AddOperation类

添加书籍

根据书名遍历该书是否已经存在

添加该书的所有属性

对Books数组进行更新,添加;这里就用到了我们前面在BookList里书写的方法,如下图

代码实现如下

package opera;import book.Book;
import book.BookList;import java.util.Scanner;public class AddOperation implements IOPeration{public void work(BookList bookList) {int currenSize = bookList.getUsedSize();System.out.println("新增图书!");System.out.println("请输入你要新增的图书的名字:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();for(int i = 0;i < currenSize;i++) {Book book = bookList.getBooK(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);//1. 获取到当前可以存放书的位置int currentSize = bookList.getUsedSize();//2. 把书放入指定位置bookList.setBook(book);//3. 书的有效个数+1bookList.setUsedSize(currentSize+1);System.out.println("添加成功");}}

 DelOperation类

删除书籍

根据书名遍历该书是否已经存在

寻找该书的数组下标,实现后面数组对前面的覆盖

现有图书数目减一,并将原来图书书目最后一位置为Null

代码实现

package opera;import book.Book;
import book.BookList;import java.util.Scanner;public class DelOperation implements IOPeration{public void work(BookList bookList) {System.out.println("删除图书!");System.out.println("请输入你要删除的图书:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();//1. 遍历数组当中 是否有你要删除的书  有记录下标int index = -1;int currentSize = bookList.getUsedSize();;for (int i = 0; i < currentSize; i++) {Book book = bookList.getBooK(i);if(name.equals(book.getName())) {index = i;break;}}//if(index == -1) {System.out.println("没有你要删除的书!");return;}for (int i = index; i < currentSize-1 ; i++) {//bookList[i] = bookList[i+1];Book book = bookList.getBooK(i+1);bookList.setBook(book);}//下标减一bookList.setUsedSize(currentSize-1);//每次删除 都要置空bookList.setBook(null);System.out.println("删除成功!");}
}

ShowOperation类

显示图书

遍历Books数组

使用重写的toString方法就好

代码实现

package opera;import book.BookList;import java.sql.SQLOutput;public class ShowOperation implements IOPeration{@Overridepublic void work(BookList bookList) {int currenSize = bookList.getUsedSize();for(int i = 0;i < currenSize;i++) {//我们重写了toString,所以这里会优先调用我们重写的toString方法System.out.println(bookList.getBooK(i));}System.out.println("显示完毕");}}

总结

关于《 图书管理系统》就讲解到这儿,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。想要完整包的小伙伴可以去到该博文的资源绑定进行下载,也可以私信博主

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

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

相关文章

Jmeter自动化性能测试常见问题

一、request 请求超时设置 timeout 超时时间是可以手动设置的&#xff0c;新建一个 http 请求&#xff0c;在“高级”设置中找到“超时”设置&#xff0c;设置连接、响应时间为2000ms。 1. 请求连接超时&#xff0c;连不上服务器。 现象&#xff1a; Jmeter表现形式为&…

视频爬虫:解析m3u8文件 python m3u8库,m3u8文件中.ts视频流的解密下载

一、引用的库 这里需要引用的库是&#xff1a;from Crypto.Cipher import AES 有坑哈&#xff0c;python3.0之后直接安装crypto你会发现不管怎么着都会报错。 经过查找资料找到了原因&#xff0c;原来是20年之后crypto已经被pycryptohome替换掉啦&#xff0c; 如果之前安装过…

什么是高级持续威胁(APT)攻击

目录 前言什么是高级持续威胁高级持续威胁攻击有哪些独特特征APT攻击的五个阶段APT检测及防护措施总结 前言 APT攻击是利用多个阶段和不同攻击技术的复合网络攻击。APT不是一时兴起2构思或实施的攻击。相反&#xff0c;攻击者故意针对特定目标定制攻击策略。并在较长时间内进行…

【Spring Boot系列】-Spring Boot过滤器Filter

【Spring Boot系列】-Spring Boot过滤器Filter 文章目录 【Spring Boot系列】-Spring Boot过滤器Filter一、概述二、Filter&#xff08;过滤器&#xff09;数据流程三、Spring Boot 过滤器生命周期四、使用注解方式实现过滤器(WebFilter)4.1. 在springboot 启动类添加该注解Ser…

flutter开发实战-实现css线性渐变转换flutter渐变LinearGradient功能

flutter开发实战-实现css线性渐变转换flutter渐变LinearGradient功能 在之前项目开发中&#xff0c;遇到更换样式&#xff0c;由于从服务器端获取的样式均为css属性值&#xff0c;需要将其转换成flutter类对应的属性值。这里只处理线性渐变linear-gradient 比如渐变 “linear-…

SQL编译优化原理

最近在团队的OLAP引擎上做了一些SQL编译优化的工作&#xff0c;整理到了语雀上&#xff0c;也顺便发在博客上了。SQL编译优化理论并不复杂&#xff0c;只需要掌握一些关系代数的基础就比较好理解&#xff1b;比较困难的在于reorder算法部分。 文章目录 基础概念关系代数等价 j…

python-网络爬虫.BS4

BS4 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库&#xff0c; 它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方 式。 Beautiful Soup 4 官方文档&#xff1a;https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 帮助手册&…

【element-ui】form表单初始化页面如何取消自动校验rules

问题描述&#xff1a;elementUI表单提交页面&#xff0c;初始化页面是获取接口数据&#xff0c;给form赋值&#xff0c;但是有时候这些会是空值情况&#xff0c;如果是空值&#xff0c;再给form表单赋值的话&#xff0c;页面初始化时候进行rules校验会不通过&#xff0c;此时前…

在excel中整理sql语句

数据准备 CREATE TABLE t_test (id varchar(32) NOT NULL,title varchar(255) DEFAULT NULL,date datetime DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO t_test VALUES (87896cf20b5a4043b841351c2fd9271f,张三1,2023/6/8 14:06); INSERT INTO t_test …

单元测试之 - Spring框架提供的单元/集成测试注解

Spring框架提供了很多注解来辅助完成单元测试和集成测试(备注&#xff1a;这里的集成测试指容器内部的集成测试&#xff0c;非系统间的集成测试)&#xff0c;先看看Spring框架提供了哪些注解以及对应的作用。RunWith(SpringRunner.class) / ExtendWith(SpringExtension.class)&…

python与深度学习(十一):CNN和猫狗大战

目录 1. 说明2. 猫狗大战2.1 导入相关库2.2 建立模型2.3 模型编译2.4 数据生成器2.5 模型训练2.6 模型保存2.7 模型训练结果的可视化 3. 猫狗大战的CNN模型可视化结果图4. 完整代码5. 猫狗大战的迁移学习 1. 说明 本篇文章是CNN的另外一个例子&#xff0c;猫狗大战&#xff0c…

风辞远的科技茶屋:来自未来的信号枪

很久之前&#xff0c;有位朋友问我&#xff0c;现在科技资讯这么发达了&#xff0c;你们还写啊写做什么呢&#xff1f; 我是这么看的。最终能够凝结为资讯的那个新闻点&#xff0c;其实是一系列事情最终得出的结果&#xff0c;而这个结果又会带来更多新的结果。其中这些“得出”…

基于改进粒子群算法的混合储能系统容量优化(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 文献来源 &#x1f308;4 Matlab代码及文章讲解 ​ &#x1f4a5;1 概述 摘要: 为了调高风光互补发电储能系统的经济性&#xff0c;减少其运行费用&#xff0c;研究风光互补发电储能系统的容量优化配置模型&…

Nginx配置WebSocket反向代理

1、WebSocket协议 ​ WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯&#xff0c;直到连接被关闭。但是WebSocket中的握手和HTTP中的握手兼容&#xff0c;它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的…

云曦暑期学习第三周——ctfshow--php特性(89-104)

目录 web89 preg_match函数 、数组 web90 intval()函数、强比较 web91 正则修饰符 web92 intval()函数、弱比较 web93 八进制、小数点 web94 strpos() 函数、小数点 web95 小数点 web96 highlight_file() 下的目录路径 web97 数组 web98 三目运算符 web9…

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动 在之前的开发中&#xff0c;遇到了实时音视频呼叫通知&#xff0c;当App未打开或者App在后台时候&#xff0c;需要通知到用户&#xff0c;用户点击通知栏后是否接入实时音视频的视频或者音频通话。 在…

深度学习技巧应用24-深度学习手撕代码与训练流程的联系记忆方法

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用24-深度学习手撕代码与训练流程的联系记忆方法,大家都知道深度学习模型训练过程是个复杂的过程,这个过程包括数据的收集,数据的处理,模型的搭建,优化器的选择,损失函数的选择,模型训练,模型评估等步骤,其中缺少…

1. CUDA中的grid和block

1. CUDA中的grid和block基本的理解 Kernel: Kernel不是CPU&#xff0c;而是在GPU上运行的特殊函数。你可以把Kernel想象成GPU上并行执行的任务。当你从主机&#xff08;CPU&#xff09;调用Kernel时&#xff0c;它在GPU上启动&#xff0c;并在许多线程上并行运行。 Grid: 当你…

Android 之 MediaPlayer 播放音频与视频

本节引言&#xff1a; 本节带来的是Android多媒体中的——MediaPlayer&#xff0c;我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件&#xff0c;通过该类&#xff0c;我们可以以最小的步骤来获取&#xff0c;解码 和播放音视频。它支持三种不同的…

Android 14重要更新预览

Android 14重要更新预览 国际化 Android 14 在 Android 13 的基础上进一步扩展了按应用设定语言功能&#xff0c;提供了一些额外的功能&#xff1a; 自动生成应用的 localeConfig&#xff1a;从 Android Studio Giraffe Canary 7 和 AGP 8.1.0-alpha07 开始&#xff0c;您可以…