基于Java封装继承多态实现的一个简单图书系统

首先我们大概了解下图书系统的需求

 1.要有两种身份 管理员和普通用户。普通用户和管理员分别对应的功能不一样,需要分开实现

2. 图书系统肯定要有图书,和存放图书的地方,存放就用数组来实现

3.实现对应用户的功能

接下来我们第一步:

首先创建一个book的包,里面存放图书类和存放图书的列表

在图书类中我们要有图书的属性,我们这边简易版只有图书名,作者,类型,价格和图书状态(借出,未被借出)

因为是自己使用,为了安全性使用private修饰,然后构造get,set方法来进行set值和get值,在构造一个toString方法,方便后面来打印,还有一个带参数的构造方法,方便后面进行新建图书

接下来实现存放图书

首先需要创建一个数组来存放书,还需要记录当前书的数量,然后我们可以给数组一个默认的长度,和初始化图书,在初始化时就有几本默认的书,我们需要一个通过下标获取到数组中的书

图书的定义初始化和存放做完后,我们来实现用户

用户分为管理员用户和普通用户,管理员用户和普通用户都是用户,我们就可以定义一个父类User类,然后字类AdminUser和NormalUser来继承父类中共有的方法

父类中定义姓名,然后创建一个User的构造方法,doOperation方法后面会讲到

现在我们要创建我们要实现功能的类,因为每个类都要使用work(BookList bookList)的方法,我们封装一个接口给其他功能类使用

然后逐次创建,继承IOPeration接口,创建完后我们来实现主函数

主函数里要定义一个登陆方法,然后返回用户给系统

 因为登陆函数返回了用户,我们主函数调用登陆方法,第一步知道是进入哪个用户,然后通过choice来决定调用的是哪个方法,doOperation这个方法在上面已经实现,传入choice和书的列表,choice则是通过在普通用户类和管理员用户类中的menu()方法,然后输入,通过choice来接收,传给了doOperation方法,根据choice选择对应的方法

接下来我们挨个实现展示图书,查找图书,新增图书,归还图书,借阅图书,退出图书系统,删除图书的各项功能。

展示图书:

查找图书:

 新增图书:

 借阅图书:

 删除图书:

 退出系统:

归还图书:

 

接下来我给完整版代码:

Book类: 

package book;/*** @author xiaofan* @version 1.0* @date 2023/11/14 21:49*/
public class Book {private String name;private String author;private String type;private int price;private boolean isBorrowed;@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", type='" + type + '\'' +", price=" + price +'\''+((isBorrowed == true) ? "已经借出" : "未被借出")+'}';}public Book(String name, String author, String type, int price) {this.name = name;this.author = author;this.type = type;this.price = price;}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 String getType() {return type;}public void setType(String type) {this.type = type;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public boolean isBorrowed() {return isBorrowed;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}
}
BookList类:
package book;/*** @author xiaofan* @version 1.0* @date 2023/11/14 21:49*/
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("西游记","吴承恩","小说",120);this.books[2] = new Book("红楼梦","曹雪芹","小说",110);this.books[3] = new Book("斗破苍穹","天蚕土豆","小说",20);this.usedSize = 4;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}//获取数组某一个下标的书public Book getBook(int pos){
//        if (pos >= 0){
//            return books[pos];
//        } else {
//            System.out.println("下标错误");
//            //return new Exception();
//            //throw new Exception("下标错误"); //抛出异常
//        }return books[pos];}//通过数组的下标的位置来放书public void setBooks(int pos,Book book){books[pos] = book;}public Book[] getBooks() {return books;}
}
User类:
package user;import book.BookList;
import operation.IOPeration;/*** @author xiaofan* @version 1.0* @date 2023/11/14 22:12*/
public abstract class User {protected  String name;//定义一个存放方法的数组protected IOPeration[] ioPerations;public User(String name){this.name = name;}public abstract int menu();//通过传入choice来判断调用的方法public void doOperation(int choice, BookList bookList)  {ioPerations[choice].work(bookList);}
}
AdminUser类:
package user;import operation.*;import java.util.Scanner;/*** @author xiaofan* @version 1.0* @date 2023/11/14 22:14*/
public class AdminUser extends User{public AdminUser(String name) {super(name);this.ioPerations = new IOPeration[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation()};}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("*************");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的操作");int choice = scanner.nextInt();return choice;}
}

