0


Java实现图书管理系统(新手友好)

图书管理系统

一、初识工作

我们首先要清楚的是,图书管理系统,一定要有图书和使用者。所以我创了两个包,分别是

book
user

。那么书这个包里面,我们创建了一个书类,同时也创建了一个书柜类,目的是存放我们所有书的信息。那么我们针对于系统,会有许多操作,我们也单独创建出了一个包

operation

,用来存放各种操作
image-20220605224454901

二、具体实现

首先,我们之前讲过,面向对象的思路是找对象 创建对象 使用对象,那么我们先来找对象。

毫无疑问的是,图书管理系统必须要创建一个关于书的类

Book

,以及图书管理系统的使用者。

后续如果还有新的对象,再去添加即可。

注意:我们并不是那么神通广大,一次性就能找到所有需要用的对象,这是个循序渐进的过程,想到什么再去做什么。

我们先去定义一个

book

的包,在包下创建出一个

Book

类,里面给一些最基础的属性,以及构造方法、

getter and setter

、以及

toString

方法

publicclassBook{privateString name;//书名privateString author;//作者privatedouble price;//价格privateString type;//类型privateboolean isBorrowed;//是否被借出//getter and setterpublicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicStringgetAuthor(){return author;}publicvoidsetAuthor(String author){this.author = author;}publicdoublegetPrice(){return price;}publicvoidsetPrice(double price){this.price = price;}publicStringgetType(){return type;}publicvoidsetType(String type){this.type = type;}publicbooleanisBorrowed(){return isBorrowed;}publicvoidsetBorrowed(boolean borrowed){
        isBorrowed = borrowed;}//构造方法//可以不带isBorrowed,因为boolean类型默认就是false,代表未被借出。一本书最刚开始的时候,默认就是未被借出的publicBook(String name,String author,double price,String type){this.name = name;this.author = author;this.price = price;this.type = type;}//toString@OverridepublicStringtoString(){return"Book{"+"name='"+ name +'\''+", author='"+ author +'\''+", price="+ price +", type='"+ type +'\''+", isBorrowed="+ isBorrowed +'}';}}

然后,我们需要创建一个理想化出来的书架类,来存放我们的这些书籍。

要注意到的是,书架可以用数组类型,每个位置存放一本书的各种信息

image-20220603214328297

我们在

book

包下创建

BookList

类,然后给出它的构造方法,在他的构造方法中初始化三本书籍。并且我们还创建了一个

usedSize

变量,用来存放数组当中存放了总共几本书。之后我们给出了

usedSize

getter and setter

方法,我们又自己增加了两个方法:获取

pos

下标位置的书以及给数组的

pos

位置 放一本书。

publicclassBookList{privateBook[] books =newBook[10];//这个书架的大小privateint usedSize;//数组中放了几本书publicBookList(){
        books[0]=newBook("三国演义","罗贯中",90,"小说");
        books[1]=newBook("西游记","吴承恩",78,"小说");
        books[2]=newBook("红楼梦","曹雪芹",89,"小说");this.usedSize =3;}/**
     * 获取当前数组当中的元素的个数
     * @return
     */publicintgetUsedSize(){return usedSize;}/**
     * 修改当前数组中元素个数
     * @param usedSize
     */publicvoidsetUsedSize(int usedSize){this.usedSize = usedSize;}//可以在这里写借书 还书等操作->不推荐/**
     * 获取pos下标位置的书
     * @param pos
     * @return
     */publicBookgetPos(int pos){return books[pos];}/**
     * 给数组的pos位置 放一本书
     * 
     */publicvoidsetBooks(int pos,Book book){
        books[pos]= book;}}

其实我们可以在这个类的最后面继续写相关操作,但是这样不太好,我们可以再创建一个

operation

包,把后续需要用到的相关操作写到这个包里面

然后我们就可以在这个包里面写代码了。要关注的是,我们接下来的几个操作,都需要用到

BookList

,即书柜这个类,我们就需要把他作为参数传进去

