JAVA实现图书管理系统(思路,和完整代码)

因为文件过多每个文件之间的关系如下(每个文件中都只有一个类):

因为JAVA属于面向对象编程的语言,所以我们想要实现图书管理系统就得分以下几步:

  • 找出其中的所有的对象
  • 实现所有的对象
  • 完成对象之间的交互

在图书管理系统中我们可以想到这几个对象用户(用户还可以分为普通用户管理员),还得有存放书的书架

找出对象之后我们将它们分别放在两个包中(一个放书和书架,另一个放普通用户和管理员)。

我们可以在书架类中创建一个书的数组,这样就相当于把书放在了书架中。

package book;public class BookList {public Book[] books;//书架public int numBooks;//书架实际存放的书的本书
}

此时你还可以将书类中的属性都用private修饰因为后面我们的所有操作都是针对书架(如果用private修饰就需要对每个属性都实现get 和 set 方法)。

书类包含以下属性:

String name;

String author;

int money;

String type;

boolean isBorrow;

以下方法:

public Book(){};
public Book(String name, String author, int money, String kind) {}
public String getName() {}public void setName(String name) {}public String getAuthor() {}public void setAuthor(String author) {}public int getMoney() {}public void setMoney(int money) {}public String getType() {}public void setType(String kind) {}public boolean getBorrow() {}public void setBorrow(boolean borrow) {}@Override
public String toString() {return  "name='" + name + '\'' +", author='" + author + '\'' +", money=" + money +", kind='" + type + '\'' +", 状态:"+(isBorrow == false ? "未被借出" : "已被借出");
}

此处重写toString是为了可以直接使用System.out.println();输出book

因为普通用户和管理员都属于用户所以可与使用继承让 普通用户管理员继承用户这个父类。

管理员权限:                                                        普通用户权限:

                                                 

 

这样我们就可以利用多态的思想,创建一个用户类,由于引用的对象不同调用相同的方法结果也不相同。

可是现在又有一个新问题就是管理员和普通用户所打印出来的菜单是不同的,所以就不能在父类中实现,所以父类就不能是一个普通的父类,它必须是一个抽象类

因为用户的操作太多而且有重复方法所以这里推荐新建一个包将其全部放入新的包中,并将所有的操作都单独封装成一个类。

操作属于用户所以写成如下格式:

//用户类
abstract public class User {protected String name;protected Work[] work;//存放用户所有的操作public int counst; //work中的元素个数}
//管理员
public class AdvancedUser extends User{public AdvancedUser(String name){this.name = name;this.work = new Work[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation()};this.counst = 5;}}
//普通用户
public class NormalUser extends User {public NormalUser(String name){this.name = name;this.work = new Work[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new RetOperation(),};this.counst = 4;}}

