JavaSE:图书管理系统

目录

一、前言

二、内容需求

三、类的设计

(一)图书类

1.Book 类

 2.BookList 类

 (二)操作类

1.添加图书AddOperation类

2.借阅图书BorrowOperation类

3.删除图书DelOperation类

4.显示图书ShowOperation类

5.退出系统ExitOperation类

6.查找图书FindOperation类

7.归还图书ReturnOperation类

8.IOperation接口

(三)用户类

1.User 类

2.AdminUser类

3.NormalUser类

(四)Main函数入口

四、运行演示

(一)管理员

(二)普通用户

​编辑 五、总结


一、前言

Hello!大家晚上好呀~,我们前面分享了许多关于JavaSE的一些语法知识,今天我们就通过运用前面所学的知识来写一个图书管理系统,让我们对这些知识点掌握得更加熟练。

二、内容需求

1 、简单的登录
2 、管理端

  • 查找图书
  • 新增图书
  • 删除图书
  • 显示图书
  • 退出系统

3 、用户端

  • 查找图书
  • 借阅图书
  • 归还图书
  • 退出系统

三、类的设计

我们创建一个book包,然后在book包里面放一个Book类和一个BookList类;接着创建一个operation包,这里面放的是我们的各种操作方法;然后是我们的user包,里面分别放我们的管理员的类和普通成员的类;最后是我们的Main类,我们的程序从这里开始执行。

(一)图书类

1.Book 类

我们在book 包里面创建 Book 类。该类里面是我们的图书属性,包括书名,作者名,价格、种类、是否被借出,然后给出set和get方法,方便我们后面对数据进行修改,最后重写一下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 == true ? " 已借出" : " 未借出") +//", isBorrowed=" + isBorrowed +'}';}
}

 2.BookList 类

创建好Book类后就要创建书架类,书架是存放我们的书籍的地方,我们可以在这里面给一个数组,用于存放不同的书。然后定义我们书的数量,这里我们用userSize用来记录我们图书的数量。set和get方法用于我们对userSize的调整,同时我们给出了调整书架里面书的方法。这里我们写一个构造方法,用于把我们的书架初始化为有三本书,指定了书的数量userSize的大小为3。

package book;public class BookList {private Book[] books = new Book[10];private int usedSize;public BookList() {books[0] = new Book("三国演义", "罗贯中", 10, "小说");books[1] = new Book("西游记", "吴承恩", 11, "小说");books[2] = new Book("红楼梦", "曹雪芹", 12, "小说");this.usedSize = 3;}public Book getBook(int pos) {return books[pos];}public void setBook(int pos, Book book) {books[pos] = book;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public boolean isFull() {if (this.usedSize == books.length) {return true;} elsereturn false;}
}

 (二)操作类

1.添加图书AddOperation类

在这个类实现对图书的增加,先输入书的信息,然后 new 一本书。

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class AddOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("新增图书...");if (bookList.isFull()) {System.out.println("书架满了,不能新增!");return;}System.out.println("请输入你要新增图书的名称:");Scanner scanner = new Scanner(System.in);String bookName = scanner.nextLine();System.out.println("请输入你要新增图书的作者:");String author = scanner.nextLine();System.out.println("请输入你要新增图书的价格:");int price = scanner.nextInt();//scanner在输入输出时,要int在String后面,除非用户scanner.nextLine()来回收nextInt换行scanner.nextLine();System.out.println("请输入你要新增图书的类型:");String type = scanner.nextLine();Book book = new Book(bookName, author, price, type);int currentSize = bookList.getUsedSize();//目前存放3本书bookList.setBook(currentSize, book);bookList.setUsedSize(currentSize + 1);System.out.println("新增图书成功!");}
}

2.借阅图书BorrowOperation类

在这个类里实现图书借阅。

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class BorrowedOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("借阅图书...");System.out.println("请输入你要借阅的书籍:");Scanner scanner = new Scanner(System.in);String bookName = scanner.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(bookName)) {book.setBorrowed(true);System.out.println("借阅成功!");return;}}System.out.println("借阅失败!");}
}

