【JAVA类】利用接口的多继承实现———图书管理系统【附源码】
引言
在我们学习了一些java的基础语法之后,需要把这些知识点可以串起来,这里使用一个简单的小项目可以很好的帮助我们牢记这些知识点,今天就带大家学习一个有关java的小项目,很多学校也经常把这个项目作为他们的课程设计——经典的图书管理系统。(ps:不懂的知识可以看往期文章)

这里必须提前给大家说一下,要想看懂这篇文章,必须得掌握我往期的文章:带你玩转java封装和继承(上),JAVA如何利用接口实现多继承问题。只有看明白这些文章,才能理解本次图书管理系统的代码。链接给大家放这里了~~
http://t.csdnimg.cn/vYS14
http://t.csdnimg.cn/DQynp
图书管理系统界面:
普通用户界面菜单:
1.查找图书
2.新增图书
3.删除图书
4.显示图书
0.退出系统
---------------------------------------------------------------------------------------------------------------------------------
管理员界面菜单:
1.查找图书
2.借阅图书
3.归还图书
0.退出系统
如何搭建基本框架:
首先我们先创建一些项目里一些我们需要用到基础的类来完善我们整个逻辑框架,
首先右击src按步骤创建一个User的包,这个包里首先放的就是我们的的用户类的一些功能和管理员类的一些功能。根据我们上面的需求两者都需要对应的功能菜单。
AdminUser:
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;}
NormalUser:
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;}
这里有一个细节,不知道你有没有发现,这两段代码的菜单打印我都使用的是int返回值,这是为什么呢,原因其实仔细思考一下就可以得出答案,由于二者的菜单内容的不同我们需要根据不同的对象,打印不同的菜单,为了区分这两个对象我们根据返回值的不同进行区分。现在看不懂没关系,看到后面的代码你就明白了。
User

添加这个类的原因是在AdminUser和NormalUser中有许多共性的部分,我们可以把这些部分抽取出来,创建一个新的类User,只需要继承就好了。
我们还需要一个main方法来测试我们代码的正确性,这里创建一个main类:
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){AdminUesr adminUesr=new AdminUesr(name);return adminUesr;}else{NormalUser normalUser=new NormalUser(name);return normalUser;}}public static void main(String[] args) {User user= login();BookList bookList = new BookList();while(true) {int choice = user.menu();user.doIoperations(choice, bookList);}}
}

那么我们有了用户的编写,接下来就得管理图书了,同样的,我们新建一个Book包里面存放有关书的一些类,大体上是book类和bookList类,
book:
public class book {private String name;private String author;private int price;private String type;private boolean isLend;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 isLend() {return isLend;}public void setLend(boolean lend) {isLend = lend;}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==true ? "已借出" : "未借出")+
// ", isLend=" + isLend +'}';}}


好了,有了书我们还得有一个书架把书管理起来,这里我们创建一个bookList类:

我们给这里直接放了三本书,并且设置了此时书的个数usedSize,这样操作起来比较方便。
好了,上面把基础的一些信息打印好了,现在我们需要实现具体的功能了即:查找图书,添加图书...,那么我如何写这些功能呢,由于用户与管理员的不同,直接以类的形式写比较麻烦,我们这里将所有的功能都以接口的形式实现,你需要哪个功能直接引用就好了。
这里我们创建一个IOperation接口里面实现一个抽象方法(work),当每个功能类引用这个接口之后,都可以用这个work方法来对书架上的书进行操作。
package Operation;
import book.BookList;
public interface IOperation {void work(BookList bookList);
}
实现业务:
接下来就实现每个功能了:
AddOperation:
public class AddOperation implements IOperation{public void work(BookList bookList){System.out.println("新增图书.....");if (bookList.isFull()) {System.out.println("书架满了,不能新增图书了!!!");return;}Scanner scanner=new Scanner(System.in);System.out.println("请输入你要新增的书名:");String bookName=scanner.nextLine();System.out.println("请输入你要新增的图书的作者:");String author=scanner.nextLine();System.out.println("请输入你要新增的图书价格:");int price=scanner.nextInt();System.out.println("请输入你要新增的图书的类型:");String type=scanner.nextLine();book book1=new book(bookName,author,price,type);int currentSize= bookList.getUsedSize();bookList.setBook(currentSize,book1);bookList.setUsedSize(currentSize+1);System.out.println("新增图书成功!");}
}

