Java学习【面向对象综合练习——实现图书管理系统】

Java学习【面向对象综合练习——实现图书管理系统】

  • 前期效果
  • 图书的创建
  • 用户的创建
  • 操作的实现
  • 完善操作
    • 显示图书
    • 查找图书
    • 新增图书
    • 借阅图书
    • 归还图书
    • 删除图书

前期效果

在这里插入图片描述
用户分为普通用户和管理员,登录进系统之后可以对图书进行一系列操作,此时我们要明白,对图书的操作是通过书架来执行的,我们平常在图书馆上借书就是在书架上

在这里插入图片描述

图书的创建

接下来我们来创建图书类,对图书的属性进行封装,并写上对应的get和set 方法,

    private String name;private String author;private int price;private String type;private boolean isBorrowed;public Book() {}public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}/······get set toString······/

接下来就是创建书架的类,书架上肯定不止一本书,所以这里选择数组来存储多个book对象,因为在一开始就有了一部分书,所以在创建书架的对象时,就要把图书的对象放进去

public class BookList {private Book[] books = new Book[10];//用到了组合private int usedSize = 0;//实际放的数量public BookList() {//创建对象之后就已经有了三本书books[0] = new Book("三国演义", "罗贯中", 20,"小说");books[1] = new Book("西游记", "吴承恩", 30,"小说");books[2] = new Book("红楼梦", "曹雪芹", 20,"小说");usedSize = 3;}
}

用户的创建

接着创建用户,而用户又分为普通用户和管理员,就可以通过继承来实现这种关系,这两种用户的菜单也不相同,就可以抽取出来,在子类进行重写

public abstract class User {//不同包的子类可以访问protected String name;public User(String name) {this.name = name;}public abstract int menu();
}

在这里插入图片描述
之后就可以在Main类里面以多态的方式,根据不同的对象调取不同的菜单

public class Main {public static User login() {Scanner sc = new Scanner(System.in);System.out.println("请输入用户名:");String name = sc.nextLine();System.out.println("请输入身份:1.管理员 2. 普通用户");int choice = sc.nextInt();if (choice == 1) {return new AdminUser(name);} else {return new NormalUser(name);}}public static void main(String[] args) {BookList bookList = new BookList();User user = login();}
}

操作的实现

菜单里的操作可以通过接口来实现这个业务逻辑,

public interface IOPeration {void work(BookList bookList);
}

例如添加图书,直接去实现一个操作接口,具体的逻辑再在本类中进行重写

public class AddOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("添加图书");}
}

接下来就是创建各种操作了
在这里插入图片描述
那么有了这些操作该怎么调用呢,无论时普通用户还是管理员,都是用户在操作,所以要在父类User中创建接口数组,再调用具体的方法实现操作
在这里插入图片描述
在这里插入图片描述
捋一下现在的逻辑
在这里插入图片描述
在这里插入图片描述

完善操作

接下来就是完善菜单中的操作内容了

显示图书

因为之前book是用数组存在BookList中的,所以只要遍历数组就可以了

BookList中要提供对应的get,set方法:

    public int getUsedSize() {return usedSize;}public Book getBook(int pos) {return books[pos];}public void setBook(int pos, Book book) {this.books[pos] = book;}

显示图书:

