【JavaSE】基础笔记 - 图书管理系统(保姆教程,含源码)

 

目录

1、图书管理系统介绍

2、大致框架

3、代码实现步骤

3.1、Book图书类

3.2、BookList书架类

3.3、User用户类、AdminUser类、NormalUser类

3.4、IOperation操作接口

3.5、继承IOperation接口的操作类

3.6、完善User类

3.7、Mian类 

4、完整代码

 

Java的三大特性是:封装、继承和多态。最近博主刚刚学完Java的三大特性,因此想写一个小项目巩固一下知识点。

这次的简单图书管理系统主要是为了练习继承,接口和多态的使用,那么就用这篇博客来讲解一下这个小项目,目的只是为了练习。

1、图书管理系统介绍

首先运行系统,需要先输入用户名称,接着选择身份(管理员/普通用户),如果是管理员,则打印管理员菜单,如果是普通用户则打印普通用户菜单,并等待接收执行指令编号,通过输入不同指令编号调用不同方法。

2、大致框架

图书管理系统,图书是一定需要的,要创建一个图书类,包括图书的书名、作者名、书的单价、书的类型、是否借出图书。用户也是一定需要的,所以要创建一个用户类。现在为了增加难度,我想要设置两个用户类:一个是管理员类,可以让管理员对图书进行管理,管理员对图书进行增删查改;一个就是普通的用户类,借阅归还图书。同时,两个类对应的菜单是不相同的。其他的内容就在写代码的时候在进行补充。

 

3、代码实现步骤

3.1、Book图书类

简单的对Book进行描述,并生成对应的get和set方法。然后重写继承于Object类的toSring()方法,方便后续打印图书内容。

package book;public class Book {private String name;  //书名private String author;private int price;private String type;private boolean isBorrowed; //是否被借出   成员变量默认值falsepublic Book() {}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 +'}';}
}

3.2、BookList书架类

书架类中包含了一个成员变量books,一个用于记录当前书架放了几本书的usedSize。

然后对BookList的空参构造函数进行编写:给books分配空间,这里设置固定大小10。接着初始化三个图书信息,用于表示当前书架中存在的图书。

写上对应的get和set方法,其中getBook方法是通过传入的下标得到指定的book,setBook是通过传入的下标和book,在对应下标处存入book。

package book;public class BookList {private Book[] books;private int usedSize;//记录当前书架放了几本书public BookList() {this.books = new Book[10];this.books[0] = new Book("三国演义","罗贯中",10,"小说");this.books[1] = new Book("西游记","吴承恩",9,"小说");this.books[2] = new Book("红楼梦","曹雪芹",19,"小说");this.usedSize = 3;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public Book getBook(int pos) {return books[pos];}public void setBook(Book book, int pos) {books[pos] = book;}
}

3.3、User用户类、AdminUser类、NormalUser类

User  

为了实现向上转型和多态,这里使用首先创建一个Uesr类,用于被AdminUser类和NormalUser类继承。

在User类中定义成员变量name,表示用户名。因为不同的身份打印的菜单是不一致的,因此User类中的menu()菜单方法写成抽象方法,在后面子类继承时再进行实现。

package user;import book.BookList;
import operation.IOperation;public abstract class User {protected String name;public User(String name) {this.name = name;}public abstract int menu();   //抽象方法}

  NormalUser 

NormalUser类继承User类并重写menu()方法。

package user;import operation.*;import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);}@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("===========================");System.out.println("请输入你的操作:");Scanner sc = new Scanner(System.in);int choice = sc.nextInt();return choice;}
}

 AdminUser 

AdminUser类继承User类并重写menu()方法。

package user;import operation.*;import java.util.Scanner;public class AdminUser extends User{public AdminUser(String name) {super(name);}@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("===========================");System.out.println("请输入你的操作:");Scanner sc = new Scanner(System.in);int choice = sc.nextInt();return choice;}
}

3.4、IOperation操作接口

这里定义接口的目的是为了能够使后续创建的操作类能够被同一个对象接收,而只要这些操作类都实现了同一接口,就能够被统一接收,实现向上转型

package operation;import book.BookList;public interface IOperation {void work(BookList bookList);
}

3.5、继承IOperation接口的操作类