这里提前给大家说一下,为了管理方法方便,我们将所有的功能都引用一个IOperation接口,后面创建一个IOperation数组,你的对象需要什么功能直接方到数组里面就好了,这样就完成了不同对象不同功能的实现。
ShowOperation
思路:给方法的参数传一个书架类型bookList,获取当前的书的个数,利用for循环进行打印,总体来说比较简单。
package Operation;import book.BookList;
import book.book;public class ShowOperation implements IOperation{public void work(BookList bookList){System.out.println("显示图书.....");int currentSize= bookList.getUsedSize();for (int i=0;i<currentSize;i++) {book book1 = bookList.getbooks(i);System.out.println(book1);}}
}
BorrowOperation
思路:首先还是得获取一个书架,这样才可以操作数组里的书,然后输入你要查找的书名,获取书架上书的个数,使用for循环找到你要的书,然后我们这里是将你借走后的书的状态改为true代表这本书被借走。(这里说一下寻找书的时候我们使用equls函数,用于判别两个字符串是否相同)。
package Operation;import book.BookList;import java.util.Scanner;import book.book;
public class BorrowOperation 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 book1=bookList.getbooks(i);if(bookName.equals(book1.getName())){book1.setLend(true);System.out.println("找到你要借阅的图书了");System.out.println(book1);return;}}System.out.println("没有你要借阅的图书!");}
}
DelOperation
这里我们对于删除的理解是在这个书架上找到删除的书的下一本,然后依次往上面覆盖,这样完成的删除操作,同时,别忘了删除后一定要将图书的个数减一哦~
比如此时我们要删除红楼梦:



package Operation;import book.BookList;
import book.book;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 bookName=scanner.nextLine();int currentSize= bookList.getUsedSize();int pos=-1;for (int i=0;i<currentSize;i++) {book book1=bookList.getbooks(i);if(book1.getName().equals(bookName)){pos=i;break;}if(i>=currentSize){System.out.println("没有你要删除的图书!");return;}for (int j=pos;j<currentSize-1;j++) {book book2=bookList.getbooks(j+1);bookList.setBook(j,book2);}bookList.setUsedSize(currentSize-1);bookList.setBook(currentSize-1,null);System.out.println("删除成功!");}}
}
FindOperation
找书的业务有很多种按书名找,按作者找.....这里我们统一采用按书名去找,那么我们选择一个for循环,找到我们需要的书名,最后打印出来。
package Operation;import book.BookList;
import book.book;
import java.util.Scanner;public class FindOpertion 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[i];book book1 = bookList.getbooks(i);if (book1.getName().equals(bookName)) {System.out.println("找到了这本书:");System.out.println(book1);return;}}System.out.println("没有你要找的书....");}
}
ReturnOperation
其实这里和借书的操作基本一致,都是先找到你要操作的书名,后面将书的状态改为false,代表这本书仍然在书架上。
package Operation;import book.BookList;
import book.book;import java.util.Scanner;public class ReturnOPeration 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 book3=bookList.getbooks(i);if(bookName.equals(book3.getName())){book3.setLend(false);return;}}System.out.println("没有你要归还的图书!");return;}
}
Showoperation
查看图书也是比较简单的,我们使用for循环,将书架上面的书依次打印出来就好了。
package Operation;import book.BookList;
import book.book;public class ShowOperation implements IOperation{public void work(BookList bookList){System.out.println("显示图书.....");int currentSize= bookList.getUsedSize();for (int i=0;i<currentSize;i++) {book book1 = bookList.getbooks(i);System.out.println(book1);}}
}
相关文章:
【JAVA类】利用接口的多继承实现———图书管理系统【附源码】
引言 在我们学习了一些java的基础语法之后,需要把这些知识点可以串起来,这里使用一个简单的小项目可以很好的帮助我们牢记这些知识点,今天就带大家学习一个有关java的小项目,很多学校也经常把这个项目作为他们的课程设计——经典的…...
Linux进程概念僵尸进程孤儿进程
文章目录 一、什么是进程二、进程的状态三、Linux是如何做的?3.1 R状态3.2 S状态3.3 D状态3.4 T状态3.5 t状态3.6 X状态3.7 Z状态 四、僵尸进程4.1 僵尸进程危害 五、孤儿进程 一、什么是进程 对于进程理解来说,在Windows上是也可以观察到的,…...
实体店如何引流成交裂变?打造流量新引擎的秘诀
在数字化浪潮席卷的今天,实体店经营面临着前所未有的挑战与机遇。社区店作为连接居民日常生活的桥梁,如何在激烈的市场竞争中脱颖而出,实现引流、成交与裂变,成为摆在每一位实体店创业者面前的重要课题。 作为一名鲜奶吧开店5年的…...
蓝桥杯(日期问题纯暴力)
纯纯暴力,写的想吐,玛德服了。 但是复习了vector去重方法,日期的合法性判断。 #include <iostream> #include <vector> #include <cstring> #include <algorithm>using namespace std; vector<int> res; st…...
ES: ES+Kibana 环境部署
ESKibana 部署 机器信息 10.10.8.62 10.10.8.63 10.10.8.64版本选择:6.8.1 基础环境优化 所有节点 # 关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service# 查看selinux getenforce # 关闭selinux setenforce 0 # 永久关闭se…...
Find My产品越来越得到市场认可,伦茨科技ST17H6x芯片赋能厂家
苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch,如今的Find My已经不单单可以查找苹果的设备,随着第三方设备的加入,将丰富Find My Network的版图。产…...
Linux系统——Haproxy高性能负载均衡软件
目录 一、Haproxy介绍 1.Haproxy定义 2.Haproxy主要特性 二、安装Haproxy 1.yum安装 2.第三方rpm包安装 3.编译安装 3.1解决Lua环境 3.2编译安装Haproxy 三、配置文件详解 1.状态页 2.日志管理 2.1定义日志到其他主机站点 3.指定进程线程个数 4.cpu亲缘性 5.多进…...
Python办公自动化之PDF(二)
Python操作PDF二 1、PyMuPDF简介2、 1、PyMuPDF简介 PyMuPDF(也称Fitz)开源,提供了一整套用于处理PDF文件的综合工具。使用PyMuPDF,用户可以高效地执行打开PDF、提取文本、图像和表格、操作旋转和裁剪等页面属性、创建新PDF文档以…...
登录失败重试次数安全设计方案
1、登录失败重试次数设计方案 1、无论是账号还是密码错误,统一提示:用户名或密码错误,账号剩余登录次数N! 2、同一账号连续登录失败5次,锁定该账号5分钟,5分钟后可以再重试登录。 开发设计 keyÿ…...
Django——模板
Django——模板 Django 提供一种动态生成 HTML 页面 —— 模板 1、模板语言 模板语言(DTL): 变量 , 注释 , 标签 , 过滤器 , 模板继承 1、变量 <body> <!-- 这个是前端中的注释 --> {# 这种是Django中模板语言的…...
角蜥优化算法 (Horned Lizard Optimization Algorithm ,HLOA)求解无人机路径优化
一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化飞行时间和节省能量消耗。 二、算法介…...
Windows下 OracleXE_21 数据库的下载与安装
Oracle 数据库的下载与安装 数据库安装包下载数据库安装访问数据库进行测试Navicat连接数据库 1. 数据库安装包的下载 1.1 下载地址 Oracle Database Express Edition | Oracle 中国 1.2 点击“下载 Oracle Database XE”按钮,进去到下载页面(选择对…...
新手如何快速上手学习单片机?
读者朋友能容我,不使博文负真心 新开专栏,期待与诸君共享精彩 个人主页:17_Kevin-CSDN博客 专栏:《单片机》 学习单片机是一个有趣且有挑战性的过程。单片机是一种微控制器,广泛应用于各种电子设备和嵌入式系统中。在这…...
grpc的验证器
简介 在使用grpc库时候 ,很多时候我们需要对反序列化的参数进行校验,代码中有很多参数校验的代码,如果手动实现,会非常繁琐,对于grpc来说,在定义proto的时候使用直接定义参数的限制规则是一种更合理、更优雅的方式,插…...
无法找到concrt140.dll怎么办?concrt140.dll丢失的5种解决方法
在我们使用计算机的时候,偶尔会遭遇一些技术问题,其中一个比较常见的问题就是出现了"丢失concrt140.dll文件"的提示。当我们的电脑告诉我们缺少了concrt140.dll文件时,常常是因为某些程序无法找到这个文件而导致了程序的运行异常。…...
Elasticsearch 分享
一、Elasticsearch 基础介绍 ElasticSearch 是分布式实时搜索、实时分析、实时存储引擎,简称(ES), 成立于2012年,是一家来自荷兰的、开源的大数据搜索、分析服务提供商,为企业提供实时搜索、数据分析服务,…...
cpu masks的初始化
在内核中,有几个位图变量是用作标识cpu数量和状态的,它们分别是: 变量名称用途循环所使用的宏cpu_possible_mask系统中有多少个可以运行的cpu核for_each_possible_cpucpu_present_mask系统中有多少个可处于运行状态的cpu核for_each_present_…...
【软件测试面试】银行项目测试面试题+答案(二)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 面试题࿱…...
视频极速切割无损工具免费版,亲测好用!
问题描述 最近想兼职做自媒体,最初想法是想把视频资源下载到本地,本地做一些剪辑和图文配音发布到自媒体app上,但是要把视频(腾讯视频qlv转mp4看我上一篇文章,也是免费版)切割成一小段的片段用手机剪太费劲了,网上好多…...
LightDB ecpg 支持 exec sql execute ... end-exec【24.1】【oracle 兼容】
LightDB 从24.1 版本开始支持 oracle pro*c 中执行匿名块的语法(之前可以通过do 语句执行匿名块): EXEC SQL EXECUTEanonymous block END-EXEC;因为匿名块不是SQL标准的一部分,所以此用法也不存在于SQL标准中。 示例 #include …...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...

