【JAVA |图书管理系统】JAVA实现图书管理系(附完整代码)

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 
🎈🎈作者主页: 🎈丠丠64-CSDN博客🎈


✨✨ 帅哥美女们,我们共同加油!一起进步!✨✨ 

目录

一、前言

二、问题描述

三、思路

四、实现过程

1.book包

-Book类

-BookList类

2.user包

-User类

-AdminUser类

-NormalUser类

3.operation包

-IOperation接口

-AddOperation类

-DelOperation类 

-FindOperation类 

-ShowOperation类

-BorrowedOperation类

-RetuenOperation类

-ExitOperation类

4.主函数Main


一、前言

前面用了大量篇幅来介绍了JAVASE的大量知识,JAVA的基本语法我们了解的差不多了,我们来实操一个完整的一个代码功能包含了接口,继承等很多全面的知识,以便于我们对该部分的知识更加有印象。


二、问题描述

我们要实现一个图书管理系统,来系统的管理图书。一本书的信息包含书名,作者,类型,价格。在进入系统后首先实名制姓名,然后进入对应的菜单实现对应的功能。

普通用户只能实现查阅、借阅跟归还;

图书管理员不仅可以实现普通用户的所有功能还可以实现删减图书跟增添图书来管理。


三、思路

可以将这个问题大致分为3个模块,分别从用户,图书,以及实现的功能,三个方面去分别实现各自的大致功能,再将三个模块联系在一起来实现。

所以我们先针对这三个模块,各自建立一个包了实现各自功能。


四、实现过程

1.book包

-Book类

首先一上来就是最基本的书,我们先在book这个包下创建一个Book类,用来实现一本书的信息。

分别创建成员变量name、author、typr、price、ifBorrowed