3.删除图书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("删除图书...");System.out.println("请输入你要删除的书籍名称:");Scanner scanner = new Scanner(System.in);String bookName = scanner.nextLine();int currentSize = bookList.getUsedSize();int pos = -1;int i = 0;for (i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(bookName)) {//如果找到这本书就记录它的下标pos = i;break;}}if (i >= currentSize) {System.out.println("没有找到这本书!");return;}//开始删除for (int j = 0; j < currentSize - 1; j++) {Book book = bookList.getBook(j + 1);bookList.setBook(j, book);}System.out.println("删除图书成功!");//修改setUsedSize//把后一个位置的图书往前一个位置存放bookList.setUsedSize(currentSize - 1);//将最后一个位置置为空bookList.setBook(currentSize - 1, null);}
}

4.显示图书ShowOperation类

在这个类里面实实现图书属性的显示。

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();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);System.out.println(book);}}
}

5.退出系统ExitOperation类

在这里实现对图书管理系统的退出功能。

package operation;import book.BookList;public class ExitOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("退出系统");int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize - 1; i++) {bookList.setBook(i, null);}System.exit(0);}
}

6.查找图书FindOperation类

在这里实现对图书的查找功能。

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperation implements IOperation {public void work(BookList bookList) {System.out.println("查找图书...");System.out.println("请输入你要查找的书籍:");Scanner scanner = new Scanner(System.in);String bookName = scanner.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(bookName)) {System.out.println("找到了这本书");System.out.println(book);return;}}System.out.println("没有找到这本书");}
}

7.归还图书ReturnOperation类

在这里实现图书的归还功能。

package operation;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 bookName = scanner.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(bookName)) {book.setBorrowed(false);System.out.println("归还成功!");return;}}System.out.println("归还失败!");}
}

8.IOperation接口

我们在这里写一个接口,后面我们调用这个接口,就可以重写这个抽象类。

package operation;import book.BookList;public interface IOperation {public void work(BookList bookList);
}

(三)用户类

1.User 类

我们在这里写抽象类,是为了方便对它进行继承。我们的抽象类有name成员,还有IOperation类型的数组,我们可以向接口里面放我们的操作方法,其它的类都实现了我们的接口并且重写了接口里面的work()方法。

package user;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 doIoperations(int choice, BookList bookList) {this.iOperations[choice].work(bookList);}
}

2.AdminUser类

我们这里实现管理员菜单。

package user;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("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.NormalUser类

我们在这里先帮父类写构造方法,然后将IOperation进行初始化里面放着是我们普通用户所能进行的一系列操作,再下面就是我们的菜单方法,因为我们的普通用户和管理员所能进行的操作是不一样的,需要同时选择我们的操作。

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 BorrowedOperation(),new ReturnOperation()};}public int menu() {System.out.println("*****普通用户菜单*****");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("********************");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}

(四)Main函数入口

我们一开始先new一个BookList——书架,然后开始登录操作输入身份之后,返回一个用户的对象,此时我们拥有了两个对象,一个是书架bookList,还有就是我们的用户对象,然后我们的用户就可以对我们的书架进行一系列的操作。

import book.BookList;
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.管理员 2.普通用户");int choice = scanner.nextInt();if (choice == 1) {AdminUser adminUser = new AdminUser(name);return adminUser;} else {NormalUser normalUser = new NormalUser(name);return normalUser;}}public static void main(String[] args) {BookList bookList = new BookList();//user有可能引用管理员身份,有可能引用普通用户身份while (true) {User user = login();int choice = user.menu();user.doIoperations(choice, bookList);}}
}

程序运行后先打印我们的菜单,顺便返回我们输入的操作,接着拿着我们的操作choice和我们的书架bookList去执行,user.doWork(),拿着我们的choice找到IOperation,运行对应的操作,最终实现我们指定的功能。

四、运行演示

(一)管理员

  

(二)普通用户

 

 五、总结