AddOperation
importbook.BookList;publicclassAddOperation{//添加书籍:需要添加到书架上publicvoidwork(BookList bookList){System.out.println("添加书籍");}}
BorrowOperation
importbook.BookList;publicclassBorrowOperation{//借阅书籍:需要从书架上拿下来供借阅publicvoidwork(BookList bookList){System.out.println("借阅书籍");}}
DelOperation
importbook.BookList;publicclassDelOperation{//删除书籍:需要从书架上删除publicvoidwork(BookList bookList){System.out.println("删除书籍");}}
DisplayOperation
importbook.BookList;publicclassDisplayOperation{//展示书籍:需要用到书柜,才能展示里面的书籍publicvoidwork(BookList bookList){System.out.println("展示书籍");}}
ExitOperation

:要注意退出系统时候,如果有清空系统的需求的话,也是要把书柜这个类作为参数传进去的

importbook.BookList;publicclassExitOperation{//退出系统//是不是需要销毁 这个数组当中的所有数据 或者使用到书柜里面的数据//答案是 有可能会需要publicvoidwork(BookList bookList){System.out.println("退出系统");}}
FindOperation
importbook.BookList;publicclassFindOperation{//查找图书:需要用到书柜,才能去查找书的具体位置publicvoidwork(BookList bookList){System.out.println("查找书籍");}}
ReturnOperation
importbook.BookList;publicclassReturnOperation{//归还书籍:需要用到书柜,把书放进去publicvoidwork(BookList bookList){System.out.println("归还书籍");}}

我们写完这么多方法之后,发现都是

work

方法啊,只不过实现的逻辑不同。

你反应过来了吗,这就是多态。我们就可以把

work

方法放到一个

IOperation

接口里面,让这些操作对应的类去继承这个接口,然后重写

work

方法

IOperation

接口的代码:

importbook.BookList;publicinterfaceIOperation{//接口里面的方法默认是不能实现的voidwork(BookList bookList);}

别忘了里面要传过去参数,不然不会重载成功

那么我们再去修改一下之前的那几个代码

AddOperation
importbook.BookList;publicclassAddOperationimplementsIOperation{//添加书籍:需要添加到书架上@Overridepublicvoidwork(BookList bookList){System.out.println("添加书籍");}}
BorrowOperation
importbook.BookList;publicclassBorrowOperationimplementsIOperation{//借阅书籍:需要从书架上拿下来供借阅@Overridepublicvoidwork(BookList bookList){System.out.println("借阅书籍");}}
DelOperation
importbook.BookList;publicclassDelOperationimplementsIOperation{//删除书籍:需要从书架上删除@Overridepublicvoidwork(BookList bookList){System.out.println("删除书籍");}}
DisplayOperation
importbook.BookList;publicclassDisplayOperationimplementsIOperation{//展示书籍:需要用到书柜,才能展示里面的书籍@Overridepublicvoidwork(BookList bookList){System.out.println("展示书籍");}}
ExitOperation

:要注意退出系统时候,如果有清空系统的需求的话,也是要把书柜这个类作为参数传进去的

importbook.BookList;publicclassExitOperationimplementsIOperation{//退出系统//是不是需要销毁 这个数组当中的所有数据 或者使用到书柜里面的数据//答案是 有可能会需要@Overridepublicvoidwork(BookList bookList){System.out.println("退出系统");}}
FindOperation
importbook.BookList;publicclassFindOperationimplementsIOperation{//查找图书:需要用到书柜,才能去查找书的具体位置@Overridepublicvoidwork(BookList bookList){System.out.println("查找书籍");}}
ReturnOperation
importbook.BookList;publicclassReturnOperationimplementsIOperation{//归还书籍:需要用到书柜,把书放进去@Overridepublicvoidwork(BookList bookList){System.out.println("归还书籍");}}

那么目前,我们实现的接口,初步估测有两个作用

  1. 实现了接口之后,就可以实现多态,可以向上转型操作
  2. 使用了接口,规范化代码

那么接下来,我们再为系统的使用者创建一个类

user

(管理员或者普通用户都可以放在

user

里面)

publicclassUser{protectedString name;//不同包的子类也能访问//其实还可以罗列更多的属性}

再创建

NormalUser
AdminUser

,因为普通用户和管理员都是用户,所以让普通用户和管理员继承于

User

image-20220604221809369

NormalUser

:

publicclassNormalUserextendsUser{}
AdminUser

:

publicclassNormalUserextendsUser{}

这时候我们为

User

生成构造方法,发现出错了

image-20220603231320892

这是因为在有继承的关系下,子类要先帮父类进行构造

比如:

publicclassNormalUserextendsUser{//子类要先帮助父类构造publicNormalUser(String name){super(name);}//菜单publicvoidmenu(){System.out.println(this.name +"你好,欢迎使用图书管理系统");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");}}
publicclassAdminUserextendsUser{//子类要先帮助父类进行构造publicAdminUser(String name){super(name);}//菜单publicvoidmenu(){System.out.println(this.name +"你好,欢迎使用图书管理系统");System.out.println("1.查找图书");System.out.println("2.新增图书");System.out.println("3.删除图书");System.out.println("4.显示图书");System.out.println("0.退出系统");}}

那么同时,我们也把他们各自的菜单设计出来了

现在,基本的逻辑框架已经差不多了。我们在

main

方法编写相关语句来执行一下吧

我们设计一个登陆函数

publicclassMain{publicstaticvoidmain(String[] args){login();}}

那么我们可以设计一个

login

登录函数,我们通过所选择的数字来创建出不同的用户,所以返回值应该为

User
publicstaticUserlogin(){System.out.println("请输入姓名:");Scanner scanner =newScanner(System.in);String name = scanner.nextLine();System.out.println("请输入您的身份:");System.out.println("1:管理员   0:普通用户");int choice = scanner.nextInt();if(choice ==1){returnnewAdminUser(name);}else{returnnewNormalUser(name);}}

image-20220603231758350

所以我们

main

方法也需要对

User()

传过来的返回值进行接收,因为传过来的是

AdminUser

或者

NormalUser

,所以我们直接用他们俩的父类

User

来接收即可

publicstaticvoidmain(String[] args){User user =login();//user到底引用哪个对象}

但是我们主函数使用

User

生成的对象去调用

menu

发现调用失败

image-20220603232030922

这是因为发生了向上转型,

user

本身是没有

menu

方法的,不能直接去调用

menu

方法,但是我们可以在

User

里面写一个抽象方法,这样

AdminUser

以及

NormalUser

就可以重写

User

里面的方法了。

main

方法里

user

也可以使用子类的方法了

publicabstractclassUser{protectedString name;//不同包的子类也能访问//还可以罗列更多的属性//构造方法publicUser(String name){this.name = name;}publicabstractvoidmenu();}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W4OZAYBS-1657773093401)(C:/Users/13555/AppData/Roaming/Typora/typora-user-images/image-20220603232519679.png)]

那么我们接下来,需要去再次完善

menu

,因为之前只是打印了我们的菜单,并未让用户选择

AdminUser
//菜单publicintmenu(){System.out.println(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("请选择:");Scanner scanner =newScanner(System.in);int choice = scanner.nextInt();return choice;}
NormalUser
publicintmenu(){System.out.println(this.name +"你好,欢迎使用图书管理系统");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("请选择:");Scanner scanner =newScanner(System.in);int choice = scanner.nextInt();return choice;}

因为我们最后返回的是我们的选择,所以要用

int

接收,抽象方法也需要修改

publicabstractclassUser{protectedString name;//不同包的子类也能访问//还可以罗列更多的属性//构造方法publicUser(String name){this.name = name;}publicabstractintmenu();}

那么我们还需要将

main

方法优化一下,因为我们不可能只使用一次就退出

publicstaticvoidmain(String[] args){User user =login();//user到底引用哪个对象while(true){int choice = user.menu();}}

image-20220604225045351

那么

user.menu

传过来的数字可能是1,2…,那么我们怎么知道

choice

接收的是管理员的1还是用户的1呢?

image-20220604230456881

然后我们可以写一个方法,来帮我们具体的去调用

NormalUser

或者

AdminUser

image-20220604230906594

那么我们再帮大家梳理一下结构

image-20220604231613121

那么这样我们的框架就搭出来了。我们可以测试一下

管理员的测试

image-20220605155059042

用户的测试

image-20220605155135684

这里面输入0还没退出是因为我们还没实现退出的功能

博客分隔符-月亮

那么接下来,我们要实现的就是各个功能的逻辑了

我们先来写

DisplayOperation

方法

publicclassDisplayOperationimplementsIOperation{//展示书籍:需要用到书柜,才能展示里面的书籍@Overridepublicvoidwork(BookList bookList){System.out.println("展示书籍");int currentSize = bookList.getUsedSize();for(int i =0; i < currentSize; i++){Book book = bookList.getPos(i);System.out.println(book);}}}

我们要注意的是,我们之前定义了一个

usedSize

表示有几本书,那么在这里面是不能直接使用

usedSize

的,因为我们之前将他设置成了私有属性,所以需要通过

get

方法拿到

usedSize

的大小

然后我们还有个

getPos

方法获取当前位置的书籍(之前没写,现在写也可以)

publicBookgetPos(int pos){return books[pos];}

把当前位置的书赋给新创建的

book

变量,让他去直接打印(我们之前就重写过

toString

方法),但是我们现在再来修改一下

toString

方法,让布局更美观

原来的:

//toString@OverridepublicStringtoString(){return"Book{"+"name='"+ name +'\''+", author='"+ author +'\''+", price="+ price +", type='"+ type +'\''+", isBorrowed="+ isBorrowed +'}';}

现在的:通过三目运算符来打印到底借没借出

@OverridepublicStringtoString(){return"Book{"+"name='"+ name +'\''+", author='"+ author +'\''+", price="+ price +", type='"+ type +'\''+(isBorrowed ==true?", 已借出":", 未借出")+'}';}

image-20220605163429959

接下来,是

ExitOperation

方法

publicclassExitOperationimplementsIOperation{//退出系统//是不是需要销毁 这个数组当中的所有数据 或者使用到书柜里面的数据//答案是 有可能会需要@Overridepublicvoidwork(BookList bookList){System.out.println("退出系统");int currentSize = bookList.getUsedSize();for(int i =0; i < currentSize; i++){
            bookList.setBooks(i,null);}System.exit(0);}}

BookList

类中写

SetBooks

方法

publicvoidsetBooks(int pos,Book book){
        books[pos]= book;}

我们首先要知道,我们想要退出,可以写

System.exit(0)

,这条语句跟

C

语言里面的

return 0

意思是一样的。那么在这之前,我为什么还要遍历一遍数组,将每个元素设置为空呢?

因为我们单纯只是退出系统的话,也能达到每个数据都被销毁的效果,但是在实际工作中,不是随随便便就可以退出系统的,假如我们不进行资源销毁,那么这些没有用的资源还是会占用空间,造成卡顿的,所以我们应该将每一块不需要用的内存置为空,将他的引用断开,垃圾回收器发现有没有引用的资源就会把这些没用的资源回收掉

image-20220605195501416

接下来是

AddOperation
publicclassAddOperationimplementsIOperation{//添加书籍:需要添加到书架上@Overridepublicvoidwork(BookList bookList){System.out.println("添加书籍");System.out.println("请输入图书的名字:");Scanner scanner =newScanner(System.in);String name = scanner.nextLine();System.out.println("请输入图书的作者:");String author = scanner.nextLine();System.out.println("请输入图书的类型:");String type = scanner.nextLine();System.out.println("请输入图书的价格:");double price = scanner.nextDouble();Book book =newBook(name,author,price,type);int currentSize = bookList.getUsedSize();
        bookList.setBooks(currentSize,book);
        bookList.setUsedSize(currentSize +1);}}

image-20220605202317918

然后是

FindOperation
publicclassFindOperationimplementsIOperation{//查找图书:需要用到书柜,才能去查找书的具体位置@Overridepublicvoidwork(BookList bookList){System.out.println("查找书籍");System.out.println("请输入图书的名字:");Scanner scanner =newScanner(System.in);String name = scanner.nextLine();int curtentSize = bookList.getUsedSize();for(int i =0; i < curtentSize; i++){Book book = bookList.getPos(i);//把每本书都查找出来if(book.getName().equals(name)){//如果当前查找的书名和已经有的书名一样的话System.out.println("找到了这本书,信息如下");System.out.println(book);return;//找到了就可以退出了}}System.out.println("没有这本书");//走到这里了还没有,就是找不到了}}

之后是

DelOperation
publicclassDelOperationimplementsIOperation{//删除书籍:需要从书架上删除@Overridepublicvoidwork(BookList bookList){System.out.println("删除书籍");System.out.println("请输入你要删除的图书的名字:");Scanner scanner =newScanner(System.in);String name = scanner.nextLine();int index =0;int currentSize = bookList.getUsedSize();int i =0;for(i =0; i < currentSize; i++){Book book = bookList.getPos(i);if(book.getName().equals(name)){
                index = i;break;}}//1.遇到了break;//2.没有找到,结束了for循环if(i == currentSize){System.out.println("没有你要删除的图书");return;}for(int j =0; j < currentSize -1; j++){//bookList[j] = bookList[j+1]Book book = bookList.getPos(j+1);
            bookList.setBooks(j,book);}//把最后一个位置赋值为null
        bookList.setBooks(currentSize -1,null);
        bookList.setUsedSize(currentSize -1);System.out.println("已经删除");}}

image-20220605222105487

image-20220605222804526

我们来测试一下:

image-20220605222628911

那么,管理员的功能我们都实现完毕了。接下来,我们来写用户的功能。用户有四个功能,我们已经实现两个了。

image-20220605223004566

BorrowOperation

publicclassBorrowOperationimplementsIOperation{//借阅书籍:需要从书架上拿下来供借阅@Overridepublicvoidwork(BookList bookList){System.out.println("借阅书籍");System.out.println("请输入您要借阅的书籍名:");Scanner scanner =newScanner(System.in);String name = scanner.nextLine();int i =0;int currentSize = bookList.getUsedSize();for(i =0;i < currentSize;i++){Book book = bookList.getPos(i);if(book.getName().equals(name)){//找到这本书了
                book.setBorrowed(true);System.out.println("借阅成功");return;}}System.out.println("没有您要借阅的书");}}
ReturnOperation

:

//归还书籍:需要用到书柜,把书放进去@Overridepublicvoidwork(BookList bookList){System.out.println("归还书籍");System.out.println("请输入您要归还的书籍名:");Scanner scanner =newScanner(System.in);String name = scanner.nextLine();int i =0;int currentSize = bookList.getUsedSize();for(i =0;i < currentSize;i++){Book book = bookList.getPos(i);if(book.getName().equals(name)){//找到这本书了
                book.setBorrowed(false);System.out.println("归还成功");return;}}System.out.println("没有您要归还的书");}}

image-20220605223915269

三、代码

book包

Book类

packagebook;publicclassBook{privateString name;//书名privateString author;//作者privatedouble price;//价格privateString type;//类型privateboolean isBorrowed;//是否被借出//getter and setterpublicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicStringgetAuthor(){return author;}publicvoidsetAuthor(String author){this.author = author;}publicdoublegetPrice(){return price;}publicvoidsetPrice(double price){this.price = price;}publicStringgetType(){return type;}publicvoidsetType(String type){this.type = type;}publicbooleanisBorrowed(){return isBorrowed;}publicvoidsetBorrowed(boolean borrowed){
        isBorrowed = borrowed;}//构造方法//可以不带isBorrowed,因为boolean类型默认就是false,代表未被借出。一本书最刚开始的时候,默认就是未被借出的publicBook(String name,String author,double price,String type){this.name = name;this.author = author;this.price = price;this.type = type;}//toString@OverridepublicStringtoString(){return"Book{"+"name='"+ name +'\''+", author='"+ author +'\''+", price="+ price +", type='"+ type +'\''+(isBorrowed ==true?", 已借出":", 未借出")+'}';}}

BookList类

packagebook;/**
 * 书架类
 */publicclassBookList{privateBook[] books =newBook[10];//这个书架的大小privateint usedSize;//数组中放了几本书publicBookList(){
        books[0]=newBook("三国演义","罗贯中",90,"小说");
        books[1]=newBook("西游记","吴承恩",78,"小说");
        books[2]=newBook("红楼梦","曹雪芹",89,"小说");this.usedSize =3;}/**
     * 获取当前数组当中的元素的个数
     * @return
     */publicintgetUsedSize(){return usedSize;}/**
     * 修改当前数组中元素个数
     * @param usedSize
     */publicvoidsetUsedSize(int usedSize){this.usedSize = usedSize;}//可以在这里写借书 还书等操作->不推荐/**
     * 获取pos下标位置的书
     * @param pos
     * @return
     */publicBookgetPos(int pos){return books[pos];}/**
     * 给数组的pos位置 放一本书
     *
     */publicvoidsetBooks(int pos,Book book){
        books[pos]= book;}}

operation包

IOperation接口

packageoperation;importbook.BookList;publicinterfaceIOperation{//接口里面的方法默认是不能实现的voidwork(BookList bookList);}

AddOperation

packageoperation;importbook.Book;importbook.BookList;importjava.util.Scanner;publicclassAddOperationimplementsIOperation{//添加书籍:需要添加到书架上@Overridepublicvoidwork(BookList bookList){System.out.println("添加书籍");System.out.println("请输入图书的名字:");Scanner scanner =newScanner(System.in);String name = scanner.nextLine();System.out.println("请输入图书的作者:");String author = scanner.nextLine();System.out.println("请输入图书的类型:");String type = scanner.nextLine();System.out.println("请输入图书的价格:");double price = scanner.nextDouble();Book book =newBook(name,author,price,type);int currentSize = bookList.getUsedSize();
        bookList.setBooks(currentSize,book);
        bookList.setUsedSize(currentSize+1);}}

BorrowOperation

packageoperation;importbook.Book;importbook.BookList;importjava.util.Scanner;publicclassBorrowOperationimplementsIOperation{//借阅书籍:需要从书架上拿下来供借阅@Overridepublicvoidwork(BookList bookList){System.out.println("借阅书籍");System.out.println("请输入您要借阅的书籍名:");Scanner scanner =newScanner(System.in);String name = scanner.nextLine();int i =0;int currentSize = bookList.getUsedSize();for(i =0;i < currentSize;i++){Book book = bookList.getPos(i);if(book.getName().equals(name)){//找到这本书了
                book.setBorrowed(true);System.out.println("借阅成功");return;}}System.out.println("没有您要借阅的书");}}

DelOperation

packageoperation;importbook.Book;importbook.BookList;importjava.util.Scanner;publicclassDelOperationimplementsIOperation{//删除书籍:需要从书架上删除@Overridepublicvoidwork(BookList bookList){System.out.println("删除书籍");System.out.println("请输入你要删除的图书的名字:");Scanner scanner =newScanner(System.in);String name = scanner.nextLine();int index =0;int currentSize = bookList.getUsedSize();int i =0;for(i =0; i < currentSize; i++){Book book = bookList.getPos(i);if(book.getName().equals(name)){
                index = i;break;}}//1.遇到了break;//2.没有找到,结束了for循环if(i == currentSize){System.out.println("没有你要删除的图书");return;}for(int j =0; j < currentSize -1; j++){//bookList[j] = bookList[j+1]Book book = bookList.getPos(j+1);
            bookList.setBooks(j,book);}//把最后一个位置赋值为null
        bookList.setBooks(currentSize -1,null);
        bookList.setUsedSize(currentSize -1);System.out.println("已经删除");}}

DisplayOperation

packageoperation;importbook.Book;importbook.BookList;publicclassDisplayOperationimplementsIOperation{//展示书籍:需要用到书柜,才能展示里面的书籍@Overridepublicvoidwork(BookList bookList){System.out.println("展示书籍");int currentSize = bookList.getUsedSize();for(int i =0; i < currentSize; i++){Book book = bookList.getPos(i);System.out.println(book);}}}

ExitOperation

packageoperation;importbook.BookList;publicclassExitOperationimplementsIOperation{//退出系统//是不是需要销毁 这个数组当中的所有数据 或者使用到书柜里面的数据//答案是 有可能会需要@Overridepublicvoidwork(BookList bookList){System.out.println("退出系统");int currentSize = bookList.getUsedSize();for(int i =0; i < currentSize; i++){
            bookList.setBooks(i,null);}System.exit(0);}}

FindOperation

publicclassFindOperationimplementsIOperation{//查找图书:需要用到书柜,才能去查找书的具体位置@Overridepublicvoidwork(BookList bookList){System.out.println("查找书籍");System.out.println("请输入图书的名字:");Scanner scanner =newScanner(System.in);String name = scanner.nextLine();int curtentSize = bookList.getUsedSize();for(int i =0; i < curtentSize; i++){Book book = bookList.getPos(i);if(book.getName().equals(name)){System.out.println("找到了这本书,信息如下");System.out.println(book);return;}}System.out.println("没有这本书");}}

ReturnOperation

packageoperation;importbook.Book;importbook.BookList;importjava.util.Scanner;publicclassReturnOperationimplementsIOperation{//归还书籍:需要用到书柜,把书放进去@Overridepublicvoidwork(BookList bookList){System.out.println("归还书籍");System.out.println("请输入您要归还的书籍名:");Scanner scanner =newScanner(System.in);String name = scanner.nextLine();int i =0;int currentSize = bookList.getUsedSize();for(i =0;i < currentSize;i++){Book book = bookList.getPos(i);if(book.getName().equals(name)){//找到这本书了
                book.setBorrowed(false);System.out.println("归还成功");return;}}System.out.println("没有您要归还的书");}}

