【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.mzph.cn/news/20804.shtml

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

相关文章

聊聊我的故事-悲惨的童年

目录 前言一、介绍二、17年回顾1.出生2.上幼儿园3.上小学4.上初中 高中总结 前言 本人是06年生的&#xff0c;快18了&#xff0c; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、介绍 本人已经17了&#xff0c;在这17年过的很悲惨&#xff0c;也…

python中数据可视化

1.掷一个D6和一个D10 50000次的结果 die.py from random import randintclass Die:def __init__(self, num_sides6):self.num_sides num_sidesdef roll(self):return randint(1, self.num_sides) die_visual.py from die import Die from plotly.graph_objs import Bar, L…

Day11-Webpack前端工程化开发

Webpack 一 webpack基本概念 遇到问题 开发中希望将文件分开来编写,比如CSS代码,可以分为头部尾部内容,公共的样式。 JS代码也希望拆分为多个文件,分别引入,以后代码比较好维护。 本地图片,希望可以实现小图片不用访问后端,保存在前端代码中就可以了 运行程序时我…

软件测试面试总结——http协议相关面试题

前言 在PC浏览器的地址栏输入一串URL&#xff0c;然后按Enter键这个页面渲染出来&#xff0c;这个过程中都发生了什么事?这个是很多面试官喜欢问的一个问题 如果测试只是停留在表面上点点点&#xff0c;不知道背后的逻辑&#xff0c;是无法发现隐藏的bug&#xff0c;只能找一…

iOS 后台运行

iOS后台行&#xff0c;一般有两种方式&#xff1a; 1.UIBackgroundTaskIdentifier后台任务标记时, 2.设置后台运行模式&#xff0c;需要有voip&#xff0c;location功能的才行。不然app上线审核肯定是过不了的。 下面是我学习后台运行的尝试过程。 一.首先创建一个项目功程…

第20节 R语言医学分析:某保险医疗事故赔偿因素分析

文章目录 某保险医疗事故赔偿因素分析源码源文件下载某保险医疗事故赔偿因素分析 我们分析数据集“诉讼”的第一个方法是确定样本数量、变量类型、缩放/编码约定(如果有)用于验证数据清理。 接下来,数据集看起来很干净,没有缺失值,并且对于分类变量,将编码约定替换为实际…

1.Kubernetes

文章目录 KubernetesK8S概述作用为什么使用K8S主要功能Kubernetes 集群架构与组件总结&#xff1a; 核心组件Master组件Kube-apiserverKube-controller-managerKube-scheduler工作 配置存储中心etcd Node组件KubeletKube-Proxydocker 或 containerd 总结&#xff1a; 工作流程K…

组合模式(Composite)

组合模式是一种结构型设计模式&#xff0c;主要用来将多个对象组织成树形结构以表示“部分-整体”的层次结构&#xff0c;因此该模式也称为“部分-整体”模式。简言之&#xff0c;组合模式就是用来将一组对象组合成树状结构&#xff0c;并且能像使用独立对象一样使用它们。 Co…

PHP语言基础知识(超详细)

文章目录 前言第一章 PHP语言学习介绍 1.1 PHP部署安装环境1.2 PHP代码工具选择 第二章 PHP代码基本语法 2.1 PHP函数知识介绍2.2 PHP常量变量介绍 2.2.1 PHP变量知识&#xff1a;2.2.2 PHP常量知识&#xff1a; 2.3 PHP注释信息介绍2.4 PHP数据类型介绍 2.4.1 整形数据类型2.4…

Linux安装部署并使用Redis(包含Redis Desktop Manager界面化工具)

文章目录 前言一、Redis的简介二、redis的安装与配置&#xff08;Linux环境&#xff09;三、redis的使用&#xff08;Redis Desktop Manager界面化&#xff09;四、基本命令**String基本命令&#xff1a;****hash基本命令&#xff1a;****List基本命令&#xff1a;****set基本命…

C++ STL快速应用