public class ShowOperation implements IOPeration{@Overridepublic void work(BookList bookList) {int currentSize = bookList.getUsedSize();for(int i= 0;i < currentSize;i++){System.out.println(bookList.getBook(i));//输出当前书架上的所有书籍信息}}
}

查找图书

明白了怎么遍历之后,查找图书就非常简单了

public class FindOperation implements IOPeration {@Overridepublic void work(BookList bookList) {System.out.println("请输入查找的图书:");Scanner sc = new Scanner(System.in);String name = sc.nextLine();int currentSize = bookList.getUsedSize();for(int i = 0;i < currentSize;i++){Book book = bookList.getBook(i);if(book.getName().equals(name)){System.out.println(book);return;}}System.out.println("不存在该图书");}
}

新增图书

public class AddOperation implements IOPeration {@Overridepublic void work(BookList bookList) {int currentSize = bookList.getUsedSize();if(currentSize == bookList.getBooks().length){System.out.println("书架已满,无法添加");return;}System.out.println("添加图书");System.out.println("请输入书名:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();System.out.println("请输入作者:");String author = scanner.nextLine();System.out.println("请输入价格:");int price = scanner.nextInt();scanner.nextLine();System.out.println("请输入类型:");String type = scanner.nextLine();Book book = new Book(name, author, price, type);//添加图书bookList.setBook(currentSize, book);bookList.setUsedSize(currentSize + 1);System.out.println("添加成功");}
}

添加之后要记得更改currentSize

借阅图书

借书其实就是查找之后满足借阅条件就可以借阅

public class BorrowOperation implements IOPeration{public void work(BookList bookList) {System.out.println("请输入借阅的图书:");Scanner sc = new Scanner(System.in);String name = sc.nextLine();int currentSize = bookList.getUsedSize();for(int i = 0;i < currentSize;i++){Book book = bookList.getBook(i);if(book.getName().equals(name)){//判断是否借出if(book.isBorrowed()){System.out.println("该图书已被借阅");return;}//修改借阅状态book.setBorrowed(true);System.out.println("借阅成功");return;}}System.out.println("不存在该图书");}
}

归还图书

public class ReturnOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("请输入归还的图书:");Scanner sc = new Scanner(System.in);String name = sc.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)) {//判断是否借出if (book.isBorrowed()) {//修改借阅状态book.setBorrowed(false);System.out.println("归还成功");return;}}}System.out.println("此书未被借出");}
}

删除图书

由于是用顺序表存储的图书,所以当删除其中的一本书之后,这本书后面的图书都要往前移

public class DeleteOperation implements IOPeration {@Overridepublic void work(BookList bookList) {System.out.println("请输入删除的图书:");Scanner sc = new Scanner(System.in);String name = sc.nextLine();int i = 0,pos = 0;int currentSize = bookList.getUsedSize();for(;i < currentSize;i++){Book book = bookList.getBook(i);if(book.getName().equals(name)){pos = i;break;}}if(i == currentSize){System.out.println("没有找到该图书");}for(int j = pos;j < currentSize - 1;j++){Book book = bookList.getBook(j + 1);bookList.setBook(j,book);}bookList.setBook(currentSize - 1,null);//更新currentSizebookList.setUsedSize(currentSize - 1);System.out.println("删除成功");}
}

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

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

相关文章

斐讯N1刷OpenWRT并安装内网穿透服务实现远程管理旁路由

文章目录 前言1. 制作刷机固件U盘1.1 制作刷机U盘需要准备以下软件&#xff1a;1.2 制作步骤 2. N1盒子降级与U盘启动2.1 N1盒子降级2.2 N1盒子U盘启动设置2.3 使用U盘刷入OpenWRT2.4 OpenWRT后台IP地址修改2.5 设置旁路由&无线上网 3. 安装cpolar内网穿透3.1 下载公钥3.2 …

时空数据治理白皮书(2024)

来源&#xff1a;泰伯智库&#xff1a; 近期历史回顾&#xff1a;

企业微信修改主体花了大几千的踩坑经验,家人们避雷

企业微信变更主体有什么作用&#xff1f;如果原有的公司注销了&#xff0c;或者要更换一家公司主体来运营企业微信&#xff0c;那么就可以进行变更主体&#xff0c;变更主体后才可以保留原来企业微信上的所有用户&#xff0c;否则就只能重新申请重新积累用户了。企业微信变更主…

什么情况下数据库事务会失效?

事务失效&#xff1a; 在Java中&#xff0c;数据库事务失效通常指的是事务无法保证其ACID特性&#xff0c;即原子性、一致性、隔离性和持久性。事务失效可能导致数据不一致&#xff0c;影响系统的可靠性和稳定性。以下是一些常见的事务失效情况&#xff1a; 1、未启用Spring事…

运维专题.Docker功能权限(Capabilities)管理和查看

运维专题 Docker功能权限&#xff08;Capabilities&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:htt…

MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model 论文总结

题目&#xff1a;MedSegDiff: Medical Image Segmentation&#xff08;图像分割&#xff09;with Diffusion Probabilistic Model&#xff08;扩散概率模型&#xff09; 论文&#xff08;MIDL会议&#xff09;&#xff1a;MedSegDiff: Medical Image Segmentation with Diffusi…

python-13(案例讲解)

目录 抓取链家前十页的数据 计算均价和总价 计算的类型&#xff08;整租&#xff0c;合租&#xff09; 计算的房型 抓取boss直聘前十页的数据 抓取boss直聘前十页的数据 将获取数据本地序列化 计算每个区的需求个数与均价 抓取链家前十页的数据 链家网址&#xff1a;长…

海思SD3403,SS928/926,hi3519dv500,hi3516dv500移植yolov7,yolov8(18)-Yolov8改进

yolov8进行二次改进后进行了量化和速度测试 &#xff0c;没有明显速度增加。对比一下模型的性能。 分别用原始模型和改后的模型进行了100 epochs训练。 以下是原始模型的结果。 class P R map0.5 map.95 1 0.79 0.49 0.571 0.316 2 0.851 0.738 0.801 0.538 …

勇于创新,勤于探索 —— 我的创作纪念日

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

【Java】全局统一异常处理类封装

文章目录 全局异常处理类自定义异常如何使用&#xff08;手动抛出异常&#xff09; 我是一名立志把细节说清楚的博主&#xff0c;欢迎【关注】&#x1f389; ~ 原创不易&#xff0c; 如果有帮助 &#xff0c;记得【点赞】【收藏】 哦~ ❥(^_-)~ 如有错误、疑惑&#xff0c;欢…

纯CSS丝滑边框线条动画

在这个网站&#xff08;minimal-portfolio-swart.vercel.app&#xff09;发现一个不错的交互效果&#xff0c;用户体验效果很不错。如封面图所示&#xff0c;这个卡片上有一根白色的线条围绕着卡片移动&#xff0c;且在线条的卡片内部跟随这一块模糊阴影&#xff0c;特别是在线…

关于Nginx热部署的细节分析

文章目录 前言一、环境准备二、热部署步骤总结 前言 Nginx由于其高并发、高性能、可扩展性好、高可靠性、热部署、BSD许可证等优势被广泛使用&#xff0c;本人主要针对热部署的部分展开说明热部署的具体步骤以及步骤背后发生的具体事情。 本次热部署采用的Nginx版本号为&…

在CentOS 7上配置Elasticsearch开启自启动需要通过systemd服务管理器来实现

在CentOS 7上配置Elasticsearch开启自启动需要通过systemd服务管理器来实现。 1. 安装Elasticsearch 首先,确保你已经安装了Elasticsearch。如果还没有安装,可以按照以下步骤进行安装: # Import the Elasticsearch PGP key sudo rpm --import https://artifacts.elastic.…

常见设计模式之Java实现

引言 设计模式是软件工程中的一套被反复使用的、大家公认的、经过分类编目的代码设计经验的总结。它们是解决特定问题的模板&#xff0c;可以提高代码的可重用性、可读性和可维护性。本文将介绍Java中常见的20种设计模式&#xff0c;并提供具体的使用场景、设计模式的解释以及…

高通 Android 12/13冻结屏幕

冻结屏幕很多第一次听到以为是Android一种异常现象&#xff0c;实则不然&#xff0c;就是防止用户在做一些非法操作导致问题防止安全漏洞问题。 1、主要通过用户行为比如禁止下拉状态栏和按键以及onTouch事件拦截等&#xff0c;不知道请看这篇文章&#xff08;Touch事件传递流…

GitHub打不开的解决方案

1、打开https://sites.ipaddress.com/github.com/找到DNS Resource Records&#xff0c;复制github的ip地址&#xff0c;先保存起来&#xff1a; 140.82.112.32、打开https://sites.ipaddress.com/fastly.net/找到DNS Resource Records&#xff0c;复制其中一个ip地址&#xf…

基于Nacos实现Sentinel规则持久化

基于Nacos实现Sentinel规则持久化 一、Sentinel使用痛点二、解决方案2.1 保存本地文件2.2 保存数据库2.3 保存到Nacos 三、规则持久化到Nacos3.1 Nacos服务端修改配置3.2 Sentinel控制台修改配置3.3 Nacos数据源整合到Sentinel中 一、Sentinel使用痛点 SpringCloudAlibaba帮我…

迷你手持小风扇哪个牌子质量好点?这五款迷你手持小风扇不要错过

随着空调的普及&#xff0c;我们对夏日热浪的抵抗力逐渐减弱。当从凉爽的空调屋步入闷热的户外、拥挤的交通工具或公共场所时&#xff0c;如何抵御热浪的侵袭成为大众关注的焦点。在这样的背景下&#xff0c;迷你手持小风扇凭借其便携性和即时降温功能&#xff0c;成为众多人的…

341_C++_使用C++中的std::map容器查找键的时候,注意给个默认值,防止成员函数value()未查找到键,确保即使键不存在,你也能安全地获取一个值

在C++中,std::map是一个关联容器,它存储的元素都是键值对(key-value pairs),并且按键(key)自动排序。 std::map有一个成员函数value(),它用于返回与给定键相关联的值。如果该键在map中不存在,则value()函数返回提供的默认值。 map<int, int> mKeyMaps; int ke…

降价!免费!AI大模型开启价格战,企业如何“薅”出绿色财富?

近期&#xff0c;国内大模型技术供应商之间的价格战&#xff0c;使得这项原本成本较高的技术变得更加亲民&#xff0c;极大降低了企业的技术采用门槛。这不仅为企业提供了经济实惠的技术解决方案&#xff0c;更为他们的绿色低碳转型之路带来了新的机遇。 随着全球气候变化问题…