package book;public class Book {private String name;//书名private String author;//作者private String type;//类型private int price;//价格private boolean ifBorrowed;//是否被借出}

并对其创建构建方法(因为默认的书就是为未借出,所以可以不构造ifBorrowed这一成员)

因为成员访问权限为private ,所以也要提供get与put函数了实现对外对其访问

并且重写ToString方法,后续会对书进行打印

package book;public class Book {private String name;//书名private String author;//作者private String type;//类型private int price;//价格private boolean ifBorrowed;//是否被借出public Book(String name, String author, String type, int price) {this.name = name;this.author = author;this.type = type;this.price = price;}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 String getType() {return type;}public void setType(String type) {this.type = type;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public boolean isIfBorrowed() {return ifBorrowed;}public void setIfBorrowed(boolean ifBorrowed) {this.ifBorrowed = ifBorrowed;}@Overridepublic String toString() {return "凯旋图书馆:{" +"书名='" + name + '\'' +", 作者='" + author + '\'' +", 类型='" + type + '\'' +", 价格=" + price +((ifBorrowed == true)?" ,被借出":" ,未借出")+'}';}
}

-BookList类

我们实现了单个图书以后,想要对图书进行一个整合,类似于书架一样的功能。我们创建一个书的数组books 通过访问下标的方式,来模拟书架对单个书进行管理。

我们先给初始化数组给定10个大小,并且创建一个成员变量用来记录目前书架上书的数量

package book;public class BookList {private Book[] books = new Book[10];private int usedSize;//实际放书数量
}

构造方法并对其书架上面的书初始化,我们假设现在设定暂放3本书,所以usedSize也为3

package book;public class BookList {private Book[] books = new Book[10];private int usedSize;//实际放书数量public BookList() {this.books[0] =  new Book("三国演义","罗贯中","小说",15);this.books[1] =  new Book("西游记","吴承恩","小说",15);this.books[2] =  new Book("红楼梦","曹雪芹","小说",15);this.usedSize = 3;}}

因为成员访问权限为private,分别构造出usedSize与 books的get与put函数

package book;public class BookList {private Book[] books = new Book[10];private int usedSize;//实际放书数量public BookList() {this.books[0] =  new Book("三国演义","罗贯中","小说",15);this.books[1] =  new Book("西游记","吴承恩","小说",15);this.books[2] =  new Book("红楼梦","曹雪芹","小说",15);this.usedSize = 3;}public Book getBooks(int pos) {   //相当于查看书架书的信息return books[pos];}public void setBooks(Book book,int pos) {   //相当于通过下标传入位置放书books[pos] = book;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}
}

2.user包

我们发现系统面对的两个用户,管理员和普通用户实现的功能都差不多,都是进入以后实名制以后打印对应的菜单,所以我们可以使用一个抽象类的父类来实现两个子类的功能


-User类

我们来构造一个父类,首先是子类共有的东西姓名,然后实现各自的菜单,我们可以将其写为抽象方法,子类通过重写来实现各自的菜单,因为有了抽象方法,所以该User类也是抽象类。

同时为了实现管理员与普通用户在操作上的独立性,我们可以构造一个功能数组ioPerations方法用来分别存各自的功能,再构建一个方法来实现数组对应的功能的实现

package user;public abstract class User {protected String name;    //共有属性public User(String name) {    //构造方法this.name = name;public IOperation[] ioPerations;    //构造的一个功能数组}public abstract int menu();    //抽象方法  菜单,返回不同的值用来实现不同的功能public void doOperation(int choice, BookList bookList){ioPerations[choice].work(bookList);    //通过功能数组来实现各自的功能}
}

-AdminUser类

我们构造一个AdminUser类,来实现管理员的功能,首先继承User父类的功能在对抽象方法菜单进行重写。并且创建一个功能数组并且初始化自己的功能。

package user;import java.util.Scanner;public class AdminUser extends User{public AdminUser(String name) {    //父类的构造方法super(name);}//对应的方法数组this.ioPerations = new IOperation[]{                    new ExitOperation(),    //下标0为退出系统new ShowOperation(),    //下标1为显示书new FindOperation(),    //下标2为查找书new AddOperation(),    //下标3为增添书new DelOperation()    //下标4为删减书};@Overridepublic int menu() {        //菜单System.out.println("***********************************");System.out.println(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 scanner = new Scanner(System.in);    //用户进行选择int choice = scanner.nextInt();return choice;    //返回不同的值用来实现不同的功能}
}

-NormalUser类

我们再构造一个NormalUser类,来实现普通用户的功能,首先继承User父类的功能在对抽象方法菜单进行重写。并且创建一个功能数组并且初始化自己的功能。

package user;import java.util.Scanner;public class NormalUser extends User {    public NormalUser(String name) {    //父类构造方法super(name);}//功能数组this.ioPerations = new IOperation[]{new ExitOperation(),    //下标0为退出系统new ShowOperation(),    //下标1为显示书new FindOperation(),    //下标2为超找书new BorrowedOperation(),  //下标3为借阅书new RetuenOperation(),    //下标4为归还书};@Overridepublic int menu(){        //重写菜单System.out.println("***********************************");System.out.println(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 scanner = new Scanner(System.in);    //用户进行选择int choice = scanner.nextInt();return choice;     //返回不同的值用来实现不同的功能}}

3.operation包

这个包用来实现功能,我们可以构建一个接口来对这些功能进行一个规范,让功能重写方法实现各自功能。


-IOperation接口

因为所有的功能都针对于书籍,都操作的BookList这个书架,所以我们构建一个规范。

package operation;import book.BookList;public interface IOperation {public void work(BookList bookList);    //重写方法
}

-AddOperation类

这个类实现增加图书的功能,使用IOperation这个接口,重写里面标准方法。

用户输入要添加书的信息,阅历书架,没有这本书就可以放入,有就提示已经存在这本书不能放并且退出,放入书架总数也加一。

package operation;import book.Book;
import book.BookList;public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList){    //重写接口的标准方法System.out.println("增加图书");Scanner scanner = new Scanner(System.in);    //输入添加书的信息System.out.println("请输入书名 :");String name = scanner.nextLine();System.out.println("请输入作者 :");String author = scanner.nextLine();System.out.println("请输入类型 :");String type = scanner.nextLine();scanner.nextLine();System.out.println("请输入价格 :");int price = scanner.nextInt();Book book = new Book(name,author,type,price);    //为新增的书创建应该实例化对象int currentSize = bookList.getUsedSize();     //获取书架此时的书数量for (int i = 0; i < currentSize; i++) {Book book1 = bookList.getBooks(i);if(book1.getName().equals(name)){System.out.println("书架已经有这本书,不能添加");    //阅历查找是否书架已有return;}else{bookList.setBooks(book,currentSize);    //在书架默认的最后一个放入新加的书}}bookList.setUsedSize(currentSize+1);    //成功加入书以后,书架总数量也要增加}}

-DelOperation类 

这个类实现删减图书的功能,使用IOperation这个接口,重写里面标准方法。

输入想要删除的书名,若书架中有则删除后面书往前移,若没有则退出。书架总数也减一。

package operation;import book.BookList;public class DelOperation implements IOperation{@Overridepublic void work(BookList bookList) {    //重写接口中的标准方法System.out.println("删除图书");Scanner scanner = new Scanner(System.in);System.out.println("请输入要删除的书名 :");    //输入需要删除的书名String name = scanner.nextLine();int currentSize = bookList.getUsedSize();    //获取目前书架书的总数int index = -1;    //设置默认值为-1for (int i = 0; i < currentSize; i++) {Book book = bookList.getBooks(i);if(book.getName().equals(name)){index = i;    //书架中有目标书以后,index值为目标书的下标break;}}if(index == -1){System.out.println("没有你删除的书");    //若没有找到书,则值还为-1,退出return;}else{for (int i = index; i < currentSize-1; i++) {Book book1 = bookList.getBooks(i+1);    //找到目标书,将后面的书往前移bookList.setBooks(book1,i);}}bookList.setUsedSize(currentSize-1);    //成功删除以后,书架总数要减一}
}

-FindOperation类 

这个类实现查找图书的功能,使用IOperation这个接口,重写里面标准方法。

用户输入想要查找的书以后,阅历书架来寻找。

package operation;import book.BookList;public class FindOperation implements IOperation{@Overridepublic void work(BookList bookList) {     //重写接口的标准方法System.out.println("查找图书");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要查找的书的名字");String name = scanner.nextLine();    //用户输入想查找的书int currentSize = bookList.getUsedSize();    //获取bookList中实际书的数量for (int i = 0; i < currentSize; i++) {Book book = bookList.getBooks(i);if(book.getName().equals(name)){    //遍历查阅看看与用户输入的书是否有相等System.out.print("找到了: ");System.out.println(book);        //找到退出return;}else{System.out.println("找不到");}}}
}

-ShowOperation类

这个类实现显示图书的功能,使用IOperation这个接口,重写里面标准方法。

然后通过遍历数组的方式,遍历books数组来实现显示图书的功能

package operation;import book.Book;
import book.BookList;public class ShowOperation implements IOperation {@Overridepublic void work(BookList bookList) {    //重写接口的标准方法System.out.println("显示图书");int currentSize = bookList.getUsedSize();    //获取bookList中实际书的数量for (int i = 0; i < currentSize; i++) {Book book = bookList.getBooks(i);        //遍历数组,打印所有书System.out.println(book);}}
}

-BorrowedOperation类

这个类实现借阅图书的功能,使用IOperation这个接口,重写里面标准方法。

输入想要借阅的书名字以后,遍历书架,成功找到目标书以后并且没有被借出,将借阅状态置为true

package operation;import book.BookList;public class BorrowedOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("借阅图书");Scanner scanner = new Scanner(System.in);System.out.println("请输入书名 :");String name = scanner.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book1 = bookList.getBooks(i);if(book1.getName().equals(name)){if(book1.isIfBorrowed() == false) {book1.setIfBorrowed(true);System.out.println("借阅成功");    return;}else{System.out.println("已经被借阅,不能再借");}}}System.out.println("没有你要借的书");}
}

-RetuenOperation类

这个类实现归还图书的功能,使用IOperation这个接口,重写里面标准方法。

输入想要归还的书名字以后,遍历书架,成功找到目标书以后,将借阅状态置为false。

package operation;import book.BookList;public class RetuenOperation implements  IOperation {@Overridepublic void work(BookList bookList) {System.out.println("归还图书");Scanner scanner = new Scanner(System.in);System.out.println("请输入书名 :");String name = scanner.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book1 = bookList.getBooks(i);if(book1.getName().equals(name)){book1.setIfBorrowed(false);System.out.println("归还成功");return;}}System.out.println("没有你要还的书");}
}

-ExitOperation类

这个类实现退出系统的功能,使用IOperation这个接口,重写里面标准方法。

使用exit退出,并且对书架的书和总数进行清零。

package operation;import book.BookList;public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {    //重写接口的标准方法System.out.println("退出系统");int currentSize = bookList.getUsedSize();    //获取bookList中实际书的数量for (int i = 0; i < currentSize; i++) {bookList.setBooks(null,i);            //遍历数组将所有元素置为null}bookList.setUsedSize(0);    //将实际书数量置为0System.exit(0);                    //退出系统}
}

4.主函数Main

在主程序中首先我们要做的就是登录系统,我们可以用一个方法来区分是否为管理员还是普通用户

拿User接受返回值,在输入不同的数字构造不同的用户,输入1构造AdminUser管理员,输入2为NormalUser普通用户

public static User login(){Scanner scanner = new Scanner(System.in);System.out.println("请输入你的姓名:");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);}}

在主函数main中,先实例化书架里面原有的书

向上转型接受login方法的返回值,再通过不同的构造对象打印出不同的菜单

然后循环调用相关的操作,直到用户退出系统

import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User login(){Scanner scanner = new Scanner(System.in);System.out.println("请输入你的姓名:");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();    //打印并返回对应对象的菜单要实现的功能user.doOperation(choice, bookList);    //调用对应的操作{  }
}

希望对你有帮助

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

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

相关文章

Java入门基础学习笔记47——ArrayList

什么是集合呢&#xff1f; 集合是一种容器&#xff0c;用来装数据的&#xff0c;类似数组。 有数组&#xff0c;为什么还要学习集合呢&#xff1f; 数组定义完成并启动后&#xff0c;长度就固定了。 而集合是大小可变&#xff0c;开发中用的最多的。 集合的特点&#xff1a;大…

改进rust代码的35种具体方法-类型(十九)-避免使用反射

上一篇文章 从其他语言来到Rust的程序员通常习惯于将反思作为工具箱中的工具。他们可能会浪费很多时间试图在Rust中实现基于反射的设计&#xff0c;却发现他们所尝试的事情只能做得不好&#xff0c;如果有的话。这个项目希望通过描述Rust在反思方面做什么和不做什么&#xff0c…

【chagpt】广泛使用API之前:考虑成本和数据隐私

文章目录 一. 定价和标记限制二. 安全和隐私 在广泛使用API之前&#xff0c;应该考虑两个重要因素&#xff1a;成本和数据隐私。 一. 定价和标记限制 OpenAI在Pricing页面上列出了模型的定价。请注意&#xff0c;OpenAI不一定及时更新该页面上的定价信息&#xff0c;因此实际…

华为OD机试【计算最接近的数】(java)(100分)

1、题目描述 给定一个数组X和正整数K&#xff0c;请找出使表达式X[i] - X[i1] … - X[i K 1]&#xff0c;结果最接近于数组中位数的下标i&#xff0c;如果有多个i满足条件&#xff0c;请返回最大的i。 其中&#xff0c;数组中位数&#xff1a;长度为N的数组&#xff0c;按照元…

Pyinstaller打包exe文件解决指南

打包命令 打包 Python 文件 输入如下格式的命令即可 默认命令 Pyinstaller 文件名.py Pyinstaller -option1 -option2 -... 要打包的文件 Pyinstaller 文件名.pyPyinstaller -option1 -option2 -... 要打包的文件 参数选项比较多&#xff0c;这里我列一个表&#xff1a;…

element ui 的el-input输入一个字后失去焦点,需重新点击输入框才能再次输入!

解决方案&#xff1a; 我是form表单嵌套表格&#xff0c;里面的el-input输入框&#xff0c;输入第一个值的时候会突然失去焦点&#xff0c;需要再次点击输入框才能正常输入&#xff0c;原因是table的key值&#xff0c;需要改成正常的index即可&#xff0c;如果你是循环的&…

讯方·智汇云校助力多所高校斩获华为ICT大赛2023-2024全球总决赛佳绩

2024年5月26日&#xff0c;华为ICT大赛2023-2024全球总决赛闭幕式暨颁奖典礼在深圳举行。讯方技术14所合作院校的18支队伍在此次大赛中荣获系列大奖。 本届大赛为华为历届最大规模的线下比赛&#xff0c;共吸引了全球80多个国家和地区、2000多所院校、17万余名学生报名参赛&am…

【前端学习笔记】HTML基础

HTML 一、HTML介绍1.HTML概念2.文档声明3.字符编码4. HTML标签5. HTML属性 二、标签1.meta标签2.语义标签3.布局标签4.列表5.超链接6.图片7.字符实体8.内联格式9.HTML 表格10.HTML 表单 三、HTML5新特性1. 本地存储2. Cookie3. 语义化标签4.多媒体元素5.表单增强6.Canvas7.SVG …

PHP开发入门

PHP官网&#xff1a;PHP: Hypertext Preprocessor apache官网&#xff1a;https://httpd.apache.org/ 一、搭建PHP环境 下载apache 进入官网点击download 选择下载windows版本文件 点击进入下载界面 点击下载64位版本文件 下载后解压文件 解压文件后进入 D:\httpd-2.4.59-24…

力扣232. 用栈实现队列(两栈实现队列)

Problem: 232. 用栈实现队列 文章目录 题目描述思路Code 题目描述 思路 利用两个栈&#xff0c;一个入栈一个出栈搭配着实现队列的相关操作&#xff1a; 1.创建两个栈stack1和stack2&#xff1b; 2.void push(int x):将要入队的元素先入栈stack1&#xff1b; 3.int pop()&…

Springboot集成GRPC

Springboot集成GRPC 一、springboot版本二、GRPC的pom依赖2.1 服务端2.2 客户端3.构建依赖 三、配置文件服务端客户端 四、 demo4.1 编写proto文件4.2 生成文件4.3 服务端重写方法4.4 客户端调用该方法 五、测试 一、springboot版本 <groupId>org.springframework.boot&l…

【Linux】Linux的权限_2 + Linux环境基础开发工具_1

文章目录 三、权限3. Linux权限管理修改文件的拥有者和所属组 4. 文件的类型5. 权限掩码 四、Linux环境基础开发工具1. yumyum 工具的使用 未完待续 三、权限 3. Linux权限管理 修改文件的拥有者和所属组 在上一节我们讲到如何更改文件的访问权限&#xff0c;那我们需要更改…

Unity 自定义Web GL 发布模板

前言 使用讯飞语音识别时&#xff0c;发布Web GL 平台后需要在index.html 中添加相应的script 标签&#xff0c;但每次发布完添加比较麻烦&#xff0c;添加一个发布模板就可以不必每次发布完再手动添加修改。 实现 在Assets 文件夹下新建一个文件夹&#xff0c;重命名为WebG…

rocketmq 学习二 基本概念

教程&#xff1a;基本概念 | RocketMQ 视频教程 https://www.bilibili.com/video/BV1d5411y7UW?vd_sourcef1bd3b5218c30adf0a002c8c937e0a27 版本&#xff1a;5.0 一 基本概念 1.1 生产者/Producer 1.1.1 定义 消息发布者。是构建并传输消息到服务端的运行实体。…

module ‘plotting‘ has no attribute ‘EpisodeStats‘

plotting.py 的版本不同&#xff0c;可以使用下列版本 reinforcement-learning/lib/plotting.py at master dennybritz/reinforcement-learning GitHubImplementation of Reinforcement Learning Algorithms. Python, OpenAI Gym, Tensorflow. Exercises and Solutions to a…

go语言,golang,linux,unbantu安装

查看系统是arm还是amd uname -m 命令可以显示系统的架构类型&#xff1a; uname -m输出可能是&#xff1a; x86_64&#xff1a;表示是 AMD64 架构&#xff08;即 64 位的 x86 架构&#xff09;。aarch64&#xff1a;表示是 ARM64 架构&#xff08;即 64 位的 ARM架构&#xf…

WORD、PPT技巧

WORD技巧 编辑设置 word标题导航窗口怎么调出word2016&#xff0c;缩小了页面&#xff0c;可是怎么是竖着的一页一页排列啊&#xff1f;以前不是好几页横排着的么&#xff1f;怎么设置&#xff0c;求救&#xff1a;在Word标题栏那一行找到“视图”&#xff0c;点击“显示比例…

【漏洞复现】用友NC registerServlet JNDI 远程代码执行漏洞(XVE-2024-10248)

0x01 产品简介 用友NC是 用友软件股份有限公司开发的一套企业级管理软件系统。它是一个基于互联网的多层应用系统&#xff0c;旨在为中大型企业提供全面、集成的管理解决方案。是一种商业级的企业资源规划云平台&#xff0c;为企业提供全面的管理解决方案&#xff0c;包括财务…

【InternLM实战营第二期笔记】03:“茴香豆“,搭建你的 RAG 智能助理(未完成)

文章目录 笔记-RAG课程结构为什么要用 RAG&#xff1f;定义工作原理向量数据库RAG 工作流程发展历程常见优化RAG vs 微调LLM 优化方法比较RAG的评价总结 笔记-茴香豆什么是茴香豆茴香豆实战 笔记-RAG 课程结构 为什么要用 RAG&#xff1f; 新增知识&#xff0c;尤其是高频变动…

AI视频换脸!最快的方法,100%成功,完全免费,无需配置、打开即用

这是一款百分百完全免费&#xff0c;超级好用又简单的AI视频换脸工具&#xff0c;不仅效果非常不错而且支持CPU和GPU解码&#xff0c;即使电脑上没有独立显卡&#xff0c;你也可以通过电脑上的CPU要进解码&#xff0c;虽然我之前给他介绍好几个有关AI视频&#xff0c;比如像这个…