JavaSE图书管理系统实战

news/2024/5/21 12:56:38

代码仓库地址:Java图书管理系统

1.前言

该项目将JavaSE的封装继承多态三大特性,使用了大量面向对象的操作,有利于巩固理解

(1)实现效果

083f7cc5e8f34c53b678a0bbf64b6720.png

2cc156cba1bb4dc7959f4644dea6393d.png

5d329bcaacea4415ace06ee26807fd5a.png

08189bc1cc1e41f4918d6468a6834730.png

74f1a6d537184755aefbf466b6fef16b.png

29385db8e69d421499ffd6ad8d231e62.png

9d17834955c846a6a01ced97f863a49a.png

2.实现步骤

第一步先把框架搭建起来,即创建出人:管理员和普通用户,书:书架

再实现内部的业务逻辑

(1)书book包下类的实现 

此时我们先实现图书中的成员属性

a46938f26be44f658b520797372a9fc8.png

1.Book类的实现

此时我们实现了图书所对应的成员变量,以及所对应的构造方法来初始化,Getter和Setter方法。toString方法。

  1. 注意:构造方法中不需要初始化布尔类型的islend,因为它默认是false未借出的状态
  2. 因为成员变量都是private修饰的,只能在当前类下访问,所以我们使用Getter和Setter使得它在其它类的实现下可以访问(即后期新增图书设置书名,作者等时)
  3. 重写toString方法是为了能够正确显示数据所对应的成员变量,而不是地址
package book;public class Book {private String name;private String author;private int price;private String type;private boolean islend;//是否被借出,默认为false未借出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 isIslend() {return islend;}public void setIslend(boolean islend) {this.islend = islend;}public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", islend=" + islend +'}';}
}

2.BookList类的实现

  1. usedSigned用来记录当前存放了多少书
  2. private Book[] books = new Book[10];是指书架上能放十本书
  3. 当将BookList中初始化为三本书时,要将usedSized置为3
package book;public class BookList {private Book[] books = new Book[10];private int usedSized;public BookList() {books[0]=new Book("三国演义","罗贯中",89,"小说");books[1]=new Book("西游记","吴承恩",78,"小说");books[2]=new Book("红楼梦","曹雪芹",49,"小说");this.usedSized=3;}
}

 (2)用户user包下类的实现

1.User类的实现 

 

package user;public class User {protected String name;public User(String name) {this.name = name;}
}

2.AdminUser类的实现 

package user;public class AdminUser extends User{public AdminUser(String name) {super(name);}public void menu() {System.out.println("*******管理员菜单******");}
}

3.NormalUser类的实现 

package user;public class NormalUser extends User{public NormalUser(String name) {super(name);}public void menu() {System.out.println("*******普通用户菜单******");}
}

以上代码Main函数的实现情况

  1. AdminUser和NormalUser在login类中的返回值应返回User,因为它俩都继承了User 
  2. 需要增加User类下的menu()方法,并将该类和该方法设为抽象类,不描述对象只用于继承以便当user调用不同用户下的菜单发生动态绑定a61a447ef30742bf9da1bc46fe6f0c36.png
  3. 引用AdminUser和 NormalUser发生向上转型体现在不同用户下都存在的menu()方法
  4. User user = login();此时发生动态绑定,有可能引用管理员用户,也有可能引用普通用户
    
  5. user.menu();  //user调用的对象不一样,调用同一个方法会发生动态绑定

 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 scanner = new Scanner(System.in);String userName = scanner.nextLine();System.out.println("请输入你的身份: 1-》管理员  0-》普通用户");int choice = scanner.nextInt();if (choice == 1) {return new AdminUser(userName);} else {return new NormalUser(userName);}//引用AdminUser和 NormalUser发生向上转型体现在不同用户下都存在的menu()方法}public static void main(String[] args) {//此时发生动态绑定,有可能引用管理员用户,也有可能引用普通用户User user = login();user.menu();  //user调用的对象不一样,调用同一个方法会发生动态绑定}
}

实现 

0aa1e8da6221429c9a21a70f0c73d12f.png