根据管理员和普通用户的菜单,操作类可以分为以下的七个

  1. 新增图书AddOperation
  2. 借阅图书BorrowOperation
  3. 删除图书DelOperation
  4. 查找图书FindOperation
  5. 显示图书ShowOperation
  6. 归还图书ReturnOperation
  7. 退出系统ExitOperation

 AddOperation

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner sc = new Scanner(System.in);System.out.println("新增图书!");System.out.println("请输入你要新增图书的书名:");String name = sc.nextLine();System.out.println("请输入你要新增图书的作者:");String author = sc.nextLine();System.out.println("请输入你要新增图书的价格:");int price = sc.nextInt();sc.nextLine();  //接收回车,sc.nextInt()不会读掉回车,所以需要先接收回车再进行。或者调换一下位置System.out.println("请输入你要新增图书的类型:");  //nextInt和nextLine会存在冲突String type = sc.nextLine();Book book = new Book(name,author,price,type);int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book tmp = bookList.getBook(i);if(tmp.getName().equals(name)) {System.out.println("存在这本书,不能重复添加!");return;}}bookList.setBook(book,currentSize);bookList.setUsedSize(currentSize+1);}
}

BorrowOperation

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 sc = new Scanner(System.in);System.out.println("请写出你要借阅图书的书名:");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)) {book.setBorrowed(true);System.out.println("借阅成功!");return;}}System.out.println("没有书名为'" + name + "'的书籍");}
}

DelOperation

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class DelOperation implements IOperation {@Overridepublic void work(BookList bookList) {Scanner sc = new Scanner(System.in);System.out.println("删除图书!");System.out.println("请写出你要删除图书的书名:");String name = sc.nextLine();int currentSize = bookList.getUsedSize();int index = -1;int i = 0;for (; i < currentSize; i++) {if (bookList.getBook(i).getName().equals(name)) {index = i;break;}}if (i > currentSize) {System.out.println("不存在书名为'" + name + "'的书籍,无法删除!");return;}//使用移动覆盖作为删除for (int j = index; j < currentSize - 1; j++) {Book book = bookList.getBook(j + 1);bookList.setBook(book, j);}//方便系统自动回收bookList.setBook(null, currentSize - 1);bookList.setUsedSize(currentSize - 1);System.out.println("成功删除书名为'" + name + "'的书籍!");}
}

FindOperation

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("查找图书!");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("存在这本书,信息如下:");System.out.println(book);return;}}System.out.println("不存在书名为‘"+name+"’的这本书!");}
}

ShowOperation

package operation;import book.Book;
import book.BookList;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);}}
}

ReturnOperation

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 sc = new Scanner(System.in);System.out.println("请写出你要归还图书的书名:");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)) {book.setBorrowed(false);System.out.println("归还成功!");return;}}System.out.println("没有书名为'" + name + "'的书籍");}
}

ExitOperation

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

3.6、完善User类

在User类中定义一个成员数组iOperations用于存储各个操作类,但是因为User被两个身份的用户类继承,而不同用户又有不同的操作方法,因此此时对成员数组iOperations声明不进行初始化。对iOperations的初始化留给继承于User的两个用户类。

User

package user;import book.BookList;
import operation.IOperation;public abstract class User {protected String name;protected IOperation[] iOperations;   //初始化留给继承User的子类public User(String name) {this.name = name;}public abstract int menu();public void doOperation(int choice, BookList bookList) {this.iOperations[choice].work(bookList);   //根据菜单的操作编号顺序确定iOperations数组中放置操作的顺序,//从而可以直接使用操作编号作为数组的下标来访问对应的work方法}
}

接着参照menu()菜单去NormalUser类和AdminUser类中对iOperation数组进行各自的初始化。 

NormalUser

AdminUser

3.7、Mian类 

所有需要的类都以及准备完毕,现在开始完成测试类Main。

  1. 其中login()方法会返回两个用户类中的一个给到user接收,此时发生了向上转型
  2. 而根据login()方法得到的不同用户调用user.menu()会产生不同的菜单结果,此时说明发生了多态
  3. 给user.doOperation()传入操作编号choice和书架对象bookList,达到调用与编号对应的操作。
