【Java】使用JavaSE实现图书管理系统详解

目录

 

1.前言

2.初步框架搭建

3.Book 书架和书架里的书

3.1书本

3.2书架

4.User  用户和管理员

4.1初步想法

4.2用户

4.3管理员

4.4main函数中如何调用不同的成员

5.方法的调用

  5.1接口

5.2增加图书

5.3借阅图书

  5.4删除图书

5.5退出系统

5.6查找图书

5.7归还图书

5.8显示图书

5.9main方法

6.小结


1.前言

  大家好,今天我来带大家使用JavaSE的知识来完成一个简单的图书管理系统。在日常生活中,我们需要各种管理系统来管理我们的一些信息,比如学生管理系统,图书管理系统等。在这些系统中,我们包含了对增删查改等功能。我们将从Java面向对象的特性来庖丁解牛,逐步详细向大家分析。

2.初步框架搭建

  既然要使用面向对象的语言来设计该系统,我们就得把该系统的主要对象先构思出来。首先我们需要一个书架。来存放和使用我们的图书。然后需要用户或者管理员,对这些书进行操作。当然,这些操作的方法我们也需要一个方法区。以便我们对书架上的书进行正确的操作。

 这几个包里面分别存放我们上述所描述的三个对象。接下来我们逐步的在里面加入我们所需要的类,通过面向对象的思想来统筹它们协作完成我们的图书管理系统。

3.Book 书架和书架里的书

  既然我们需要书架,那么书架里也需要我们的书,我们创建两个类,分别是书和书架。

3.1书本

   我们首先需要在书这个类里,创建一些成员变量来描述这些书的信息,如书名,作者,价格,类型,状态(是否被借出)等。这些变量我们可以使用private关键字把它们封装起来,并且提供get和set这种公开接口,以便对它们进行操作。为了后续方便打印,我们重写了object类的toString方法。并在我们这个方法里使用三目运算符来进行书的状态判断。

package Book;public class Book {private String name;// 书名private String author; //作者private double price;//价格private String type;//类型private boolean isBorrowed;//状态 (是否被借出)public Book(String name, String author, double price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}public Book(boolean isBorrowed){this.isBorrowed=isBorrowed;}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 double getPrice() {return price;}public void setPrice(double 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 "书{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", isBorrowed=" + (isBorrowed==true?"已被借阅":"未被借阅" )+'}';}
}

3.2书架

 拥有了书这个类,我们需要一个书架来存放这些书,并且判断书架里存放了几本书。我们初始可以在书架的构造方法(以便后续的操作)里自定义一些书进行存放。

package Book;import java.util.Scanner;public class BookList {Book[] books=new Book[10];private int usesize;//查看有多少本书public BookList(){books[0]=new Book("三国演义","罗贯中",10.5,"小说");books[1]=new Book("西游记","吴承恩",18.8,"小说");books[2]=new Book("水浒传","施耐庵",22.5,"小说");this.usesize=3;}public int getUsesize() {return usesize;}public void setUsesize(int usesize) {this.usesize = usesize;}public Book getBooks(int pos) {return books [pos];}public Book setbooks(int pos,Book book){return  books[pos]=book;}public void setBooks(Book book) {books[this.usesize]=book;}
}

4.User  用户和管理员

4.1初步想法

  为了方便我们进行调用不同的成员(用户或者管理员),我想到了使用一个抽象类来当它们的父类,并且让这两个成员继承它。这样我们就可以构成向上转型,使用多态的思想来调用不同的成员了。

package user;import Book.BookList;
import operation.IoPeration;public abstract class User  {public User(String name) {this.name = name;}String name;protected IoPeration[] ioPerations;public abstract int menu();public void doWord(int choice, BookList bookList){ioPerations[choice].work(bookList);}}

4.2用户

  我们的用户继承了User以后,也要考虑到后续方法的调用,所以我使用一个接口数组用来存放这些方法,这样我就可以使用数组的下标来调用不同的方法了。并且将我们的菜单栏也描述出来。