我们通过利用前面所学的知识点:类,抽象类,封装,继承,多态,接口等知识,将它们综合运用起来,就可以写出一个简单的图书管理系统,以上就是本期JavaSE的分享内容,感谢大家的支持,我们下次再见!!!

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

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

相关文章

通俗易懂地解释Go语言不同版本中垃圾回收机制的演进过程

完整课程请点击以下链接 Go 语言项目开发实战_Go_实战_项目开发_孔令飞_Commit 规范_最佳实践_企业应用代码-极客时间 Go 1.3时代 - 标记清除算法 这就像一个人要打扫房间,首先需要暂停其他活动。然后开始查看房间里的每件物品,对于自己仍需要使用的物品做上记号。查看完毕后…

【三十六】【算法分析与设计】综合练习(3),39. 组合总和,784. 字母大小写全排列,526. 优美的排列

目录 39. 组合总和 对每一个位置进行枚举 枚举每一个数出现的次数 784. 字母大小写全排列 526. 优美的排列 结尾 39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不…

手写Spring框架

手写Spring框架 准备工作Spring启动和扫描逻辑实现依赖注入的实现Aware回调模拟实现和初始化机制模拟实现BeanPostProcessor (Bean的后置处理器) 模拟实现Spring AOP 模拟实现Spring Bean生命周期源码分析 Spring中两种生成代理的方式题外话 Spring事务相关Spring事务传播机制S…

【Java】用吃拉面的方式打开Java程序的执行流程

你还在为记不住Java程序的执行流程而苦恼吗&#xff1f;那你来对地方了&#xff0c;这篇博客将让你一次记住终生不忘。 接下来&#xff0c;我们用去兰州拉面的过程&#xff0c;来形象地看一下&#xff0c;当你运行一个的main方法时&#xff0c;到底发生了什么&#xff1a; 走进…

c++找最高成绩

根据给定的程序&#xff0c;写成相关的成员函数&#xff0c;完成指定功能。 函数接口定义&#xff1a; 定义max函数&#xff0c;实现输出最高成绩对应的学号以及最高成绩值。 裁判测试程序样例&#xff1a; #include <iostream> using namespace std; class Student{…

C++——栈和队列容器

前言&#xff1a;这篇文章我们将栈和队列两个容器放在一起进行分享&#xff0c;因为这两个要分享的知识较少&#xff0c;而且两者在结构上有很多相似之处&#xff0c;比如栈只能在栈顶操作&#xff0c;队列只能在队头和队尾操作。 不同于前边所分享的三种容器&#xff0c;这篇…

HarmonyOS 应用开发-ArkUI(ets)仿“腾讯新闻”APP

一、效果演示 1、新闻列表页 2、新闻详情页、图片展示页 3、视频页 4、动态页 二、 流程图 –本来自定义了视频的控制栏的&#xff0c;但是发现VideoController()控制器的bug会导致控制器失效&#xff0c;所以没继续做。视频页先不搞了。 三、文件组织&#xff08;“我的页面…

网工内推 | 深信服、宁德时代,最高20K招安全工程师,包吃包住

01 深信服科技 招聘岗位&#xff1a;安全服务工程师 职责描述&#xff1a; 1.负责现场安全服务项目工作内容&#xff0c;包含渗透测试、安全扫描、基线核查、应急响应等&#xff1b; 2.协助用户完成安全测试漏洞整改、复测工作&#xff1b; 3.为用户提供网络、主机、业务系统等…

dg_mmld部分复现

Ours ( K ˆ \^{K} Kˆ2)复现结果– Photo&#xff1a;0.9634730538922156 (at Epoch 23) Art&#xff1a;0.8125 (at Epoch 23) Cartoon&#xff1a;0.7713310580204779 (at Epoch 18) 差距在可接受范围内 辅助信息 If you send 作者 an e-mail, 作者 will tell you a URL w…

2022年蓝桥杯省赛——重合次数