完善不同用户下的menu菜单 

1.管理员用户下的menu

 @Overridepublic 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("请输入你的操作: ");Scanner scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}

 1.普通用户下的menu

@Overridepublic 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;}

重写menu设置了int类型的返回值,所以要修改User下抽象类menu的返回值 

a057eb41c2b04a3dbba3d481d812f0b7.png

此时不同用户下调用menu菜单返回的choice是一个整型值,我们定义一个变量来接收这个值,以便后续当返回choice调用不同用户下所对应的功能

571484b8018e4747afdef32bc87443f8.png

 

(3)接口及不同用户下不同操作的实现

//IOperation接口
package operation;import book.BookList;public interface IOperation {public void work(BookList bookList);
}//AddOperation类
package operation;import book.BookList;public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("新增图书......");}
}//BorrowedOperation类
package operation;import book.BookList;public class BorrowedOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("借阅图书......");}
}//DelOperation类
package operation;import book.BookList;public class DelOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("删除图书......");}
}//ExitOperation类
package operation;import book.BookList;public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统......");}
}//FindOperation类
package operation;import book.BookList;public class FindOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("查找图书......");}
}//ReturnOperation类
package operation;import book.BookList;public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("归还图书......");}
}//ShowOperation类
package operation;import book.BookList;public class ShowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("展示图书......");}
}
  1. 为了区分哪些是管理员的操作哪些是普通用户的操作,我们使用接口的方法来组织这些对象 0cdccae0909f445b89d9331969e3aab2.png
  2. 并在User类下定义一个调用接口的数组,protected IOperation[] iOperations;(不能定义在对应的用户下面,因为不同的用户会继承User类,这样就不用重复定义)c8da47b8542c442d972be580dd6227cf.png
  3. 因为AdminUser和NormalUser继承了User类所以它俩都继承了User类下定义的数组
  4. 不同用户下对应的操作不一样,所以当我们继承User类中定义的数组时,在不同的用户下进行不同的初始化 0d609de355b3467290824d18004e78a7.png

 5.对应的下标要相对应aecf24700f2644b4855dda8b66067984.png

6.当User发生动态绑定引用管理员用户或者普通用户时会返回choice,我们又在不同用户下初始化了ioperation数组,那我们怎样操作当输入choice时调用相应用户所对应的类进而再发生动态绑定输出对应的类

310e38e86ed24bdc9ea1d059577fb93d.png

117178c7cfbe48159cb4b374c3337698.png

(4)具体业务的实现 

1.FindOperation

8db2e10b2d4741b9aa0fe1582177486b.png

27ad18699fac4da7913d5a6f777a274d.png

eb169fc959af4ff6a893aa55e514daea.png

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("查找图书......");System.out.println("请输入你要查找的图书名:");Scanner scanner = new Scanner(System.in);String bookName = scanner.nextLine();int CurrentSize = bookList.getUsedSized();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("没有你要找的书");}
}

 6824be4d4469457aa18a53f00ecbdaef.png

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

 3.AddOperation

805d1038641245d4857b76f55e42a4e8.png

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;}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();System.out.println("请输入你要新增图书的价格:");int price = scanner.nextInt();Book book = new Book(name,author,price,type);int currentSize = bookList.getUsedSized();//把书放到指定的位置bookList.setBook(currentSize,book);//修改usedSizebookList.setUsedSized(currentSize+1);System.out.println("新增图书成功");/*for (int i = 0; i < currentSize; i++) {Book temp = bookList.getBook(i);if(temp.getName().equals(name)) {System.out.println("已经存在,不能增加!");return;}}*/}
}

4.DelOperation

删除图书和添加图书类似

4d3e1dbb4fc14b179ab8dd8b94b9f134.png

48f9e4a5e9904e7ca9b398c0980ca933.png

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.getUsedSized();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 = pos; j < CurrentSize-1; j++) {//bookList[j] = bookList[j+1]Book book = bookList.getBook(j+1);bookList.setBook(j,book);}bookList.setUsedSized(CurrentSize-1);bookList.setBook(CurrentSize-1,null);System.out.println("删除成功");}
}