user包

AdminUser

packageuser;importoperation.*;importjava.util.Scanner;publicclassAdminUserextendsUser{//子类要先帮助父类进行构造publicAdminUser(String name){super(name);this.iOperations =newIOperation[]{newExitOperation(),newFindOperation(),newAddOperation(),newDelOperation(),newDisplayOperation()};}//菜单publicintmenu(){System.out.println(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("请选择:");Scanner scanner =newScanner(System.in);int choice = scanner.nextInt();return choice;}}

NormalUser

packageuser;importcom.sun.xml.internal.ws.policy.privateutil.PolicyUtils;importoperation.*;importjava.util.Scanner;publicclassNormalUserextendsUser{//子类要先帮助父类构造publicNormalUser(String name){super(name);this.iOperations =newIOperation[]{newExitOperation(),newFindOperation(),newBorrowOperation(),newReturnOperation()};}//菜单publicintmenu(){System.out.println(this.name +"你好,欢迎使用图书管理系统");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("请选择:");Scanner scanner =newScanner(System.in);int choice = scanner.nextInt();return choice;}}

User

packageuser;importbook.BookList;importoperation.IOperation;publicabstractclassUser{protectedString name;//不同包的子类也能访问//还可以罗列更多的属性//构造方法publicUser(String name){this.name = name;}publicabstractintmenu();//创建一个接口数组,存放各种方法publicIOperation[] iOperations;publicvoiddoOperation(int choice,BookList bookList){
        iOperations[choice].work(bookList);}}

Main

importbook.BookList;importuser.AdminUser;importuser.NormalUser;importuser.User;importjava.util.Scanner;publicclassMain{publicstaticUserlogin(){System.out.println("请输入姓名:");Scanner scanner =newScanner(System.in);String name = scanner.nextLine();System.out.println("请输入您的身份:");System.out.println("1:管理员   0:普通用户");int choice = scanner.nextInt();if(choice ==1){returnnewAdminUser(name);}else{returnnewNormalUser(name);}}publicstaticvoidmain(String[] args){User user =login();//user到底引用哪个对象BookList bookList =newBookList();//初始化三本书while(true){int choice = user.menu();
            user.doOperation(choice,bookList);}}}

本文转载自: https://blog.csdn.net/m0_53117341/article/details/125781886
版权归原作者 加勒比海涛 所有, 如有侵权,请联系我们删除。

“Java实现图书管理系统(新手友好)”的评论:

还没有评论