当前位置: 首页 > news >正文

Java基础(7)图书管理系统

 

目录

1.前言

2.正文

2.1思路

2.2Book包

2.3people包

2.4operation包

2.5主函数

3.小结


1.前言

哈喽大家好吖,今天来给前面Java基础的学习来一个基础的实战,做一个简单的图书管理系统,这里边综合利用了我们之前学习到的类和对象,继承与多态以及抽象类和接口等许多重要的概念以及知识,事不宜迟,让我们开始吧。

2.正文

2.1思路

在正式开始图书管理系统的代码完成前,我们需要先对一系列所需要创建的对象,各个对象之间的关系,如何实现这种关系,都要有一个提前的规划,下面我通过PlantUML生成了图书管理系统的基础框架,我据图一一解释。

5bb1025dd32d46988dc8d2955c31fb72.png

在图书管理系统里面,会参与各种行为的对象都有哪些呢?有书本,借阅者,管理员,具体的借阅功能等,所以我们一共有四个包,分别为:

  1. Book包
  2.  

    operation包

  3. people

  4. 主函数所在包

我们把各个模块把它分成各个包来进行封装,是代码的条理性更好。

2.2Book包

在Book包中,我们创建了俩个对象,一个是book对象,另一个书用于存放书的bookshelf对象,具体实现如下:

package Book;public class Book {private String bookName;private String writer;private String classification;private Boolean borrow;public Book(String bookName, String writer, String classification, Boolean borrow) {this.bookName = bookName;this.writer = writer;this.classification = classification;this.borrow = borrow;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getWriter() {return writer;}public void setWriter(String writer) {this.writer = writer;}public String getClassification() {return classification;}public void setClassification(String classification) {this.classification = classification;}public Boolean getBorrow() {return borrow;}public void setBorrow(Boolean borrow) {this.borrow = borrow;}
}

因为成员的访问权限我们设置为private,所以我们需要各种getter和setter方法来调用成员变量,其中getter和setter方法是可以通过系统快速生成的,即按住alt+insert可以快速实现该方法。

下面是Bookshelf对象:

package Book;public class bookShelf {private Book[] books = new Book[10];private int bookNum = 0;public bookShelf() {this.books[0] = new Book("三国演义","罗贯中","历史演义",null);this.books[1] = new Book("三体","刘慈欣","科幻小说",null);this.books[2] = new Book("西游记","吴承恩","小说",null);this.bookNum = 3;}public Book getBooks(int pos) {return books[pos];}public void setBooks(Book book,int pos) {this.books[pos] = book;}public int getBookNum() {return bookNum;}public void setBookNum(int bookNum) {this.bookNum = bookNum;}
}

我们在bookshelf的构造方法中提前初始化里三个对象,即可以理解为图书馆中原本就存放的书。创建一个bookNum变量用于记录当前所存放的图书数量。

2.3people包

在people包中我们通过继承来实现,首先创建了一个person抽象类用于抽取管理员和借阅者的共同属性以及方法,再分别实现子类Admin与normalUser。

person类:

package People;import operation.*;
import Book.*;public abstract class Person {public String name;public Operation[] iOperations;public Person(String name) {this.name = name;}public abstract int menu();public void finishOPerations(int choice,bookShelf bookShelf) {iOperations[choice].work(bookShelf);}
}

共同属性姓名不必多说,还额外创建了一个功能数组,另外创建一个菜单方法用于打印各自的菜单,最后还有finishOPeration方法,通过这个功能数组即可实现输入菜单对应选项进入对应功能的操作。

Admin类:

package People;import operation.*;import java.util.Scanner;public class Admin extends Person {public Admin(String name) {super(name);this.iOperations = new Operation[]{new edit(),new showBook(),new findBook(),new addBook(),new delBook()};}@Overridepublic int menu() {System.out.println("*******************");System.out.println("**欢迎来到管理员菜单**");System.out.println("******0.退出系统*****");System.out.println("******1.显示图书*****");System.out.println("******2.寻找图书*****");System.out.println("******3.增加图书*****");System.out.println("******4.减少图书*****");System.out.println("*******************");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}}

在这个构造方法中需要对功能数组中添加功能方法,下文同样。

normalUser类:

package People;import operation.*;import java.util.Scanner;public class normalUser extends Person {@Overridepublic int menu() {System.out.println("*******************");System.out.println("***欢迎来到用户菜单***");System.out.println("******0.退出系统*****");System.out.println("******1.显示图书*****");System.out.println("******2.寻找图书*****");System.out.println("******3.借阅图书*****");System.out.println("******4.归还图书*****");System.out.println("*******************");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}public normalUser(String name) {super(name);this.iOperations = new Operation[]{new edit(),new showBook(),new findBook(),new borrowBook(),new returnBook()};}}

2.4operation包

在这个包里面,我们尝试把各种人物的行为全都各个创建成对象来进行分别实现,这里我们采用了接口,即在这个包里接了这个接口的其他对象,都需要将接口中的方法重写,来达到方法都得到实现的目的。

首先是接口:

package operation;import Book.bookShelf;public interface Operation {public void work(bookShelf bookShelf);
}

接口中的方法不需要具体实现。

接下来就是各种需要实现的对象与对象之间的逻辑了,如借阅图书,归还图书,查询图书,退出系统等,我一一进行讲解:

findBook类:

package operation;import Book.Book;
import Book.bookShelf;
import java.util.Scanner;//找书先要判断是否有书,若有则借,若无则直接返回
public class findBook implements Operation{public void work(bookShelf bookShelf){Scanner scanner = new Scanner(System.in);System.out.println("查找图书");String name = scanner.nextLine();for(int i = 0;i < bookShelf.getBookNum();i++){if(name.equals(bookShelf.getBooks(i).getBookName())){System.out.println("找到了《" + name + "》书");return;}}System.out.println("未找到"+ "《"+ name + "》");}
}

通过遍历来实现,若遍历到有此书则打印找到了并返回,若能走完遍历则未找到。

showBook类:

package operation;import Book.bookShelf;public class showBook implements Operation{public void work(bookShelf bookShelf) {System.out.println("显示图书");//遍历书架for (int i = 0; i < bookShelf.getBookNum(); i++) {System.out.println(bookShelf.getBooks(i));}}}

这个遍历打印即可,没什么特殊。

addBook类:

//新增图书,先判断该书是否存在,再实例化一个书对象添加进bookshelf,并将bookNum增加package operation;import Book.Book;
import Book.bookShelf;
import java.util.Scanner;public class addBook implements Operation {@Overridepublic void work(bookShelf bookShelf) {Scanner scanner = new Scanner(System.in);System.out.println("请输入添加的图书名字");String name = scanner.nextLine();System.out.println("请输入添加的图书作者名字");String writer = scanner.nextLine();System.out.println("请输入添加的图书分类");String classfication = scanner.nextLine();//遍历判断是否有相同书for(int i = 0;i < bookShelf.getBookNum();i++){if(name.equals(bookShelf.getBooks(i).getBookName())){System.out.println("书库里已有该书");return;}}//新增图书bookShelf.setBooks(new Book(name,writer,classfication,false), bookShelf.getBookNum());bookShelf.setBookNum(bookShelf.getBookNum() + 1);//新增图书加1System.out.println("书《" + name +"》已添加成功");}
}

新增图书是属于Admin对象的类方法,先输入要添加的书的各个成员变量的信息,再遍历寻找有无相同书,若没有则添加。

delBook类:

//删除一本书,现需要查找是否有该书,删书即使后一个覆盖前一个即可package operation;import Book.Book;
import Book.bookShelf;
import java.util.Scanner;public class delBook implements Operation{@Overridepublic void work(bookShelf bookShelf) {Scanner scanner = new Scanner(System.in);System.out.println("请输入你需要删除的书");String name = scanner.nextLine();for(int i = 0;i < bookShelf.getBookNum();i++){if(name.equals(bookShelf.getBooks(i).getBookName())){for(int j = i;j < bookShelf.getBookNum() - 1;j++){bookShelf.setBooks(bookShelf.getBooks(j + 1),j);}bookShelf.setBookNum(bookShelf.getBookNum() - 1);System.out.println("该书已删除完毕");return;}}System.out.println("不存在该书");}
}

也是遍历寻找输入的书,若找到删除的书,则将后面的书一一往前覆盖即可实现删除功能,最后不要忘了bookNum要进行减一操作。

borrowBook类:

package operation;import Book.Book;
import Book.bookShelf;
import java.util.Scanner;public class borrowBook implements Operation{@Overridepublic void work(bookShelf bookShelf) {Scanner scanner = new Scanner(System.in);System.out.println("请输入要借阅书的名字");String name = scanner.nextLine();for(int i = 0;i < bookShelf.getBookNum();i++){if(name.equals(bookShelf.getBooks(i).getBookName())){bookShelf.getBooks(i).setBorrow(true);//设置借阅状态System.out.println("书《" + name +"》借阅成功");return;}}System.out.println("不存在该书,借阅失败");}
}

还是先遍历找书,若有则改变图书的借阅状态,若无则借阅失败。

returnBook类:

package operation;import Book.bookShelf;import java.util.Scanner;public class returnBook implements Operation{@Overridepublic void work(bookShelf bookShelf) {Scanner scanner = new Scanner(System.in);System.out.println("请输入要归还书的名字");String name = scanner.nextLine();for(int i = 0;i < bookShelf.getBookNum();i++){if(name.equals(bookShelf.getBooks(i).getBookName())){bookShelf.getBooks(i).setBorrow(false);//设置借阅状态System.out.println("书《" + name +"》归还成功");return;}}System.out.println("不存在该书,归还失败");}
}

和借书操作如出一辙,唯一的区别就是状态改变的true与false不同。

edit类:

package operation;import Book.bookShelf;public class edit implements Operation{@Overridepublic void work(bookShelf bookShelf) {for(int i = 0;i < bookShelf.getBookNum();i++){bookShelf.setBooks(null,i);}bookShelf.setBookNum(0);System.exit(0);}
}

 实现退出功能,先将储存的图书删除,将bookNum清零,最后退出系统。

2.5主函数

在主函数中同样,我们把登陆(即选择自己是管理员还是借阅者身份的选择)的login功能也通过单独的类方法来进行实现。

Login类:

package System;import People.Admin;
import People.Person;
import People.normalUser;import java.util.Scanner;public class Login{public Person loginIn(){System.out.println("*欢迎来到图书管理系统**");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的名字");String name = scanner.nextLine();System.out.println("*******************");System.out.println("******1.管理员******");System.out.println("******2.普通用户****");System.out.println("请输入你的身份");if(scanner.nextInt() == 1){return new Admin(name);}else{return  new normalUser(name);}}
}

最后就是主函数,这个时候主函数就会比较整洁明了,记得要分别实例化书架bookShelf对象以及Login登陆对象了。

package System;import Book.*;
import People.*;public class system {public static void main(String[] args) {bookShelf bookShelf = new bookShelf();Login login = new Login();Person person = login.loginIn();while(true){int choice = person.menu();person.finishOPerations(choice,bookShelf);}}}

这样我们图书管理系统就完成了! 

3.小结

今天的图书管理系统的分享到这里就结束了,喜欢的小伙伴不要忘了点一手关注再走哦,欢迎大家在评论区多多交流哦。

 

 

 

相关文章:

Java基础(7)图书管理系统

目录 1.前言 2.正文 2.1思路 2.2Book包 2.3people包 2.4operation包 2.5主函数 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来给前面Java基础的学习来一个基础的实战&#xff0c;做一个简单的图书管理系统&#xff0c;这里边综合利用了我们之前学习到的类和对象&…...

使用 Spring Boot 实现图片上传

目录 一、前言 二、项目准备 2.1、创建SpringBoot项目 2.2、项目结构 2.3、配置文件 2.4、创建控制器 2.5、创建服务 2.6创建前端界面 2.7、静态资源 三、运行项目 四、测试上传功能 总结 一、前言 在现代 web 开发中&#xff0c;图片上传功能是一个…...

深度解析跨境支付之产品架构

跨境支付企业有能力开放更多的底层能力接口给到外界合作伙伴。其中包括购汇及申报、结汇及申报、换汇&#xff08;包含汇率查询和外汇兑换、远期锁汇等功能&#xff09;、境外本地下单、查询、退款、外汇跨境收款、海外代发、VA账户开户及余额查询、VCC发卡及查询等能力。 在这…...

Linux下的线程同步与死锁避免

文章目录 死锁的四个必要条件破坏死锁条件的方法破坏互斥条件使用读写锁&#xff08;pthread_rwlock_t&#xff09; 破坏持有并等待条件一次性申请所有资源 破坏不可剥夺条件使用超时锁定机制可重入锁&#xff08;递归锁&#xff09; 破坏循环等待条件统一锁顺序 在 Linux 下进…...

【Python爬虫实战】Selenium自动化网页操作入门指南

#1024程序员节&#xff5c;征文# &#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、准备工作 &#xff08;一&#xff09;安装 Selenium 库 &#xff0…...

mono源码交叉编译 linux arm arm64全过程

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

矩阵的可解性:关于Ax=b的研究

上一篇文章讲解了如何求解 A x 0 Ax0 Ax0&#xff0c;得到 A A A的零空间。 类似的&#xff0c;我们今天学习的是如何求解 A x b Axb Axb&#xff0c;并以此加强你对线性代数中&#xff0c;代数与空间的理解。 同样的&#xff0c;我们举与上一次一样的例子&#xff0c;矩阵 …...

10.22.2024刷华为OD C题型(三)--for循环例子

脚踝动了手术&#xff0c;现在宾馆恢复&#xff0c;伤筋动骨一百天还真不是说笑的&#xff0c;继续努力吧。 文章目录 靠谱的车灰度图恢复灰度图恢复 -- for循环使用例子 靠谱的车 https://www.nowcoder.com/discuss/564514429228834816 这个题目思路不难&#xff0c;就是要自…...

QT:MaintenanceTool 模块安装工具

QT的MaintenanceTool 工具对已安装的 Qt 进行卸载、修复等其他操作时提示At least one valid and enabled repository required for this action to succeed 解决方式&#xff1a;在设置中添加一个临时的仓库 https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepositor…...

同标签实现监听LocalStorage

使用 React 生命周期函数 useEffect来监听和处理 LocalStorage 的变化 import React, { useEffect } from react;const LocalStorageListener () > {useEffect(() > {// 注册监听器const handleStorageChange (event) > {if (event.key myKey) {console.log(注册…...

JAVA高性能缓存项目

版本一 代码实现 import java.util.HashMap; import java.util.concurrent.TimeUnit;public class CacheExample01 {private final static HashMap<String, Integer> cache new HashMap<>();public static Integer check(String userId) throws InterruptedExce…...

智慧农业大数据平台:智汇田园,数驭未来

智慧农业大数据平台 计讯物联智慧农业大数据平台是一个集管理数字化、作业自动化、生产智能化、产品绿色化、环境信息化、服务现代化于一体的多功能监管系统。它通过与硬件产品的搭配使用&#xff0c;实现对农业生产全过程的实时监测、精准控制和科学管理。该平台集成了多个数…...

Go语言基础教程:可变参数函数

Go 语言允许函数接收可变数量的参数&#xff0c;这种特性对于处理数量不确定的参数特别有用。在本教程中&#xff0c;我们将通过示例代码讲解如何定义和使用 Go 的可变参数函数。 package mainimport "fmt"// 定义一个可变参数函数 sum&#xff0c;接收任意数量的整…...

高并发场景下解决并发数据不一致

简单的场景: 全量数据更新的情况下, 不在乎同一秒的请求都必须要成功, 只留下最新的更新请求数据 方案常用的是 1、数据库增加时间戳标识实现的乐观锁, 请求参数从源头带上微秒或者毫秒时间戳数据库存储, 然后在更新SQL语句上比较 (数据库的时间 < 参数传递的时间) 例如: A…...

OpenAI GPT-o1实现方案记录与梳理

本篇文章用于记录从各处收集到的o1复现方案的推测以及介绍 目录 Journey Learning - 上海交通大学NYUMBZUAIGAIRCore IdeaKey QuestionsKey TechnologiesTrainingInference A Tutorial on LLM Reasoning: Relevant methods behind ChatGPT o1 - UCL汪军教授Core Idea先导自回归…...

Excel:vba实现生成随机数

Sub 生成随机数字()Dim randomNumber As IntegerDim minValue As IntegerDim maxValue As Integer 设置随机数的范围(假入班级里面有43个学生&#xff0c;学号是从1→43)minValue 1maxValue 43 生成随机数(在1到43之间生成随机数)randomNumber Application.WorksheetFunctio…...

Python | Leetcode Python题解之第506题相对名次

题目&#xff1a; 题解&#xff1a; class Solution:desc ("Gold Medal", "Silver Medal", "Bronze Medal")def findRelativeRanks(self, score: List[int]) -> List[str]:ans [""] * len(score)arr sorted(enumerate(score), …...

安全见闻(6)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;安全见闻&#xff08;6&#xff09;_哔哩哔哩_bilibili 学无止境&#xff0c;开拓自己的眼界才能走的更远 本文主要讲解通讯协议涉及的安全问题。…...

Promise、async、await 、异步生成器的错误处理方案

1、Promise.all 的错误处理 Promise.all 方法接受一个 Promise 数组&#xff0c;并返回所有解析 Promise 的结果数组&#xff1a; const promise1 Promise.resolve("one"); const promise2 Promise.resolve("two");Promise.all([promise1, promise2]).…...

腾讯云:数智教育专场-学习笔记

15点13分2024年10月21日&#xff08;短短5天的时间&#xff0c;自己的成长速度更加惊人&#xff09;-开始进行“降本增效”学习模式&#xff0c;根据小米手环对于自己的行为模式分析&#xff08;不断地寻找数据之间的关联性&#xff09;&#xff0c;每天高效记忆时间&#xff0…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

&#x1f525; 推荐一个高质量的Java LSM Tree开源项目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree&#xff0c;专为高并发写入场景设计。 核心亮点&#xff1a; ⚡ 极致性能&#xff1a;写入速度超…...

CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found

Nginx1.24编译时&#xff0c;报LuaJIT2.x错误&#xff0c; configuring additional modules adding module in /www/server/nginx/src/ngx_devel_kit ngx_devel_kit was configured adding module in /www/server/nginx/src/lua_nginx_module checking for LuaJIT 2.x ... not…...