5.ExitOperation

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

6.BorrowedOperation

只需找到该图书后改变它是否被借出的状态即可

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.getUsedSized();int pos = -1;int i = 0;for (i = 0; i < CurrentSize; i++) {Book book = bookList.getBook(i);if(book.getName().equals(bookName)) {book.setIslend(true);System.out.println("借阅成功");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.getUsedSized();int pos = -1;int i = 0;for (i = 0; i < CurrentSize; i++) {Book book = bookList.getBook(i);if(book.getName().equals(bookName)) {book.setIslend(false);System.out.println("归还成功");return;}}System.out.println("归还失败");}
}

 

 


http://www.mrgr.cn/p/07056158

相关文章

Java 集合(ArrayList、LinkedList、HashMap、HashSet、LinkedHashMap、LinkedHashSet)【补充复习】

Java 集合&#xff08;ArrayList、LinkedList、HashMap、HashSet、LinkedHashMap、LinkedHashSet&#xff09;【补充复习】 Java 集合概述Collection 接口继承树Map 接口继承树 Collection 接口方法使用 iterator 接口遍历集合元素使用 forearch 遍历集合元素 List 接口List 实…

git 拉取或者推送代码报错问题解决

报错截图:当推送远程时,提示无法访问github地址 原因:在拉取或者是提交项目时,会发生git的http和https代理,我们电脑本地已经存在SSL协议的协议,可以取消http和https代理 在git中运行: git config --global --unset http.proxy git config --global --unset https.proxy…

【VUE】使用Vue和CSS动画创建滚动列表

使用Vue和CSS动画创建滚动列表 在这篇文章中&#xff0c;我们将探讨如何使用Vue.js和CSS动画创建一个动态且视觉上吸引人的滚动列表。这个列表将自动滚动显示项目&#xff0c;类似于轮播图的方式&#xff0c;非常适合用于仪表盘、排行榜或任何需要在有限空间内展示项目列表的应…

【MYSQL锁】透彻地理解MYSQL锁

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.锁 1.1 概述 1.2 全局锁 1.2.1 语法 1.2.1.1 加全局锁 1.2.1.2 数据备份 1.2.1.3 释放锁 1.2.1.4 特点 1.2.1.5 演示 1.3 表级锁 1.3.1 介绍 …

paddleocr图片文本识别

1. paddleocr  PaddleOCR 是一个基于 PaddlePaddle 深度学习框架的开源 OCR(Optical Character Recognition,光学字符识别)工具。它提供了一系列的预训练模型和工具,可以用于文本检测、文本识别和文本方向检测等任务。 提供了易于使用的 Python API,可以轻松地在你的项目…

Docker入门实战教程

文章目录 Docker引擎的安装Docker比vm虚拟机快 Docker常用命令帮助启动类命令镜像命令docker imagesdocker searchdocker pulldocker system dfdocker rmi 容器命令redis前台交互式启动redis后台守护式启动Nginx容器运行ubuntu交互式运行tomcat交互式运行对外暴露访问端口 Dock…

HarmonyOS NEXT应用开发之图片缩放效果实现

介绍 图片预览在应用开发中是一种常见场景,在诸如QQ、微信、微博等应用中均被广泛使用。本模块基于Image组件实现了简单的图片预览功能。 使用说明:双指捏合缩放图片大小 双击图片进行图片的大小切换 图片在放大模式下,滑动图片查看图片的对应位置效果图预览实现思路image组…

【python之DRF学习】三大方法之认证

title: 【python之DRF学习】三大方法之认证 date: 2024-04-17 21:00:56 星期三 updated: 2024-04-17 21:01:00 星期三 description: cover: 内置三大方法: drf之APIView内部的必须会经过的三大认证/方法: 认证、权限、频率一、认证组件 1、简介 登录认证的限制​ 认证组件…

软考——程序设计语言