目录 题目链接&#xff1a;1.重合次数 - 蓝桥云课 (lanqiao.cn) 题目描述 答案提交 运行限制 思路 总结 题目链接&#xff1a;1.重合次数 - 蓝桥云课 (lanqiao.cn) 题目描述 在同一天中, 从上午 6 点 13 分 22 秒到下午 14 点 36 分 20 秒, 钟表上的 分针和秒针一共重合…

HTML - 请你谈一谈img标签图片和background背景图片的区别

难度级别:中级及以上 提问概率:65% 面试官当然不会问如何使用img标签或者background来加载一张图片,这些知识点都很基础,相信只要从事前端开发一小段时间以后,就可以轻松搞定加载图片的问题。但很多人习惯用img标签,很多人习惯用backgro…

Java 数据类型转换

String 转 char 数组 String str "abc"; char[] charArr str.toCharArray();char 数组转 String char[] charArr{a, b, c}; String str new String(charArr);char 字符转 String 使用 String.valueOf() 方法 char ch a; String str String.valueOf(ch);使…

element-ui的年份范围选择器,选择的年份需等于或小于当前年份,选择的年份范围必须在三年之内

写在前面 日期限制处理&#xff08;禁用&#xff09;&#xff0c;下面我以我这边的需求为例&#xff0c; 选择的年份需等于或小于当前年份 选择的年份范围必须在三年之内 1.限制起始日期小于截止日期 1&#xff09;根据用户选中的开始日期&#xff0c;置灰不可选的日期范围&…

【腾讯云 TDSQL-C Serverless 产品体验】饮水机式使用云数据库

云计算的发展从IaaS&#xff0c;PaaS&#xff0c;SaaS&#xff0c;到最新的BaaS&#xff0c;FasS&#xff0c;在这个趋势中serverless(去服务器化&#xff09; 计算资源发展Physical -> Virtualisation -> Cloud Compute -> Container -> Serverless。 一、背景介绍…

LeetCode 264. 丑数 II

解题思路 三个指针进行遍历&#xff0c;归并排序。 相关代码 class Solution {public int nthUglyNumber(int n) {int temp1;int a[] new int[n];a[0] 1;for(int i0,j0,k0,index1;index<n;index){temp Math.min(a[i]*2,Math.min(a[k]*5,a[j]*3));a[index] temp;if(te…

什么是电子邮件组,为什么要使用它们?

在当今时代&#xff0c;电子邮件无处不在&#xff0c;尤其是对于商业活动而言。电子邮件的重要性不容忽视&#xff0c;因为它在沟通中极为高效。然而&#xff0c;电子邮件也存在降低工作效率和阻碍流程的风险。在这种情况下&#xff0c;电子邮件群组就是最佳的解决方案。什么是…

代码随想录算法训练营第二十九天|491.递增子序列,46.全排列,47.全排列 II

题目&#xff1a;491.递增子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中至少有两个元素。你可以按任意顺序返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一…

VUE路由跳转、传参总结

路由跳转方式有哪些&#xff1f; 在Vue中&#xff0c;路由跳转主要有以下几种方式&#xff1a; 使用router-link组件&#xff1a; <router-link to"/home">Home</router-link>使用编程式导航 // 字符串 this.$router.push(home)// 对象 this.$router.…

大学生拥有一台服务器可以做什么?

云服务器的崭新世界&#xff0c;充满了无限的可能性和激动人心的挑战。无论你是想要建立个人网站、运行定时任务&#xff0c;还是学习Linux系统&#xff0c;云服务器都为你提供了一个极具灵活性和自由度的平台。 让我们一起深入探索&#xff0c;看看拥有一台服务器你可以做些什…

【学习 在服务器上使用bypy直接下载百度云盘的资源。

参考&#xff1a;bypy 具体步骤 step1&#xff1a; pip install bypystep2&#xff1a; bypy info第一次输入该命令&#xff0c; 点击进入网址&#xff0c;点击登陆后&#xff0c;获取token&#xff08;10分钟内有效&#xff09;&#xff0c;然后输入到命令行&#xff1a;…