图书管理借阅系统【Java简易版】Java三大特征封装,继承,多态的综合运用

前言
前几篇文章讲到了Java的基本语法规则,今天我们就用前面学到的数组,类和对象,封装,继承,多态,抽象类,接口等做一个图书管理借阅系统。

文章目录

  • 🥇1.分析图书管理系统要实现的功能
  • 🥇2.在IDEA中创建对象
  • 🥇3.实现book对象
    • 🥉Book类
    • 🥉BookList类
  • 🥇4.功能
  • 🥇5.面向用户
    • 🥉普通用户类
    • 🥉图书管理员
    • 🥉测试类
  • 🥇5.实现操作功能
    • 🥉新增图书
    • 🥉删除图书
    • 🥉查找图书
    • 🥉借阅图书
    • 🥉归还图书
    • 🥉打印图书
    • 🥉退出系统

🥇1.分析图书管理系统要实现的功能

Java语言是面向对象的,所以首先要分析完成这个图书管理系统,有哪些对象:
👱使用者User
📘书Book
📲操作Operation
使用者分为两种,普通用户(NormalUser)和图书管理员(AdminUser)对于普通用户来说,需要查找,借阅,归还图书操作。
在这里插入图片描述

对于图书管理员来说,需要查找,新增,删除,显示图书操作。
在这里插入图片描述

🥇2.在IDEA中创建对象

在这里插入图片描述

🥇3.实现book对象

🥉Book类

书有以下属性:
书名 String name
作者 String author
价格 int price
类型 String type
是否被借出 boolean isBorrow

	private String name;private String author;private int price;private String type;private boolean isBorrowed;

注意:这里的控制符全部设置为了私有的,需要提供方法来获取
提供get( )和set( )进行设置和获取

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

提供一个构造方法

注意构造方法中不提供isBorrow,isBorrow是boolean类型,默认值为false,表示未被借出

 public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}

提供ToString方法显示书的信息

  public String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", isBorrowed=" + isBorrowed +((isBorrowed==true)?"已被借阅":"未被借阅")+'}';}

完整的book类

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=" + isBorrowed +((isBorrowed==true)?"已被借阅":"未被借阅")+'}';}
}

🥉BookList类

用于存放book,相当于书架
设置一个book类型的数组存放书

 private Book[] books;

再设置一个成员变量记录书的数量

   private int usedSize;

提供一个构造方法,进行一次初始化

 public BookList() {this.books =new Book[DEFAULT_CAPACITY];//初始化三本书this.books[0]=new Book("三国演义","罗贯中",10,"小说");this.books[1]=new Book("西游记","吴承恩",10,"小说");this.books[2]=new Book("红楼梦","曹雪芹",10,"小说");this.usedSize=3;}

再提供一个book类型的成员方法获取下标为pos的book

 public Book getBook(int pos) {return books[pos];}

再提供一个方法,给一个数组下标和book,存放到bookList中

 public void setBooks(int pos,Book book) {books[pos]=book;}

提供一个方法,获取书的数量

  public int getUsedSize() {return usedSize;}

提供一个方法,修改书的数量

public void setUsedSize(int usedSize) {this.usedSize = usedSize;}

提供一个方法,获取book数组

 public Book[] getBooks() {return books;}

完整的BookList类

package book;public class BookList {private Book[] books;private int usedSize;private static final int DEFAULT_CAPACITY = 10;public BookList() {this.books =new Book[DEFAULT_CAPACITY];//初始化三本书this.books[0]=new Book("三国演义","罗贯中",10,"小说");this.books[1]=new Book("西游记","吴承恩",10,"小说");this.books[2]=new Book("红楼梦","曹雪芹",10,"小说");this.usedSize=3;}public Book getBook(int pos) {return books[pos];}public void setBooks(int pos,Book book) {books[pos]=book;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public Book[] getBooks() {return books;}
}

🥇4.功能

管理员或是普通用户,对书的操作都是在BookList类的数组books中进行操作,提供一个IOperation的接口,实现对数组的操作

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

创建各种类,来实现对书的所有操作,引用IOperation接口,对方法进行重写

举个例子:

public class AddOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("新增图书!");}
}

🥇5.面向用户

普通用户和图书管理员都是用户,需要进行操作,所以我们直接创建一个User类

package user;import book.BookList;
import operation.IOperation;public abstract class User {protected String name;protected IOperation[] iOperation;public User(String name) {this.name = name;}public abstract int menu();public void doOperation(int choice, BookList bookList) {iOperation[choice].work(bookList);}}

🥉普通用户类

package user;import operation.*;import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);this.iOperation=new IOperation[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation()};}@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);System.out.println("请输入你的操作:");int choice=scanner.nextInt();return choice;}
}

🥉图书管理员

package user;import operation.*;import java.util.Scanner;public class AdminUser extends User{public AdminUser(String name) {super(name);this.iOperation=new IOperation[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation(),};}@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);System.out.println("请输入你的操作:");int choice=scanner.nextInt();return choice;}
}