STL 容器 STL容器有共同的操作接口&#xff0c;包括初始化操作、判空、查看大小、比较元素、销毁、交换&#xff0c;这些操作都是一样的接口。 对于访问遍历元素&#xff08;增删改查&#xff09;&#xff0c;都可以使用迭代器&#xff08;正向&#xff09;进行操作&#xff0c…

1分钟解决github push/pull报错443

1.打开https://www.ipaddress.com/ 2.复制如图IP地址 3.文件夹打开C:\Windows\System32\drivers\etc&#xff0c;复制hosts文件&#xff0c;粘贴到桌面 4.在桌面用记事本打开复制过来的hosts 5.在末尾加上一行&#xff0c;IP写刚才复制的 6.复制桌面的hosts,粘贴回C:\Window…

eNSP interface g0/0/0 报错解决办法

文章目录 1 报错截图2 解决办法2.1 排查设备是否有 GM 接口2.2 更换适合的路由器&#xff0c;并验证 1 报错截图 2 解决办法 2.1 排查设备是否有 GM 接口 查看下设备是否支持 GM 接口&#xff08;GigabitEthernet&#xff09; 方式一&#xff1a;右键路由器设备 - 设置 - 查看…

单例模式(Singleton)

单例模式保证一个类仅有一个实例&#xff0c;并提供一个全局访问点来访问它&#xff0c;这个类称为单例类。可见&#xff0c;在实现单例模式时&#xff0c;除了保证一个类只能创建一个实例外&#xff0c;还需提供一个全局访问点。 Singleton is a creational design pattern t…

71. 简化路径

题目链接&#xff1a;力扣 解题思路&#xff1a; 以 "/" 对路径字符串进行分割&#xff0c;得到分割后的数组split&#xff0c;那么数组中每个元素就是一级路径的名称对split进行遍历&#xff1a;使用一个队列deque保存最终的每一个目录 如果当前字符串是 "..&…

【c++】rand()随机函数的应用(二)——舒尔特方格数字的生成

目录 一、舒尔特方格简介 二、如何生成舒尔特方格 &#xff08;一&#xff09;线性同余法 1、利用线性同余法生成随机数序列的规律 (1) 当a和c选取合适的数时&#xff0c;可以生成周期为m的随机数序列 (2) 种子seed取值也是有周期的 2、利用线性同余法生成5阶舒尔特方格…

app自动化测试

在实习过程中&#xff0c;我接触到了一些SDL安全提测的工作。原来我是学web端渗透比较多的&#xff0c;移动端这块基本没怎么试过手&#xff0c;结果刚开始一直踩坑&#xff0c;连抓包都抓不到(&#xff34;▽&#xff34;)。 下面记录下我遇到的部分问题和解决方法&#xff0c…

誉天程序员-瀑布模型-敏捷开发模型-DevOps模型比较

文章目录 2. 项目开发-开发方式2.1. 瀑布开发模型2.2. 敏捷开发模型2.3. DevOps开发模型2.4. 区别 自增主键策略1、数据库支持主键自增自增和uuid方案优缺点 2. 项目开发-开发方式 由传统的瀑布开发模型、敏捷开发模型&#xff0c;一跃升级到DevOps开发运维一体化开发模型。 …

本地部署 audiocraft

本地部署 audiocraft 1. 什么是 audiocraft2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 部署 audiocraft6. 启动 MusicGen7. 访问 MusicGen 1. 什么是 audiocraft Audiocraft 是一个通过深度学习进行音频处理和生成的库。它具有最先进的 EnCodec 音频压缩器/分词器&am…

【MySQL】MVCC的实现原理

MVCC的实现原理 1.前期准备1.2.隐式字段1.3.undo log日志1.4.readView 2.MVCC的实现流程2.1.R C&#xff08;读已提交---隔离级别&#xff09;2.2.R R&#xff08;可重复读---隔离级别&#xff09; 3.面试题---->事务中的隔离性是如何保证的呢&#xff1f;(你解释一下MVCC) …