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);}
}

操作示例

这里展示一下管理员界面的部分操作逻辑:

 

 

补充

缺点:没有做到持久化存储。以后可以进行升级:将数据存储到数据库或者文件夹中

           当前用到的只是数组。后期可以做成网页交互。

好了,图书管理系统就说到这里,大家再见!

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

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

相关文章

在Ubuntu上安装和设置RabbitMQ服务器,轻松实现外部远程访问

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

【Python原创毕设|课设】基于Python Flask的上海美食信息与可视化宣传网站项目-文末附下载方式以及往届优秀论文,原创项目其他均为抄袭

基于Python Flask的上海美食信息与可视化宣传网站&#xff08;获取方式访问文末官网&#xff09; 一、项目简介二、开发环境三、项目技术四、功能结构五、运行截图六、功能实现七、数据库设计八、源码获取 一、项目简介 随着大数据和人工智能技术的迅速发展&#xff0c;我们设…

Git如何操作本地分支仓库?

基本使用TortoiseGit 操作本地仓库(分支) 分支的概念 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来&#xff0c;避免影响开发主线。多线程开发,可以同时开启多个任务的开发&#xff0c;多个任务之间互不影响。 为何要…

【洛谷】P1678 烦恼的高考志愿

原题链接&#xff1a;https://www.luogu.com.cn/problem/P1678 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 将每个学校的分数线用sort()升序排序&#xff0c;再二分查找每个学校的分数线&#xff0c;通过二分找到每个同学估分附近的分数线。 最后…

【接口优化方案解决】

文章目录 前言1、批量插入或者查询数据库2、异步思想 耗时操作&#xff0c;考虑放到异步3、空间换时间思想&#xff1a;恰当使用缓存。4. 预取思想&#xff1a;提前初始化到缓存5、借用线程池6. 事件回调思想&#xff1a;拒绝阻塞等待。7、锁粒度避免过粗8、切换存储方式&#…

Spring Clould 网关 - Gateway

视频地址&#xff1a;微服务&#xff08;SpringCloudRabbitMQDockerRedis搜索分布式&#xff09; Gateway网关-网关作用介绍&#xff08;P35&#xff09; Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2…

java八股文面试[JVM]——JVM内存结构

参考&#xff1a; JVM学习笔记&#xff08;一&#xff09;_卷心菜不卷Iris的博客-CSDN博客 JVM是运行在操作系统之上的&#xff0c;它与硬件没有直接的交互 JVM内存结构&#xff1a; 方法区&#xff1a;存储已被虚拟机加载的类元数据信息(元空间) 堆&#xff1a;存放对象实…

LVS集群 (NET模式搭建)

目录 一、集群概述 一、负载均衡技术类型 二、负载均衡实现方式 二、LVS集群结构 一、三层结构 二、架构对象 三、LVS工作模式 四、LVS负载均衡算法 一、静态负载均衡 二、动态负载均衡 五、ipvsadm命令详解 六、搭建实验流程 一、首先打开三台虚拟机 二、…

村口的人家排放污水,污水浸染了整个村子,怎么办

从前有一个很不错的村子里&#xff0c;村子里有很多户人家&#xff0c;随着生活水平越来越好&#xff0c;房子也修起来了&#xff0c;柏油马路也宽敞了&#xff0c;大家进出村子&#xff0c;都要走那条马路&#xff0c;要不就出不去。 目录 1. 修厕所 2. 村口的日家 3. 告诉…

【C语言】动态内存管理,详细!!!

文章目录 前言一、为什么存在动态内存分配二、动态内存开辟函数的介绍1.malloc2.calloc3.realloc4.free 三、动态内存开辟中的常见错误1.误对NULL进行解引用操作2.对于动态开辟的空间进行了越界访问3.对于非动态开辟的内存进行了free操作4.只free掉动态开辟内存的一部分5.多次f…

笔记:transformer系列

1、和其他网络的比较 自注意力机制适合处理长文本&#xff0c;并行度好&#xff0c;在GPU上&#xff0c;CNN和Self-attention性能差不多&#xff0c;在TPU&#xff08;Tensor Processing Uni&#xff09;效果更好。 总结&#xff1a; 自注意力池化层将当做key,value,query来…

意外发现Cortex-M内核带的64bit时间戳,比32bit的DWT时钟周期计数器更方便,再也不用担心溢出问题了

视频&#xff1a; https://www.bilibili.com/video/BV1Bw411D7F5 意外发现Cortex-M内核带的64bit时间戳&#xff0c;比32bit的DWT时钟周期计数器更方便&#xff0c;再也不用担心溢出问题了 介绍&#xff1a; 看参数手册的Debug章节&#xff0c;System ROM Table里面带Timestam…

django自动创建model数据

目前使用的环境&#xff1a;django4.2.3&#xff0c;python3.10 django通过一些第三方库&#xff0c;可以轻易的自动生成一系列的后台数据。 首先先创建一个数据库&#xff1a; 然后&#xff0c;在setting.py中就可以指定我们新创建的数据库了。 DATABASES {default: {ENGI…

食品饮料制造行业如何实现数字化转型和工业4.0

随着科技的不断进步和全球产业的不断发展&#xff0c;食品饮料制造行业也正迎来数字化转型和工业4.0的浪潮。这一转型不仅提升了生产效率和质量&#xff0c;还满足了消费者对更健康、更可持续产品的需求。本文将深入探讨食品饮料制造行业在数字化转型和工业4.0方面的趋势、挑战…

使用Python搭建服务器公网展示本地电脑文件

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 Python作为热度比较高的编程语言&#xff0c;其语法简单且语句清晰&#xff0c;而且python有…

Git,分布式版本控制工具

1.为常用指令配置别名&#xff08;可选&#xff09; 打开用户目录&#xff0c;创建.bashrc文件 &#xff08;touch ~/.bashrc&#xff09; 2.往其输入内容 #用于输出git提交日志 alias git-loggit log --prettyoneline --all --graph --abbrev-commit #用于输出当前目录所有文…

Redis Pub/Sub 指南

Redis 不仅仅是一个数据库&#xff0c;还可以作为支持发布和订阅&#xff08;Pub/Sub&#xff09;操作的消息代理。本文将使用 Navicat for Redis 简要概述 Redis 的 Pub/Sub 功能。 关于发布或订阅消息范式 Pub/Sub 是一种模式&#xff0c;发送者&#xff08;广播者&#xf…

C++11特性详解

一、简介 在C11标准出来之前&#xff0c;一直是C98/03标准占引领地位&#xff0c;而C98/03标准是C98标准在2003年将存在的一些漏洞进行了修复&#xff0c;但并没有核心语法的改动。相比于C98/03&#xff0c;C11则带来了数量可观的变化&#xff0c;其中包含了约140个新特性&…

linux部署clickhouse(单机)

一、下载安装 1.1、下载地址 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区阿里巴巴开源镜像站&#xff0c;免费提供Linux镜像下载服务&#xff0c;拥有Ubuntu、CentOS、Deepin、MongoDB、Apache、Maven、Composer等多种开源软件镜像源&#xff0c;此外还提供域名解析DNS、…

支持向量机SVM原理

目录 支持向量机SVM原理 SVM原理 从线性分类器说起 SVM的目标是最大化分类间隔 转化为对偶问题求解 支持向量机SVM原理 【数之道】支持向量机SVM是什么&#xff0c;八分钟直觉理解其本质_哔哩哔哩_bilibili SVM是由Vapnik等人于1995年提出的&#xff0c;在之后的20多年里…