🥉测试类

将所有类连接起来,使类之间相互交互

package user;import book.BookList;import java.util.Scanner;import operation.*;public class Main {public static User login(){System.out.println("请输入你的名字: ");Scanner scanner=new Scanner(System.in);String name= scanner.nextLine();System.out.println("请输入你的身份:1.管理员   2.普通用户->");int choice=scanner.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();while(true){int choice= user.menu();System.out.println("choice: "+choice);user.doOperation(choice,bookList);}}
}

运行结果
在这里插入图片描述
在这里插入图片描述

🥇5.实现操作功能

🥉新增图书

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("新增图书!");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 curr=bookList.getUsedSize();for (int i = 0; i < curr; i++) {Book book1=bookList.getBook(i);if(book1.getName().equals(name)){System.out.println("该书已存在,无法存放!");} else if (curr==bookList.getBooks().length) {System.out.println("已经存放满,无法再存放!");}else {bookList.setBooks(curr,book);bookList.setUsedSize(curr+1);}}}
}

🥉删除图书

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("删除图书!");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要删除的书名:");String name=scanner.nextLine();int curr= bookList.getUsedSize();int pos=-1;for (int i = 0; i < curr; i++) {Book book1=bookList.getBook(i);if(book1.getName().equals(name)) {pos = i;break;}}if (pos==-1){System.out.println("没有找到书名!");}else {int j=pos;for ( ; j < curr-1; j++) {Book book=bookList.getBook(j+1);bookList.setBooks(j,book);}bookList.setBooks(j,null);bookList.setUsedSize(curr-1);System.out.println("删除成功!");}}
}

🥉查找图书

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("查找图书!");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要查找的书名:");String name=scanner.nextLine();int curr= bookList.getUsedSize();for (int i = 0; i < curr; i++) {Book book=bookList.getBook(i);if(book.getName().equals(name)){System.out.println("找到你想查找的书名:");System.out.println(book);return;}}System.out.println("你要查找的书籍不存在");}
}

🥉借阅图书

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

🥉归还图书

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("归还图书!");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要归还的书名:");String name= scanner.nextLine();int curr= bookList.getUsedSize();for (int i = 0; i < curr; i++) {Book book=bookList.getBook(i);if(book.getName().equals(name)){book.setBorrowed(false);System.out.println("归还成功!");System.out.println(book);return;}}System.out.println("未查找到你要归还的书名!");}
}

🥉打印图书

package operation;import book.BookList;public class ShowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("打印图书!");int curr= bookList.getUsedSize();for (int i = 0; i < curr; i++) {System.out.println(bookList.getBook(i));}}
}

🥉退出系统

package operation;import book.BookList;public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出图书!");System.out.println("退出系统!");System.exit(0);}
}

写文至此,如有不同见解或者疑惑,欢迎在评论区留言!

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

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

相关文章

二、 MySQL 内部技术架构

二、 MySQL 内部技术架构 047 Mysql内部支持缓存查询吗&#xff1f; 当MySQL接收到客户端的查询SQL之后&#xff0c;仅仅只需要对其进行相应的权限验证之后&#xff0c;就会通过Query Cache来查找结果&#xff0c;甚至都不需要经过Optimizer模块进行执行计划的分析优化&…

STM32 F103C8T6学习笔记1:开发环境与原理图的熟悉

作为一名大学生&#xff0c;学习单片机有一段时间了&#xff0c;也接触过嵌入式ARM的开发&#xff0c;但从未使用以及接触过STM32C8T6大开发使用&#xff0c;于是从今日开始&#xff0c;将学习使用它~ 本文介绍STM32C8T6最小系统开发环境搭建注意问题&#xff0c;STM32C8T6单片…

【笔记】移动光猫改桥接

1. 登录后台 移动光猫的超管和密码&#xff08;百度的&#xff09; 账号&#xff1a;CMCCAdmin 密码&#xff1a;aDm8H%MdA 浏览器访问 192.168.1.1 并登录 2. 选择连接 点击“网络”&#xff0c;在“连接名称”下拉框选择 INTENET_R_VID 字样的连接&#xff0c;并截图备…

通用指令(汇编)

一、数据处理指令1&#xff09;数学运算数据运算指令的格式数据搬移指令立即数伪指令加法指令带进位的加法指令减法指令带借位的减法指令逆向减法指令乘法指令数据运算指令的扩展 2&#xff09;逻辑运算按位与指令按位或指令按位异或指令左移指令右移指令位清零指令 3&#xff…

Kernel Exception导致手机重启案例分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、高温触发 Kernel Exception 重启问题二、解决方案三、提高电池温度方案 一、 高温触发 Kernel Exception 重启问题 手机 电池温度 默认60度以上高温…

【css】css位置布局position

position 属性规定应用于元素的定位方法的类型。元素其实是通过使用top、bottom、left 和 right 属性来定位的。但是&#xff0c;需要首先设置了 position 属性&#xff0c;否则这些属性将不起作用。根据不同的 position 值&#xff0c;它们的设置特点不同。 其有五个不同的位…