NormalUser类:

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

主函数:

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;/*** @author xiaofan* @version 1.0* @date 2023/11/14 23:18*/
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 user = login();while (true){int choice = user.menu();//System.out.println("choice: " + choice);//根据choice的选择来决定调用的是哪个方法user.doOperation(choice,bookList);}}
}

接口

IOPeration:
package operation;import book.BookList;/*** @author xiaofan* @version 1.0* @date 2023/11/14 22:06*/
public interface IOPeration {void work(BookList bookList);
}

 

功能实现类:

AddOperation:

package operation;import book.Book;
import book.BookList;import java.util.Scanner;/*** @author xiaofan* @version 1.0* @date 2023/11/14 22:02*/
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,type,price);//检查数组当中有没有这本书int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book1 = bookList.getBook(i);if (book1.getName().equals(name)){System.out.println("有相同的书了,不进行存放");return;}}if (currentSize == bookList.getBooks().length){System.out.println("图书已经被放满,不能放了");} else {//将书放在下标的最后一个位置bookList.setBooks(currentSize,book);//将书的数量加1bookList.setUsedSize(currentSize+1);}System.out.println("新增成功");}
}
BorrowOperation:
package operation;import book.Book;
import book.BookList;import java.util.Scanner;/*** @author xiaofan* @version 1.0* @date 2023/11/14 22:04*/
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 curredSize = bookList.getUsedSize();int i = 0;for (; i < curredSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)){if (book.isBorrowed() == false){book.setBorrowed(true);System.out.println("借阅成功");System.out.println(book);return;} else {System.out.println("图书已被借阅,不能再次借出");return;}}}System.out.println("你借阅的图书不存在");}
}
DelOperation:
package operation;import book.Book;
import book.BookList;import java.util.Scanner;/*** @author xiaofan* @version 1.0* @date 2023/11/14 22:02*/
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 pos = -1;int i = 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("没有你要删除的图书!");return;}//开始删除int j = pos;for (; j < currentSize-1 ; j++) {Book book = bookList.getBook(j+1);bookList.setBooks(j,book);}//将j置为空bookList.setBooks(j,null);//将书的数量减1bookList.setUsedSize(currentSize-1);System.out.println("删除成功");}
}
ExitOperation:
package operation;import book.BookList;/*** @author xiaofan* @version 1.0* @date 2023/11/14 22:03*/
public class ExitOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("退出图书系统!");System.exit(0);}
}
FindOperation:
package operation;import book.Book;
import book.BookList;import java.util.Scanner;/*** @author xiaofan* @version 1.0* @date 2023/11/14 22:02*/
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 currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)){System.out.println("找到了这本书,信息如下");System.out.println(book);return;}}System.out.println("没有找到这本书");}
}
ReturnOperation:
package operation;import book.Book;
import book.BookList;import java.util.Scanner;/*** @author xiaofan* @version 1.0* @date 2023/11/14 22:04*/
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 curredSize = bookList.getUsedSize();int i = 0;for (; i < curredSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)){if (book.isBorrowed() == true){book.setBorrowed(false);System.out.println("归还成功");System.out.println(book);return;} else {System.out.println("该图书没有被借出,无需归还");return;}}}System.out.println("你归还的图书不存在");}
}
ShowOperation:
package operation;import book.Book;
import book.BookList;/*** @author xiaofan* @version 1.0* @date 2023/11/14 22:03*/
public class ShowOperation implements IOPeration{@Overridepublic void work(BookList bookList) {//System.out.println("展示图书!");int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);System.out.println(book);}}
}

仓库地址:Java学习仓库,从入门到精通: Java入门学习 - Gitee.com

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

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

相关文章

【开源】基于JAVA的学生日常行为评分管理系统

项目编号&#xff1a; S 010 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S010&#xff0c;文末获取源码。} 项目编号&#xff1a;S010&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2.1 登录注册模块2.2…

Threejs_07 环境、透明度、纹理、ao、光照等贴图的渲染

老陈打码 继续学习老陈threejs 支持&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 下面用到的所有图片、资源、hdr文件都是老陈打码的原资源 链接&#xff1a;https://pan.baidu.com/s/1WWWHgekCIH7OnjI7S_3ZtQ 提取码&#xff1a;6666 Thre…

最新外链系统强势来袭

1、支持微信短链&#xff08;h5跳转二维码、小程序&#xff09; 2、支持在线短链生成&#xff08;长链接转短链&#xff09; 3、支持活码生成 4、支持抖音卡片&#xff08;抖音跳转微信二维码、小程序&#xff09; 5、支持抖音二维码扫码跳转微信&#xff08;二维码、h5、小程序…

关系数据库理论【数据库系统概论】

1.问题的提出 1.1关系模式的表示 关系模式由五部分组成&#xff0c;是一个五元组:R&#xff08;U&#xff0c;D&#xff0c;DOM&#xff0c;F&#xff09; 元组概念R关系名R是符号化的元组语义。UU为一组属性。比如学号&#xff0c;姓名。DD为属性组U中的属性所来自的域。比…

国学短剧《我是小影星》栏目火热开拍

近日&#xff0c;国学短剧《我是小影星》栏目花絮拍摄&#xff0c;在上海市徐汇区漕溪路595号A座B1层开拍。该节目招募全国各地的有才华&#xff0c;有表现力怀揣梦想的小朋友来参与节目拍摄。节目旨在以中华传统文化为切入点&#xff0c;通过戏剧、歌舞、音乐等多种艺术形式的…

opencv将32位深图片合成视频跳帧解决办法

在合成视频时候&#xff0c;大多数的图片都是24位深度的&#xff08;即RGB三通道&#xff0c;一个通道8位&#xff09;&#xff0c;但是也存在少量的32位深的图片&#xff08;RGBA&#xff0c;三个颜色通道加上A这个透明度通道&#xff09;&#xff0c;32位和24位的格式是不一样…

html页面直接使用elementui Plus时间线 + vue3

直接上效果图 案例源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"../js/vue3.3.8/vue.global.js"></script><link rel"styles…

chatGPT PLUS 绑卡提示信用卡被拒的解决办法

一、 ChatGPT Plus介绍 作为人工智能领域的一项重要革新&#xff0c;ChatGPT Plus的上线引起了众多用户的关注&#xff0c;其背后的OpenAI表现出傲娇的态度&#xff0c;被誉为下一个GTP 4.0。总的来说&#xff0c;ChatGPT Plus的火爆主要有两个原因。首先&#xff0c;其在人工…

PHP/Laravel通过经纬度计算距离获取附近商家

实际开发中,常常需要获取用户附近的商家,思路是 获取用户位置(经纬度信息)在数据库中查询在距离范围内的商家 注: 本文章内计算距离所使用地球半径统一为 6378.138 km public function mpa_list($latitude,$longitude,$distance){// $latitude 34.306465;// $longitude 10…

2019年计网408

第33题 OSI 参考模型的第 5 层&#xff08;自下而上&#xff09;完成的主要功能是()A. 差错控制B. 路由选择C. 会话管理D. 数据表示转换 本题考察开放系统互联参考模型的第五层完成的主要功能。开放系统互联参考模型是一个七层的体系结构。自下而上&#xff0c;依次是物理层、…

centos7 利用nc命令探测某个tcp端口是否在监听

脚本 # 安装nc yum install -y ncnc -vz 192.168.3.128 60001 if [ $? -eq 0 ]; thenecho "tcp succeed" elseecho "tcp failed" fi nc -vz 192.168.3.128 60001 探测192.168.3.128服务器上60001 tcp端口, -vz说明是探测TCP的 端口开启的情况 执行…

【工具与中间件】IDEA工具的使用:热部署、快捷键与版本控制

文章目录 0. 前言1. IDEA 配置热部署2. IDEA 常用快捷键3. IDEA 绑定GIT4. 小结 IDEA工具配置热部署&#xff0c;让我们的开发更有效率 0. 前言 以下是水文字&#xff0c;心急的读者可以直接阅读下面的章节。 有时&#xff0c;新&#xff0c;先进的东西确实可以给这个时代的…

隧道ip网络广播系统

隧道ip网络广播系统 隧道ip网络广播系统的优势有那些&#xff1f; 节省人力及维护成本&#xff1a;隧道ip网络广播系统可以自动播放节目&#xff0c;无需人工操作&#xff0c;节省了人力成本。定时广播&#xff0c;分区广播&#xff0c;全区广播&#xff0c;方便管理和简易化…

「Verilog学习笔记」实现3-8译码器①

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 ① 本题要求根据38译码器的功能表实现该电路&#xff0c;同时要求采用基础逻辑门实现&#xff0c;那么就需要将功能表转换为逻辑表达式。 timescale 1ns/1nsmodule d…

企业降低成本方法有哪些?

企业的经营管理离开不两件事&#xff1a;提升营业额&#xff0c;降低成本。企业的发展壮大&#xff0c;离不开销售&#xff0c;按理说&#xff0c;营业额越高&#xff0c;企业的发展就越大&#xff1b;事实上&#xff0c;除了销售好&#xff0c;营业额高&#xff0c;还需重视一…

阿里云4核8G服务器优惠价格表,最低价格501.90元6个月、983.80元1年

阿里云4核8G服务器优惠价格表&#xff0c;云服务器ECS计算型c7实例4核8G配置3M带宽40GB ESSD云盘&#xff08;系统盘&#xff09;叠加使用优惠券后价格501.90元6个月、983.80元1年&#xff0c;现在购买经济型e、通用算力型u1、计算型c7和计算型c8a与c8i实例4核8G配置均有优惠&a…

5-Nacos环境搭建

本文介绍nacos集群环境的搭建。 1、基础环境 机器&#xff1a;mac&#xff0c;intel版本jdk&#xff1a;1.8数据库&#xff1a;mysql 8.029nacos&#xff1a;2.03 2、下载 nacos点击这里下载。 3、开始配置 这里搭建在自己机器上搭建两台nacos集群。下载完成后&#xff0…

MR混合现实教学系统在汽车检修与维护课堂教学中的应用

传统的汽车检修与维护课堂教学主要依赖教师口头讲解和黑板演示&#xff0c;这种方式存在一定的局限性。首先&#xff0c;对于一些复杂的机械结构和操作过程&#xff0c;教师难以生动形象地展示给学生。其次&#xff0c;学生无法直接观察到实际操作中的细节和注意事项&#xff0…

从字典到 CookieJar 的转换技巧

在使用requests库进行HTTP请求时&#xff0c;经常需要传递cookies参数来实现一些特定的功能&#xff0c;例如保持用户会话状态或者进行身份验证。 在HTTP请求中&#xff0c;Cookie是一种用来在客户端和服务器之间传递状态信息的方式&#xff0c;通常用于记录用户的身份验证信息…

透视maven打包编译正常,intellj idea编译失败问题的本质

前言 maven多模块类型的项目&#xff0c;在Java的中大型应用中非常常见&#xff0c; 在 module 很多的情况&#xff0c;经常会出现各种各样的编辑依赖错误问题&#xff0c;今天记录一种比较常见的 case &#xff1a; A 子模块依赖 B 子模块&#xff0c;在 Terminal 上终端上 …