 这样就可以用数组来调用方法

public void operation(int choice, BookList bookList){work[choice].work(bookList);}

完整代码:

package main;import book.BookList;
import user.AdvancedUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User login(){Scanner in = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = in.nextLine();System.out.println("请选择你的身份:1.管理员    0.普通用户");if (in.nextInt() == 1){return new AdvancedUser(name);}else {return new NormalUser(name);}}public static void main(String[] args) {BookList bookList = new BookList();User user = login();while(true){int choice;do{choice = user.menu();}while(choice < 0 || choice >= user.counst);user.operation(choice, bookList);}}
}
package book;public class Book {private String name;private String author;private int money;private String type;private boolean isBorrow;public Book(){};public Book(String name, String author, int money, String kind) {this.name = name;this.author = author;this.money = money;this.type = kind;}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 getMoney() {return money;}public void setMoney(int money) {this.money = money;}public String getType() {return type;}public void setType(String kind) {this.type = kind;}public boolean getBorrow() {return isBorrow;}public void setBorrow(boolean borrow) {isBorrow = borrow;}@Overridepublic String toString() {return  "name='" + name + '\'' +", author='" + author + '\'' +", money=" + money +", kind='" + type + '\'' +", 状态:"+(isBorrow == false ? "未被借出" : "已被借出");}
}
package book;public class BookList {public Book[] books;//书架public int numBooks;//书架实际存放的书的本书public BookList() {this.books = new Book[10];//默认书架存放两本书this.books[0] = new Book("西游记","吴承恩",39,"小说");this.books[1] = new Book("红楼梦","曹雪芹",39,"小说");this.numBooks = 2;}}

 

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class AddOperation extends Work{@Overridepublic void work(BookList bookList) {Scanner in = new Scanner(System.in);bookList.books[bookList.numBooks] = new Book();System.out.print("请输入书名:");bookList.books[bookList.numBooks].setName(in.nextLine());System.out.print("请输入作者:");bookList.books[bookList.numBooks].setAuthor(in.nextLine());System.out.print("请输入所属书类:");bookList.books[bookList.numBooks].setType(in.nextLine());System.out.print("请输入书价:");bookList.books[bookList.numBooks].setMoney(in.nextInt());bookList.numBooks++;}
}

 

package operation;import book.BookList;import java.util.Scanner;public class BorrowOperation extends Work{@Overridepublic void work(BookList bookList) {int numBooks = bookList.numBooks;Scanner in = new Scanner(System.in);System.out.print("请输入书名:");String name = in.nextLine();for (int i = 0; i < numBooks; i++) {if (name.equals(bookList.books[i].getName())) {if (bookList.books[i].getBorrow() == false){System.out.println("借阅成功");bookList.books[i].setBorrow(true);return;}else{System.out.println("该书已被借出");return;}}}System.out.println("未收录该书");}
}
package operation;import book.BookList;import java.util.Scanner;public class DelOperation extends Work{@Overridepublic void work(BookList bookList) {int numBooks = bookList.numBooks;Scanner in = new Scanner(System.in);System.out.print("请输入书名:");String name = in.nextLine();for (int i = 0; i < numBooks; i++) {if (name.equals(bookList.books[i].getName())){int j = 0;for (j = i; j < numBooks-1; j++) {bookList.books[j] = bookList.books[j + 1];}bookList.books[j] = null;bookList.numBooks--;return;}}}
}
package operation;import book.BookList;public class ExitOperation extends Work{@Overridepublic void work(BookList bookList) {System.exit(0);}
}

 

package operation;import book.BookList;import java.util.Scanner;public class FindOperation extends Work{@Overridepublic void work(BookList bookList) {int numBooks = bookList.numBooks;Scanner in = new Scanner(System.in);System.out.print("请输入书名:");String name = in.nextLine();for (int i = 0; i < numBooks; i++) {if (name.equals(bookList.books[i].getName())) {System.out.println(bookList.books[i]);return;}}System.out.println("未收录该书");}
}
package operation;import book.BookList;import java.util.Scanner;public class RetOperation extends Work{@Overridepublic void work(BookList bookList) {int numBooks = bookList.numBooks;Scanner in = new Scanner(System.in);System.out.print("请输入书名:");String name = in.nextLine();for (int i = 0; i < numBooks; i++) {if (name.equals(bookList.books[i].getName())) {if (bookList.books[i].getBorrow()){System.out.println("归还成功");bookList.books[i].setBorrow(false);return;}else{System.out.println("该书未被借出");return;}}}System.out.println("未收录该书");}
}
package operation;import book.BookList;public class ShowOperation extends Work{@Overridepublic void work(BookList bookList) {for (int i = 0; i < bookList.numBooks; i++) {System.out.println(bookList.books[i]);}}
}
package operation;import book.BookList;abstract public class Work {abstract public void work(BookList bookList);
}
package user;import operation.*;import java.util.Scanner;public class AdvancedUser extends User{public AdvancedUser(String name){this.name = name;this.work = new Work[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation()};this.counst = 5;}@Overridepublic int menu() {System.out.println("###########################");System.out.println(" Hello " + "AdvancedUser:" + this.name);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 in = new Scanner(System.in);return in.nextInt();}
}

 

package user;import operation.*;import java.util.Scanner;public class NormalUser extends User {public NormalUser(String name){this.name = name;this.work = new Work[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new RetOperation(),};this.counst = 4;}@Overridepublic int menu() {System.out.println("###########################");System.out.println(" Hello " + "NormalUser:" + this.name);System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("###########################");System.out.println("请选择你的操作:");Scanner in = new Scanner(System.in);return in.nextInt();}
}
package user;import book.BookList;
import operation.Work;abstract public class User {protected String name;protected Work[] work;//存放用户所有的操作public int counst; //work中的元素个数abstract public int menu();public void operation(int choice, BookList bookList){work[choice].work(bookList);}
}

运行结果:

 

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

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

相关文章

【产品经理】高阶产品如何提出有效解决方案?(1方法论+2案例+1清单)

每一件事情总有它的解决方案&#xff0c;在工作中亦是如此&#xff0c;而有效的解决方案&#xff0c;一定是具有系统性的。 有效的解决方案&#xff0c;一定是系统性的解决方案。 什么是系统性解决方案&#xff1f; 从系统结构&#xff08;或连接关系&#xff09;入手&#x…

【C语言】初识C语言+进阶篇导读

✨个人主页&#xff1a; Anmia.&#x1f389;所属专栏&#xff1a; C Language &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 本篇目的是面向编程新手&#xff0c;没接触过编程的人。以及C进阶的导读。 内容是C语言重要知识点的简单解释&#xff0c;不做详解。给…

73. 矩阵置零

题目链接&#xff1a;力扣 解题思路&#xff1a; 方法一&#xff1a;比较容易想到的方向&#xff0c;使用两个数组row和col保存有0的行或者列&#xff0c;然后将有0的那一行或那一列的所有元素都设置为0 AC代码 class Solution {public void setZeroes(int[][] matrix) {in…

小尺寸、高效率的88W8997-A0-CBQ2E005-T无线互连芯片,NV24C64DWVLT3G 64Kb EEPROM存储器

88W8997-A0-CBQ2E005-T 是业界尺寸最小、能效最高的MU-MIMO无线互连组合芯片&#xff0c;面向企业级和消费级市场。88W8997是业界首款全面支持Bluetooth 4.2以及未来Bluetooth 5.0全套功能的28nm 2 x 2 802.11ac Wave-2组合芯片。该器件实现了高达867Mbps的峰值数据传送速率&am…

9-数据结构-栈(C语言版)

数据结构-栈&#xff08;C语言版&#xff09; 目录 数据结构-栈&#xff08;C语言版&#xff09; 1.栈的基础知识 1.入栈&#xff0c;出栈的排列组合 情景二&#xff1a;Catalan函数&#xff08;计算不同出栈的总数&#xff09; 2.栈的基本操作 1.顺序存储 (1)顺序栈-定义…

自学python,学了又忘,感觉学不好是为啥呢

一、前言 最近发现&#xff0c;身边很多的小伙伴学Python都会遇到一个问题&#xff0c;就是资料也看了很多&#xff0c;也花了很多时间去学习但还是很迷茫&#xff0c;时间长了又发现之前学的知识点很多都忘了&#xff0c;都萌生出了想半路放弃的想法。 其实造成这样情况根本的…

使用toad库进行机器学习评分卡全流程

1 加载数据 导入模块 import pandas as pd from sklearn.metrics import roc_auc_score,roc_curve,auc from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression import numpy as np import math import xgboost as xgb …

搭建 elasticsearch8.8.2 伪集群 windows

下载windows 版本 elasticsearch8.8.2 以下链接为es 历史版本下载地址&#xff1a; Past Releases of Elastic Stack Software | Elastic windows 单节点建立方案&#xff1a; 下载安装包 elasticsearch-8.8.2-windows-x86_64.zip https://artifacts.elastic.co/download…

element-plus:el-date-picker日期只选择年月不要日

<el-date-picker v-model"value" type"month" format"YYYY-MM" value-format"YYYY-MM" />使用format属性将时间显示格式修改为YYYY–MM 年月格式 使用value-format将绑定值的格式修改为YYYY–MM年月格式

一台电脑给另外一台电脑共享网络

这里写自定义目录标题 有网的电脑上操作一根网线连接两台电脑没网的电脑上 有网的电脑上操作 右键->属性->共享 如同选择以太网&#xff0c;勾选。确认。 一根网线连接两台电脑 没网的电脑上 没网的电脑为mips&麒麟V10 新增个网络配置ww&#xff0c;设置如下。 …

携手区块链技术,踏上可信“双碳”之路 | 研讨会回顾

自中央明确提出碳达峰碳中和的“双碳”目标以来&#xff0c;区块链技术凭借能为碳排放、碳足迹打上可信标签的天赋异禀&#xff0c;引起了政策部门、学术界及产业实践代表们的高度重视。 7月11日&#xff0c;在第33个全国节能宣传周之际、全国低碳日前夕&#xff0c;微众区块链…

R语言安装包Seurat

环境Ubuntu22&#xff0c;R4.1 also installing the dependencies ‘curl’, ‘openssl’, ‘httr’, ‘plotly’ R包安装的时候报了这个错误ERROR: dependencies httr, plotly are not available for package Seurat 解决方法&#xff0c;退出R&#xff0c;在terminal中键入…

C# OpenCvSharp 读取rtsp流

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using Syste…

k8s --pod详解

目录 一、Pod基础概念 1、pod简介 2、在Kubrenetes集群中Pod有如下两种使用方式 3、pause容器使得Pod中的所有容器可以共享两种资源&#xff1a;网络和存储。 &#xff08;1&#xff09;网络 &#xff08;2&#xff09;存储 4、kubernetes中的pause容器主要为每个容器提供…

24届近5年南京理工大学自动化考研院校分析

今天学长给大家带来的是南京理工大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、南京理工大学 ​ 学校简介 南京理工大学是隶属于工业和信息化部的全国重点大学&#xff0c;学校由创建于1953年的新中国军工科技最高学府——中国人民解放军军事工程学院&#xf…

最小二乘问题和非线性优化

最小二乘问题和非线性优化 0.引言1.最小二乘问题2.迭代下降法3.最速下降法4.牛顿法5.阻尼法6.高斯牛顿(GN)法7.莱文贝格马夸特(LM)法8.鲁棒核函数 0.引言 转载自此处&#xff0c;修正了一点小错误。 1.最小二乘问题 在求解 SLAM 中的最优状态估计问题时&#xff0c;我们一般…

linux gcc __attribute__

__attribute__ 1. 函数属性1.1 __attribute__((noreturn))1.2 __attribute__((format))1.3 __attribute__((const)) 2. 变量属性2.1. __attribute__((aligned))2.2. __attribute__((packed)) 3. 类型属性 __attribute__ 是 GCC 编译器提供的一种特殊语法&#xff0c;它可以用于…

论文阅读---《Unsupervised Transformer-Based Anomaly Detection in ECG Signals》

题目&#xff1a;基于Transformer的无监督心电图&#xff08;ECG&#xff09;信号异常检测 摘要 异常检测是数据处理中的一个基本问题&#xff0c;它涉及到医疗感知数据中的不同问题。技术的进步使得收集大规模和高度变异的时间序列数据变得更加容易&#xff0c;然而&#xff…

CVPR 2023 | 无监督深度概率方法在部分点云配准中的应用

注1:本文系“计算机视觉/三维重建论文速递”系列之一,致力于简洁清晰完整地介绍、解读计算机视觉,特别是三维重建领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。本次介绍的论文是:2023年,CVPR,…

vcode开发go

配置环境变量 go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct 创建文件夹 mkdir hello cd hello go mod help go mod help 初始化一个项目 go mod init hello 获取第三方包 go get github.com/shopspring/decimal 将依赖包下载到本地 go mod …