elfk

1. 2. ​​​​​​​ 3. 4. 5.

文件或目录损坏且无法读取

如上图报错&#xff0c;我们直接用cmd命令输入【CHKDSK C: /F】然后回车 电脑重启后可以了&#xff0c;希望能帮助各位小伙伴

K8S系列文章之 离线安装自动化工具Ansible

参考 文档 离线安装 Ansible - DevOps - dbaselife 一、Ansible简介 Ansible是一款开源的IT配置管理工具&#xff0c;常被IT界的小伙伴们用于自动化的场景&#xff0c;多用在服务部署、配置管理方面。配置文件采用最常见的yaml格式&#xff0c;学习起来也是比较容易&#xff…

【前端实习生备战秋招】—HTML 和 CSS面试题总结(三)

【前端实习生备战秋招】—HTML 和 CSS面试题总结&#xff08;三&#xff09; 1.行内元素有哪些&#xff1f;块级元素有哪些&#xff1f; 空(void)元素有那些&#xff1f; CSS 规范规定&#xff0c;每个元素都有 display 属性&#xff0c;确定该元素的类型&#xff0c;每个元素…

学python的心得体会1000字,学python的心得体会2000字

这篇文章主要介绍了学python的心得体会2000字&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 1. 初学者应该从简单的练习开始&#xff0c;先掌握基本的语法和概念&#xff0c;…

IT 基础架构自动化

什么是 IT 基础架构自动化 IT 基础架构自动化是通过使用技术来控制和管理构成 IT 基础架构的软件、硬件、存储和其他网络组件来减少人为干预的过程&#xff0c;目标是构建高效、可靠的 IT 环境。 为什么要自动化 IT 基础架构 为客户和员工提供无缝的数字体验已成为企业的当务…

【H5】盘点HTML5新特性

html5总的来说比html4多了十个新特性&#xff0c;但其不支持ie8及ie8以下版本的浏览器 文章目录 一、语义标签二、增强型表单三、音频和视频四、Canvas绘图五、SVG绘图六、地理定位七、拖放API八、Web Worker九、Web Storage十、WebSocket 一、语义标签 html5语义标签&#x…

10_Vue3 其它的组合式API(Composition API)

Vue3 中的其它组合式API 1.shallowReactive 与 shallowRef 2. readonly 与 shallowReadonly 3.toRaw 与 markRaw 4.customRef 5.provide 与 inject 6.响应式数据的判断

AIGC:【LLM(四)】——LangChain+ChatGLM:本地知识库问答方案

文章目录 一.文件加载与分割二.文本向量化与存储1.文本向量化(embedding)2.存储到向量数据库 三.问句向量化四.相似文档检索五.prompt构建六.答案生成 LangChainChatGLM项目(https://github.com/chatchat-space/langchain-ChatGLM)实现原理如下图所示 (与基于文档的问答 大同小…

Qt--QPlugin插件

写在前面 Qt–动态链接库一文中提到&#xff0c;动态方式加载dll只能加载 extern "C“ 的导出函数&#xff0c;而无法加载类&#xff0c;因此可以使用Qt提供的插件来实现导出类的动态加载。 QPlugin是Qt插件框架的一部分&#xff0c;是一种轻量级的插件系统&#xff0c;…

网络防御(7)

课堂实验 R1 [Huawei] int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 100.1.12.2 24 protocolAug 1 2023 10:24:09-08:00 Huawei gOlIFNET/4/LINK STATE(1)[4]:The1ineIp on the interface GigabitEthernet0/0/0 has entered the Up state. [Huawei-GigabitEthernet0/0/…

安全渗透知识总结二

目录 一、html实体编码 1、Unicode字符编码 2、字符的数字表示 3、常见实体编码 4、url 协议 主机 http状态码 http常用的状态码 端口 常见协议端口 查询参数 锚点 url字符 urlcode字符 绝对url和相对url 二、字符编码 Ascll字符集 html字符集 html的url编码 …

Linux CentOS安装NVIDIA GPU驱动程序和NVIDIA CUDA工具包

要在CentOS上安装NVIDIA驱动程序和NVIDIA CUDA工具包&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 准备工作&#xff1a; 确保您的系统具有兼容的NVIDIA GPU。您可以在NVIDIA官方网站上查找支持CUDA的GPU型号列表。如果您之前已经安装了Nouveau驱动程序并禁用了它…

【网关】Shenyu网关自动注册和同步元数据和URL,Shenyu-admin从nacos同步数据方案

Shenyu官网数据同步设计方案如下面图&#xff0c;同步方式支持 Zookeeper、Http 长轮询、Websocket、Nacos、Etcd 和 Consul等。我们选择的时候&#xff0c;要小心配置参数&#xff0c;这里我以官网http和自实现的nacos为例。 官网示例代码 http方式注册 yml配置admin的账号信息…