package user;import operation.*;import java.util.Scanner;public class Normal extends User{public Normal(String name) {super(name);//这个接口数组方便我们调用不同的方法。this.ioPerations=new IoPeration[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation()};}@Overridepublic int menu() {System.out.println("********************");System.out.println("hello"+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 scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}

4.3管理员

  与用户的相似。都是通过接口数组来调用不同的方法。并且描述了菜单。

package user;import operation.*;import java.util.Scanner;public class AdminUser extends User{public AdminUser(String name) {super(name);this.ioPerations=new IoPeration[]{new ExitOperation(),new FindOperation(),new Addoperation(),new Deteperation(),new ShowOperation(),};}@Overridepublic int menu() {System.out.println("********************");System.out.println("hello"+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 scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}

4.4main函数中如何调用不同的成员

  在初步想法中,我们定义了一个抽象类作为父类。并让这两个子类来继承它。那么我们自然就联想到面向对象中多态的使用,我们通过向上转型的多态来调用不同的成员。

 public static User login(){System.out.println("请输入你的姓名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();System.out.println("请输入你的用户类型 1=>管理员 0=>用户");int choice=scanner.nextInt();if(choice==1){return new AdminUser(name);}else return new Normal(name);}public static void main(String[] args) {BookList bookList = new BookList();User user = login();

5.方法的调用

  在初步定义了User用户和管理员还有Book,书架与书籍以后。我们此时需要一些方法来帮助我们操作这些书籍。我们在前面分析到,如果我们想使用不同的方法,那么就需要一个接口数组来存放继承这个接口数组的方法。通过数组的下标来调用。

  5.1接口

package operation;import Book.BookList;public interface IoPeration {void work(BookList bookList);
}

5.2增加图书

  增加图书很简单,我们通过Scanner类把我们需要的增加的书本信息加入到book数组的下一个位置,并且将Usesize+1。当然,为了严谨,我们需要判断一下书架里有没有这本书。

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("新增图书");int count= bookList.getUsesize();Scanner scanner=new Scanner(System.in);System.out.println("请输入书名");String name=scanner.nextLine();System.out.println("请输入作者");String author=scanner.nextLine();System.out.println("请输入该书的类型");String tpye=scanner.nextLine();System.out.println("请输入价格");double price=scanner.nextDouble();Book book=new Book(name,author,price,tpye);int a= bookList.getUsesize();for (int i = 0; i < a; i++) {if(bookList.getBooks(i).getName().equals(name)){System.out.println("已经有这本书了");return;}}bookList.setBooks(book);bookList.setUsesize(a+1);}
}

5.3借阅图书

  借阅图书的时候,我们首先要在书架里遍历去判断书架里有没有这本书,然后需要把书的状态改成true即可。

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);String name=scanner.nextLine();for (int i = 0; i < bookList.getUsesize(); i++) {Book book=bookList.getBooks(i);if(book.getName().equals(name)&& book.isBorrowed()==false){System.out.println("借阅成功");book.setBorrowed(true);return;}}System.out.println("没有找到这本书");}
}

  5.4删除图书

   通过两次遍历,第一次遍历找到这本书,第二次遍历,把这本书后面的书放到它的位置上,从后往前覆盖,并且将最后一个置为null。

package operation;import Book.Book;
import Book.BookList;import java.util.Scanner;public class Deteperation implements IoPeration{@Overridepublic void work(BookList bookList) {System.out.println("删除图书");System.out.println("请输入你要删除的图书");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int count= bookList.getUsesize();int index=-1;for (int i = 0; i < count; i++) {Book book=bookList.getBooks(i);if(book.getName().equals(name)){index=i;break;}}for (int j = index; j <count-1; j++) {Book book=bookList.getBooks(j+1);bookList.setbooks(index,book);}bookList.setUsesize(count-1);bookList.setbooks(count-1,null);System.out.println("删除成功");}}

5.5退出系统

 改操作只需要一行函数即可。

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

5.6查找图书

  和前面的方法类似,仅需遍历并且通过我们之前重写的toString方法来打印书的信息即可。

package operation;import Book.BookList;import java.util.Scanner;public class FindOperation implements IoPeration{@Overridepublic void work(BookList bookList) {System.out.println("查找图书");System.out.println("请输入你要查找的图书名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int count= bookList.getUsesize();for (int i = 0; i < count; i++) {if(bookList.getBooks(i).getName().equals(name)){System.out.println("找到了");System.out.println(bookList.getBooks(i));return;}}System.out.println("没有找到这本书");}
}

5.7归还图书

  和借阅图书很相似。改变一下isBorrowed的布尔值即可。

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);String name=scanner.nextLine();for (int i = 0; i < bookList.getUsesize(); i++) {Book book=bookList.getBooks(i);if(book.getName().equals(name)&& book.isBorrowed()==true){System.out.println("归还成功");book.setBorrowed(false);return;}}System.out.println("没有找到这本书");}
}

5.8显示图书

   遍历并打印书架上的书。

package operation;import Book.BookList;
import Book.Book;
import java.util.Arrays;public class ShowOperation implements IoPeration{@Overridepublic void work (BookList bookList) {System.out.println("显示所有书");for (int i = 0; i < bookList.getUsesize(); i++) {Book book=bookList.getBooks(i);System.out.println(book);}}
}

5.9main方法

    我们在调用成员的时候会输入我们所需的操作的数字,并且将这个数字返回给我们的接口数组。通过它来调用不同的方法。因为我们要有很多操作,所以需要while(true)来多步操作