import book.BookList;
import operation.IOperation;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;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 user = login(); //向上转型while (true) {int choice = user.menu();   //多态//根据选择执行对应的操作user.doOperation(choice,bookList);}}
}

4、完整代码

由于篇幅有限,本篇博客的完整代码已上传到gitee,需要的小伙伴可以前往链接直接领取:

BookSystem/src · Nadez/study_Java - 码云 - 开源中国 (gitee.com)icon-default.png?t=N7T8https://gitee.com/nadezz/study_Java/tree/master/BookSystem/src

 

博主推荐:

【JavaSE】基础笔记 - 类和对象(上)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/134232584?spm=1001.2014.3001.5502 

【JavaSE】基础笔记 - 类和对象(下)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/134248822?spm=1001.2014.3001.5502 

【LeetCode力扣】42. 接雨水-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/134104222?spm=1001.2014.3001.5502 

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

 

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

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

相关文章

python2环境问题

pip源推荐使用 -i http://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn 安装pip工具&#xff0c;可以环境上已有的pip赋值到对应目录下 更新pip工具&#xff0c;python2的pip需要20.3版本以前的。解决pip命令从其它环境复制过来导致的一系列…

《研发效能 100 问》首发,多位专家解读「研效提升」的破局之道?

为了可以帮助更多研发管理者和研发效能负责人&#xff0c;了解构建研发效能体系应从何做起&#xff0c;以及在构建过程中需要解决哪些疑难问题&#xff0c;有哪些最佳实践可以借鉴。2023 年 7 月&#xff0c;思码逸发起&#xff0c;由行业知名研发效能专家张乐老师担任出品人&a…

KT142C语音芯片客户反馈电脑端的配置文件,打开都正常,但是拷贝到KT142C内部就乱码

KT142C语音芯片客户反馈电脑端的配置文件&#xff0c;打开都正常&#xff0c;但是拷贝到KT142C内部就乱码 首先解释一下原理&#xff0c;KT142C内置的330Kbyte空间可供用户下载&#xff0c;实际上拿出程序部分的空间 作为声音存储介质的&#xff0c;也就是说&#xff0c;代码空…

[每周一更]-(第72期):Docker容器瘦身方式

Docker清理缓存操作 在构建测试的过程中&#xff0c;由于是自家小服务器&#xff0c;资源紧张&#xff0c;发现磁盘一直爆满&#xff0c;删除一些大镜像还是会占满的情况&#xff0c;就想到是不是也是缓存问题。 经过查询确实是build过程中的缓存启发的占用问题。 因此引出以下…

【自动驾驶解决方案】C++取整与保留小数位

一、C基础 1.1double型保留小数为&#xff0c;并以字符输出 #include <iostream> #include <sstream> #include <iomanip> // 包含std::fixedint main() {//浮点数double number 3.1415926;//转换工具类streamstd::stringstream stream;stream << s…

【微信小程序】2023年11月版本 关于小程序隐私保护指引设置的公告 | 修改微信小程序隐私保护 |小程序无法获取用户昵称 头像 性别 等问题

一、登录小程序后台 《关于小程序隐私保护指引设置的公告》 https://mp.weixin.qq.com/cgi-bin/announce?actiongetannouncement&announce_id11691660367cfUvX&version&langzh_CN&token 上面是官方的文档&#xff0c;但是由于比较陈旧&#xff0c;和现在的页面…

基于单片机的空气质量实时监测系统(论文+源码)

1. 系统设计 通过文献和市场调查&#xff0c;本设计的实现方案框架是以单片机为核心控制处理器搭建外围的功能模块如温度传感器模块、湿度传感器检测模块、二氧化碳传感器检测设备模块、无线通信模块和蜂鸣器声光报警提示模块来实现&#xff0c;辅以显示模块来展示。 该系统通…

数据仓库

一. 各种名词解释 1.1 ODS是什么&#xff1f; ODS层最好理解&#xff0c;基本上就是数据从源表拉过来&#xff0c;进行etl&#xff0c;比如mysql 映射到hive&#xff0c;那么到了hive里面就是ods层。 ODS 全称是 Operational Data Store&#xff0c;操作数据存储.“面向主题的…

Java 异常处理、继承、重写/重载

