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

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

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

相关文章

从零学习Linux操作系统 第三十二部分 Ansible中的变量及加密

一、变量的基本设定及使用方式 变量命名&#xff08;与shell相同&#xff09;&#xff1a; 只能包含数字&#xff0c;下划线&#xff0c;字母 只能用下划线或字母开头 .变量级别&#xff1a; 全局从命令行或配置文件中设定的paly:在play和相关结构中设定的主机:由清单&…

基于 Win Server 2008 复现 IPC$ 漏洞

写在前面 本篇博客演示了使用 winXP&#xff08;配合部分 win10 的命令&#xff09;对 win server 2008 的 IPC$ 漏洞进行内网渗透&#xff0c;原本的实验是要求使用 win server 2003&#xff0c;使用 win server 2003 可以规避掉很多下面存在的问题&#xff0c;建议大家使用 …

如何在Linux部署FastDFS文件服务并实现无公网IP远程访问内网文件——“cpolar内网穿透”

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

TCP多线程模型、IO模型(select、poll、epoll)

我要成为嵌入式高手之3月11日Linux高编第十九天&#xff01;&#xff01; ———————————————————————————— TCP并发模型 一、TCP多线程模型&#xff1a; 缺点&#xff1a;创建线程会带来资源开销&#xff0c;能够现的并发量比较有限 二、IO模型&…

【PHP】PHP通过串口与硬件通讯,向硬件设备发送数据并接收硬件返回的数据

一、前言 之前写过两篇PHP实现与硬件串口交互的文章&#xff0c;一篇是【PHP】PHP实现与硬件串口交互&#xff0c;接收硬件发送的实时数据&#xff08;上&#xff09;_php串口通信-CSDN博客&#xff0c;另一篇是【PHP】PHP实现与硬件串口交互&#xff0c;向硬件设备发送指令数…

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

腾讯T10级高工技术&#xff0c;安卓全套VIP课程全网免费送&#xff1a;https://docs.qq.com/doc/DSG1vYnRxSElnU3hE 学习鸿蒙开发势在必行。鸿蒙开发可参考学习文档&#xff1a;https://qr21.cn/FV7h05 介绍 图片预览在应用开发中是一种常见场景&#xff0c;在诸如QQ、微信、…

Facebook商城号为什么被封?如何防封?

由于Facebook商城的高利润空间&#xff0c;越来越多的跨境电商商家注意到它的存在。Facebook作为全球最大、用户量最大的社媒平台&#xff0c;同时也孕育了一个巨大的商业生态&#xff0c;包括广告投放、商城交易等。依托背后的大流量&#xff0c;Facebook商城起号较快&#xf…

GPU,一统天下

三十年前&#xff0c;CPU 和其他专用处理器几乎处理所有计算任务。那个时代的显卡有助于加快 Windows 和应用程序中 2D 形状的绘制速度&#xff0c;但没有其他用途。 快进到今天&#xff0c;GPU 已经成为业界最具主导地位的芯片之一。 但具有讽刺意味的是&#xff0c;图形芯片…

ETCD入门

目录 一、简介 1. etcd是什么 2. 特点 3. 使用场景 4. 关键字 5. 工作原理 6. 获取 二、安装 1. etcd安装前的介绍 2. 安装 3. 启动 4. 创建一个etcd服务 三、ETCD的使用 一、简介 1. etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目&#xff0c;它的目标是…

Retrofit

1.导入依赖 //Retrofit 核心库implementation("com.squareup.retrofit2:retrofit:2.9.0")//响应数据自动序列化//JSONimplementation("com.squareup.retrofit2:converter-gson:2.9.0")//String类型implementation("com.squareup.retrofit2:converter…

Python速度大比拼:与主流编程语言的速度对决

在评估用于具体业务的编程语言时&#xff0c;经常考虑的一个关键指标之一是执行速度。Python以其简单性和可读性而闻名&#xff0c;但有时却因其性能而受到质疑。在这个领域&#xff0c;我们需要深入比较分析Python在执行速度方面与其他流行的编程语言相比的情况。 程语言执行速…

网络编程(3/6)

使用C语言完成数据库的增删改 #include<myhead.h> int do_add(sqlite3 *ppDb) {int numb;char name[50];int salary;printf("请输入员工信息&#xff1a;工号、姓名、薪水\n");scanf("%d %s %d",&numb,name,&salary);char sql[128];char *e…

Nginx七层的负载均衡使用keepalived实现高可用

目录 一、环境准备 二、两台nginx服务器作为代理服务器,配置nginx的负载均衡 三、Keepalived实现调度器 Proxy-master 与 Proxy-slave机器同时操作安装 备份配置文件 编辑主Proxy-master的配置文件 编辑从 Proxy-slaver的配置文件 四、 启动KeepAlived&#xff08;主备…

CleanMyMac X4.15中文完整免费版下载

CleanMyMac X是一款功能全面的Mac管理软件&#xff0c;它能帮助用户清理无用的文件&#xff0c;监控系统健康&#xff0c;管理启动项&#xff0c;甚至还能移除恶意软件&#xff0c;确保你的Mac保持最佳状态。其直观的界面设计使得新手用户也能轻松上手&#xff0c;一键扫描和清…

【算法】一类支持向量机OC-SVM

【算法】一类支持向量机OC-SVM 前言一类支持向量机OC-SVM 概念介绍示例编写数据集创建实现一类支持向量机OC-SVM完整的示例输出 前言 由于之前毕设期间主要的工具就是支持向量机&#xff0c;从基础的回归和分类到后来的优化&#xff0c;在接触到支持向量机还有一类支持向量机的…

脚手架cli快速创建Vue2/Vue3项目

前言&#xff1a; 本文的nodejs版本是14.21.3 第一步 进入cmd窗口 1、全局安装webpack npm install webpack-g&#xff0c; npm install webpack-g 第二步 2、全局安装vue脚手架 npm install -g vue/cli 第三步 3、初始化vue项目 &#xff08;vue脚手架使用webpack模…

宝妈做什么兼职副业好?适合她们的有哪些?执行力才是关键

现在的宝妈&#xff0c;生完孩子以后&#xff0c;尤其是宝宝上幼儿园之前&#xff0c;为了照顾宝宝&#xff0c;不能去外面上班&#xff0c;所以很多妈妈都为孩子做出了很大的牺牲&#xff0c;但同时又要承担着家庭经济的压力&#xff0c;尤其是现在注重个性独立的时代&#xf…

基于微信小程序的电子商城购物平台的设计与实现(论文+源码)_kaic

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;电子商城购物平台小程序被用户普遍使用&#xff0c;为方便…

图及图的存储

目录 1.图的相关概念 2.图的存储 2.1.直接存法 1.查询是否存在某条边 2.遍历一个点的所有出边 3..遍历整个图 应用 2.2.邻接矩阵 1.查询是否存在某条边 2.遍历一个点的所有出边 3..遍历整个图 应用 2.3.邻接表 1.查询是否存在某条边 2.遍历一个点的所有出边 3..遍…

RabbitMQ应用场景

1、异步处理 假设想象一下我们做一个商城项目&#xff0c;在用户支付模块中&#xff0c;可能会涉及到其它业务&#xff0c;比如&#xff1a;积分折扣、消费券、短信验证等功能。我们传统的执行步骤是逐步执行&#xff0c;也就是说当用户点击支付 ----> 积分折扣 ----> 消…