import Book.BookList;
import user.AdminUser;
import user.Normal;
import user.User;import java.util.Scanner;public class Main {public static User login(){System.out.println("请输入你的姓名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();System.out.println("请输入你的用户类型 1=>管理员 0=>用户");int choice=scanner.nextInt();if(choice==1){return new AdminUser(name);}else return new Normal(name);}public static void main(String[] args) {BookList bookList = new BookList();User user = login();while (true) {int choice = user.menu();user.doWord(choice, bookList);}}
}

6.小结

  在做一个图书管理系统的时候,我们首先需要进行一个大的框架的设计。并且具体到每一个对象。使用面向对象的思想,逐步去完成每个类和类中的方法。然后使用我们之前所学到的知识把这些串联起来。

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

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

相关文章

ArrayList浅拷贝clone,Kotlin

ArrayList浅拷贝clone&#xff0c;Kotlin import kotlin.collections.ArrayListfun main() {var list ArrayList<MyData>()for (i in 0..<3) {list.add(MyData(i, 0))}//浅拷贝list到copyListvar copyList list.clone()println(list)println(copyList)println("…

arcgis数据采集与拓扑检查

1、已准备好一张配准好的浙江省行政区划图&#xff0c;如下&#xff1a; 2、现在需要绘制湖州市县级行政区划。需要右击文件夹新建文件地理数据库&#xff0c;如下&#xff1a; 其余步骤均默认即可。 创建好县级要素数据集后&#xff0c;再新建要素类&#xff0c;命名为县。 为…

电脑系统重装日记

重装原因 电脑C盘几乎爆炸故重装系统一清二白 此片原因 记录重装过程&#xff0c;强调一些要注意的点&#xff0c;以防日后重装。 重装过程 1.清空电脑文件后重启&#xff0c;电脑冒蓝光&#xff0c;一直蓝屏反复重启&#xff0c;故只能重装系统以解难题。 2.准备一个U盘&…

Pyinstaller 打包 django 项目如何将命令行参数加入?

起因 Pyinstaller 打包 django 项目&#xff0c;打包成 manage.exe 后用命令行 cmd manage.exe runserver 0.0.0.0:8001 --noreload 来运行感觉很不方便。 希望能够直接把命令行参数也打包进去&#xff0c;直接运行 exe 。我走了些弯路&#xff0c;但最终实现了。 弯路 我看…

odoo16 tree视图没有导出按钮

odoo16 tree视图没有导出按钮 做了一个odoo应用,很奇怪,同样的角色,不同的用户,有些有导出按钮,有些没有,一直没搞清楚为啥, 今天刚好有时间,好好研究一下. 1 先按浏览器F12,导出按钮对应的html: <button type"button" class"btn btn-secondary fa fa-dow…

实现两个table一起滚动的效果

效果 代码 css相关 重点是.head-box .body-box-right .body-box-left 三个类的设置 .box {display: flex;justify-content: flex-start;}table {width: 500px;}tr,th {display: flex;justify-content: space-around;align-content: space-around;height: 50px;}td {width: 8…

Golang-使用 gvm 进行版本控制

当你想为每个项目切换 go 版本时&#xff0c;gvm (Go Version Manager) 很方便。 这里&#xff0c;我将介绍“如何在Mac上安装gvm”和“如何使用gvm” 使用准备 仅适用于 Mac 的准备工作 按照MacOSX 要求中的说明执行以下命令。 xcode-select --install brew update brew …

Leetcode链表篇 Day2

203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 1.暴力移除&#xff1a;分删除的为头结点和不为头节点 while删除头节点时&#xff1a;直接从下一个结点开始&#xff0c;headhead->next while不是头节点时&#xff1a;从head开始遍历(需记录的为 前继结点pre) 虚…

8.14 刷题【7道】

二叉树 1. 树中两个结点的最低公共祖先 原题链接 方法一&#xff1a;公共路径 分别找出根节点到两个节点的路径&#xff0c;则最后一个公共节点就是最低公共祖先了。 时间复杂度分析&#xff1a;需要在树中查找节点&#xff0c;复杂度为O(n) /*** Definition for a binary…

时序预测 | MATLAB实现基于GRU门控循环单元的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于GRU门控循环单元的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于GRU门控循环单元的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 1.Matlab实现GRU门控循环单元时间序列预测未…

Vc - Qt - QToolButton

QToolButton 是 Qt 框架中的一个类&#xff0c;是 QPushButton 的子类。它可以显示一个可单击的按钮&#xff0c;并且可以与弹出菜单、图标和文本等进行关联。 QToolButton的一些常见特性和用法包括&#xff1a; 设置文本&#xff1a;使用 setText() 函数设置按钮上的文本。设置…

【JavaEE进阶】SpringBoot 日志

文章目录 一. 日志有什么用?二. 自定义日志打印1. 日志的使用与打印 三. 日志级别1. 日志级别有什么用?2. 日志级别的分类及使用 四. 日志持久化五. 更简单的日志输出---Lombok1. Lombok的使用2. lombok原理解释2.1 Lombok更多注解说明 一. 日志有什么用? 在Java中&#xf…