1.低级语言和高级语言 计算机硬件只能识别由0、1组成的机器指令序列&#xff0c;即机器指令程序&#xff0c;因此机器指令是最基本的计算机语言。由于机器指令是特定的计算机系统所固有的、面向机器的语言&#xff0c;所以用机器语言进行程序设计时效率很低&#xff0c;程序的…

死锁

多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致俩个或者多个线程都在等待对方释放资源。 package syn;public class DeadLock {public static void main(String[] args) {Makeup s1 = new Makeup(0,"小明");Makeup s2 = new Makeup(…

腾讯音乐:说说Redis脑裂问题?

Redis 脑裂问题是指,在 Redis 哨兵模式或集群模式中,由于网络原因,导致主节点(Master)与哨兵(Sentinel)和从节点(Slave)的通讯中断,此时哨兵就会误以为主节点已宕机,就会在从节点中选举出一个新的主节点,此时 Redis 的集群中就出现了两个主节点的问题,就是 Redis …

服务器挖矿病毒解决ponscan,定时任务解决

服务器挖矿病毒解决ponscan&#xff0c;定时任务解决 挖矿病毒会隐藏chattr的操作权限&#xff0c;让我们无法删除病毒文件&#xff0c;杀掉病毒进程。所以要去下载chattr.c的文件&#xff0c;编译成a.out。然后再对原来的chattr文件的权限进行修改。然后覆盖掉它。 chattr.c …

新标准日本语 课后练习

自学错误可能较多&#xff0c;听力题不需要听力的就没听录音 第二十課 スミスさんはピアノを弾くことができます 練習&#xff11;&#xff0d;&#xff11; &#xff11;張さんは日本の歌を歌うことができます 张先生会唱日本歌 &#xff12;小野さんは自転車に乗ることがで…

centos7 安装 Mysql 5.7.28,详细完整教程

https://cloud.tencent.com/developer/article/18863391. 下载 MySQL yum包wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm 复制2.安装MySQL源rpm -Uvh mysql57-community-release-el7-10.noarch.rpm 复制3.安装MySQL服务端,需要等待一些时间yum ins…

openGauss Prometheus-Exporter组件环境部署

环境部署用户可以从Prometheus的官网上下载Prometheus-server和node-exporter,然后根据官方文档中的说明启动它们;也可以通过DBMind提供的快捷部署工具进行部署;如果用户自行部署,则可以跳到 部署过程中为支持部署位置正确以及后续的运行和监测...。通过命令行进行Promethe…

STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档)

目录 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 2.2 设计电路规范 3、代码 4、资料清单 资料下载地址&#xff1a;STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档) 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 经过一个星期的画PCB&#xff0c;今…

第 6 章 URDF、Gazebo与Rviz综合应用(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 6.7 URDF、Gazebo与Rviz综合应用 关于URDF(Xacro)、Rviz 和 Gazebo 三者的关系&#xff0c;前面已有阐述&…

【进程地址空间】进程的独立性 | 虚拟地址物理地址 | 页表 | 写时拷贝

目录 前言 基本概念 进程的独立性 虚拟地址&物理地址 进程地址空间 页表&#xff08;虚拟地址☞物理地址&#xff09; 写时拷贝 基本理解 地址空间 写时拷贝&#xff08;浅拷贝&#xff09; 数据独立性的保证☞写时拷贝 写时拷贝的优点 图解分析 前言 我们…

【Azure APIM】列举几种在APIM 策略中的主动生产的错误语句

问题描述 在为APIM服务配置了诊断日志(Diagnostic Setting),把日志收集在Log A Workspace中,需要验证日志中是否能查看到请求的错误信息。所以想人为的来制造一些错误。经过网络搜索,参考Policy的文档介绍后,完成了以下3种错误 第一种:使用 return-response 返回指定错误…

CORS 跨域问题解决预检(OPTIONS)请求解释

场景&#xff1a; 业务要求从把系统B嵌入到系统A中&#xff0c;系统A和系统B是完成不同的两个域名&#xff0c;前端同事完成系统嵌入后&#xff0c;从A系统内部调用B系统的接口时候发现跨域错误&#xff08;CORS error&#xff09;&#xff0c;如下&#xff1a; 什么是跨域&…