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

news/2024/10/27 21:19:08/

 

目录

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.ppmy.cn/news/1225903.html

相关文章

多模态大一统:开启全模态LLM和通用AI时代的大门

多模态大一统:开启全模态LLM和通用AI时代的大门 1. 目前多模态实现的方法1.1 单独训练各领域模型1.2 多任务学习1.3 集成多模态模型1.4 通用多模态模型2. 多模态统一难点2.1 数据集对齐和融合2.2 大规模计算资源需求2.3 各领域特性的兼容性2.4 可解释性和泛化能力3. 全模态的好…

基于卷积神经网络的猫种类的识别

1.介绍 图像分类是计算机视觉中的一个关键任务&#xff0c;而猫种类识别作为一个有趣且实用的应用场景&#xff0c;通过卷积神经网络&#xff08;CNN&#xff09;的模型能够识别猫的不同品种。在这篇博客中&#xff0c;将详细介绍如何利用深度学习技术构建模型&#xff0c;从而…

Pytorch torch.dot、torch.mv、torch.mm、torch.norm的用法详解

torch.dot的用法&#xff1a; 使用numpy求点积&#xff0c;对于二维的且一个二维的维数为1 torch.mv的用法&#xff1a; torch.mm的用法 torch.norm 名词解释&#xff1a;L2范数也就是向量的模&#xff0c;L1范数就是各个元素的绝对值之和例如&#xff1a;

springMVC学习笔记-请求映射,参数绑定,响应,restful,响应状态码,springMVC拦截器

目录 概述 springMVC做了什么 springMVC与struts2区别 springMVC整个流程是一个单向闭环 springMVC具体的处理流程 springMVC的组成部分 请求映射 RequestMapping 用法 属性 1.value 2.method GET方式和POST方式 概述 HTTP给GET和POST做了哪些规定 GET方式&…

Jetson TX2 Ubuntu18.04安装ROS

1. 配置软件源 2. 使用aptitude解决依赖问题 3.一些报错 主要参考一下两个教程&#xff1a; https://zhuanlan.zhihu.com/p/372481181 https://blog.csdn.net/weixin_45266691/article/details/117427775 2. 安装完aptitude后&#xff0c;使用一下指令进行安装 sudo apti…

App测试入门

App测试基础知识 App测试&#xff0c;是指对移动应用软件&#xff08;如手机app、平板app等&#xff09;进行全面和系统的测试&#xff0c;以确保其功能、性能、安全性、稳定性、兼容性等方面能满足用户的使用需求和期望。 App常见运行系统 IOS系统&#xff1a; IOS系统是苹果公…

Flutter 应用启动从闪屏页短暂黑屏再到第一个页面

由于应用初始状态启动会有白屏现象&#xff0c;便使用 flutter_native_splash 2.3.5 插件生成了启动相关的配置&#xff0c;并且按照示例使用了 import package:flutter_native_splash/flutter_native_splash.dart;void main() {WidgetsBinding widgetsBinding WidgetsFlutte…

高校教师资格证备考

高等教育制度 关于人的全面发展和个体发展的关系&#xff0c;说法正确的是&#xff08;ABC&#xff09;。 A.个体发展是在全面发展基础上的选择性发展 B.全面发展是个体发展的前提和基础 C.个体发展又是全面发展的动力 D.个体发展是全面发展的前提和基础