一、java异常处理&#xff1a; 三种类型的异常&#xff1a;检查性异常、运行时异常、错误。 所有的异常类是从java.lang.Exception类继承的子类。Exception类是Throwable类的子类。除了Exception类外&#xff0c;Throwable还有一个子类Error。 异常类有两个主要的子类&#…

OpenAI宫斗,尘埃落定,微软成最大赢家

周末被OpenAI董事会闹剧刷屏,ChatGPT之父Sam Altman前一天被踢出董事会,免职CEO,后一天重返OpenAI,目前结局未知。 很多同学想要围观,缺少背景知识,这里老章为大家简单介绍前因后果及涉及的人物,时间线,让大家轻松围观。 备好瓜子,开始。 1、主角 先看一张图,看一…

Python学习(打基础版)

以前只是大致的了解&#xff0c;现在比较完整的整理一下笔记&#xff0c;以后工作可能会用到。 学习地址如下所示&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了_哔哩哔哩_bilibili 第一章 环境配置 1 初识Python 人…

Ubuntu Server download

前言 Ubuntu——公共云、数据中心和边缘上最受欢迎的 Linux 发行版。自成立以来&#xff0c;Ubuntu 一直在获得市场份额&#xff0c;截至今天已接近 50%。 Ubuntu Server download VersionUbuntu Server 其它主机型号版本Ubuntu AMD历史版下载百度云Ubuntu Server all Ubuntu…

阿里8年经验之谈 —— 分享一次接口性能摸底测试过程!

接口性能测试是用于验证应用程序中的接口是否可以满足系统的性能要求的一种测试方法。确定应用程序在各种负载条件下的性能指标&#xff0c;例如响应时间、吞吐量、并发性能等&#xff0c;以便提高系统的性能和可靠性。本文主要讲述接口性能测试从前期准备、方案设计到环境搭建…

SQL常见函数整理 —— LAG() 向上偏移

1. 用法 窗口函数&#xff0c;用于访问窗口中当前行之前的行的数据。该函数可以根据需要计算当前行之前的值&#xff0c;使我们能够轻松地比较不同行之间的差异和变化。 2. 基本语法 LAG(column, offset, default_value) OVER (ORDER BY column)column&#xff1a;代表在返回…

【香橙派】实战记录1——简介及烧录 Linux 镜像

文章目录 一、简介1、参数2、结构3、其他配件4、下载资料 二、基于 Windows PC 将 Linux 镜像烧写到 TF 卡的方法1、使用 balenaEtcher 烧录 Linux 镜像的方法2、效果 一、简介 Orange Pi Zero 3 香橙派是一款开源的单板卡片电脑&#xff0c; 新一代的arm64开发板&#xff0c;…

百度搜索万亿规模特征计算系统实践

作者 | Jay 导读 本文主要介绍百度搜索在全网万亿级规模内容做内容理解的工程实践&#xff0c;涉及机器学习工程化、资源调度、存储优化等多个Topic。 全文6648字&#xff0c;预计阅读时间17分钟。 01 业务背景 百度收录了互联网海量内容&#xff0c;要索引这些内容&#xff0…

如果文件已经存在与git本地库中,配置gitignore能否将其从git库中删除

想把项目的前后台代码放到同一个git仓库管理&#xff0c;由于未设置.gitignore&#xff0c;就使用vscode做stage操作&#xff08;相当于git add . 命令 其中【.】点表示全部文件&#xff09;&#xff0c;观察将要入库的文件发现&#xff0c;node_modules、target、.idea、log等…

无服务器开发实例|微服务向无服务器架构演进的探索

在当今的技术环境中&#xff0c;许多组织已经从构建单一的应用程序转变为采用微服务架构。微服务架构是将服务分解成多个较小的应用程序&#xff0c;这些应用程序可以独立开发、设计和运行。这些被拆分的小的应用程序相互协作和通信&#xff0c;为用户提供全面的服务。在设计和…

C#的类型转换

目录 一、简介二、基本类型转换1.整数类型转换1.隐式转换2.显式转换 2.浮点类型转换1.隐式转换2.显式转换 3.字符类型转换1.字符到整数的转换2.整数到字符的转换 4.布尔类型转换1.布尔到整数的转换2.整数到布尔的转换 三、隐式转换和显式转换四、装箱和拆箱五、自定义类型转换六…