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

article/2025/10/10 23:24:53

图书管理系统

  • 一、初识工作
  • 二、具体实现
  • 三、代码
    • book包
      • Book类
      • BookList类
    • operation包
      • IOperation接口
      • AddOperation
      • BorrowOperation
      • DelOperation
      • DisplayOperation
      • ExitOperation
      • FindOperation
      • ReturnOperation
    • user包
      • AdminUser
      • NormalUser
      • User
    • Main

一、初识工作

我们首先要清楚的是,图书管理系统,一定要有图书和使用者。所以我创了两个包,分别是book user。那么书这个包里面,我们创建了一个书类,同时也创建了一个书柜类,目的是存放我们所有书的信息。那么我们针对于系统,会有许多操作,我们也单独创建出了一个包operation,用来存放各种操作

image-20220605224454901

二、具体实现

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

毫无疑问的是,图书管理系统必须要创建一个关于书的类Book,以及图书管理系统的使用者。

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

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

我们先去定义一个book的包,在包下创建出一个Book类,里面给一些最基础的属性,以及构造方法、getter and setter、以及toString方法

public class Book {private String name;//书名private String author;//作者private double price;//价格private String type;//类型private boolean isBorrowed;//是否被借出//getter and setterpublic 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;}//构造方法//可以不带isBorrowed,因为boolean类型默认就是false,代表未被借出。一本书最刚开始的时候,默认就是未被借出的public Book(String name, String author, double price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}//toString@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", isBorrowed=" + isBorrowed +'}';}
}

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

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

image-20220603214328297

我们在book包下创建BookList类,然后给出它的构造方法,在他的构造方法中初始化三本书籍。并且我们还创建了一个usedSize变量,用来存放数组当中存放了总共几本书。之后我们给出了usedSizegetter and setter方法,我们又自己增加了两个方法:获取pos下标位置的书以及给数组的pos位置 放一本书。

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

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

然后我们就可以在这个包里面写代码了。要关注的是,我们接下来的几个操作,都需要用到BookList,即书柜这个类,我们就需要把他作为参数传进去

AddOperation

import book.BookList;public class AddOperation {//添加书籍:需要添加到书架上public void work(BookList bookList) {System.out.println("添加书籍");}
}

BorrowOperation

import book.BookList;public class BorrowOperation {//借阅书籍:需要从书架上拿下来供借阅public void work(BookList bookList) {System.out.println("借阅书籍");}
}

DelOperation

import book.BookList;public class DelOperation {//删除书籍:需要从书架上删除public void work(BookList bookList) {System.out.println("删除书籍");}
}

DisplayOperation

import book.BookList;public class DisplayOperation {//展示书籍:需要用到书柜,才能展示里面的书籍public void work(BookList bookList) {System.out.println("展示书籍");}
}

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

import book.BookList;public class ExitOperation {//退出系统//是不是需要销毁 这个数组当中的所有数据 或者使用到书柜里面的数据//答案是 有可能会需要public void work(BookList bookList) {System.out.println("退出系统");}
}

FindOperation

import book.BookList;public class FindOperation {//查找图书:需要用到书柜,才能去查找书的具体位置public void work(BookList bookList) {System.out.println("查找书籍");}
}

ReturnOperation

import book.BookList;public class ReturnOperation {//归还书籍:需要用到书柜,把书放进去public void work(BookList bookList) {System.out.println("归还书籍");}
}

我们写完这么多方法之后,发现都是work方法啊,只不过实现的逻辑不同。

你反应过来了吗,这就是多态。我们就可以把work方法放到一个IOperation接口里面,让这些操作对应的类去继承这个接口,然后重写work方法

IOperation接口的代码:

import book.BookList;public interface IOperation {//接口里面的方法默认是不能实现的void work(BookList bookList);
}

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

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

AddOperation

import book.BookList;public class AddOperation implements IOperation {//添加书籍:需要添加到书架上@Overridepublic void work(BookList bookList) {System.out.println("添加书籍");}
}

BorrowOperation

import book.BookList;public class BorrowOperation implements IOperation {//借阅书籍:需要从书架上拿下来供借阅@Overridepublic void work(BookList bookList) {System.out.println("借阅书籍");}
}

DelOperation

import book.BookList;public class DelOperation implements IOperation {//删除书籍:需要从书架上删除@Overridepublic void work(BookList bookList) {System.out.println("删除书籍");}
}

DisplayOperation

import book.BookList;public class DisplayOperation implements IOperation {//展示书籍:需要用到书柜,才能展示里面的书籍@Overridepublic void work(BookList bookList) {System.out.println("展示书籍");}
}

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

import book.BookList;public class ExitOperation implements IOperation {//退出系统//是不是需要销毁 这个数组当中的所有数据 或者使用到书柜里面的数据//答案是 有可能会需要@Overridepublic void work(BookList bookList) {System.out.println("退出系统");}
}

FindOperation

import book.BookList;public class FindOperation implements IOperation {//查找图书:需要用到书柜,才能去查找书的具体位置@Overridepublic void work(BookList bookList) {System.out.println("查找书籍");}
}

ReturnOperation

import book.BookList;public class ReturnOperation implements IOperation {//归还书籍:需要用到书柜,把书放进去@Overridepublic void work(BookList bookList) {System.out.println("归还书籍");}
}

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

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

那么接下来,我们再为系统的使用者创建一个类user(管理员或者普通用户都可以放在user里面)

public class User {protected String name;//不同包的子类也能访问//其实还可以罗列更多的属性
}

再创建NormalUser AdminUser,因为普通用户和管理员都是用户,所以让普通用户和管理员继承于User

image-20220604221809369

NormalUser :

public class NormalUser extends User {}

AdminUser:

public class NormalUser extends User {}

这时候我们为User生成构造方法,发现出错了

image-20220603231320892

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

比如:

public class NormalUser extends User {//子类要先帮助父类构造public NormalUser(String name) {super(name);}//菜单public void menu() {System.out.println(this.name + "你好,欢迎使用图书管理系统");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");}
}
public class AdminUser extends User {//子类要先帮助父类进行构造public AdminUser(String name) {super(name);}//菜单public void menu() {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方法编写相关语句来执行一下吧

我们设计一个登陆函数

public class Main {public static void main(String[] args) {login();}
}

那么我们可以设计一个login登录函数,我们通过所选择的数字来创建出不同的用户,所以返回值应该为User

public static User login() {System.out.println("请输入姓名:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();System.out.println("请输入您的身份:");System.out.println("1:管理员   0:普通用户");int choice = scanner.nextInt();if(choice == 1) {return new AdminUser(name);} else {return new NormalUser(name);}}

image-20220603231758350

所以我们main方法也需要对User()传过来的返回值进行接收,因为传过来的是AdminUser 或者 NormalUser,所以我们直接用他们俩的父类User来接收即可

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

但是我们主函数使用User生成的对象去调用menu发现调用失败

image-20220603232030922

这是因为发生了向上转型,user本身是没有menu方法的,不能直接去调用menu方法,但是我们可以在User里面写一个抽象方法,这样AdminUser以及NormalUser就可以重写User里面的方法了。main方法里user也可以使用子类的方法了

public abstract class User {protected String name;//不同包的子类也能访问//还可以罗列更多的属性//构造方法public User(String name) {this.name = name;}public abstract void menu();
}

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

那么我们接下来,需要去再次完善menu,因为之前只是打印了我们的菜单,并未让用户选择

AdminUser

//菜单public int menu() {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 = new Scanner(System.in);int choice = scanner.nextInt();return choice;}

NormalUser

public int menu() {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 = new Scanner(System.in);int choice = scanner.nextInt();return choice;}

因为我们最后返回的是我们的选择,所以要用int接收,抽象方法也需要修改

public abstract class User {protected String name;//不同包的子类也能访问//还可以罗列更多的属性//构造方法public User(String name) {this.name = name;}public abstract int menu();
}

那么我们还需要将main方法优化一下,因为我们不可能只使用一次就退出

public static void main(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方法

public class DisplayOperation implements IOperation {//展示书籍:需要用到书柜,才能展示里面的书籍@Overridepublic void work(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方法获取当前位置的书籍(之前没写,现在写也可以)

public Book getPos(int pos) {return books[pos];}

把当前位置的书赋给新创建的book变量,让他去直接打印(我们之前就重写过toString方法),但是我们现在再来修改一下toString方法,让布局更美观

原来的:

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

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

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

image-20220605163429959

接下来,是ExitOperation方法

public class ExitOperation implements IOperation {//退出系统//是不是需要销毁 这个数组当中的所有数据 或者使用到书柜里面的数据//答案是 有可能会需要@Overridepublic void work(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方法

public void setBooks(int pos,Book book) {books[pos] = book;}

我们首先要知道,我们想要退出,可以写System.exit(0),这条语句跟C语言里面的return 0意思是一样的。那么在这之前,我为什么还要遍历一遍数组,将每个元素设置为空呢?

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

image-20220605195501416

接下来是AddOperation

public class AddOperation implements IOperation {//添加书籍:需要添加到书架上@Overridepublic void work(BookList bookList) {System.out.println("添加书籍");System.out.println("请输入图书的名字:");Scanner scanner = new Scanner(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 = new Book(name,author,price,type);int currentSize = bookList.getUsedSize();bookList.setBooks(currentSize,book);bookList.setUsedSize(currentSize + 1);}
}

image-20220605202317918

然后是FindOperation

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 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

public class DelOperation implements IOperation {//删除书籍:需要从书架上删除@Overridepublic void work(BookList bookList) {System.out.println("删除书籍");System.out.println("请输入你要删除的图书的名字:");Scanner scanner = new Scanner(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);}//把最后一个位置赋值为nullbookList.setBooks(currentSize - 1,null);bookList.setUsedSize(currentSize - 1);System.out.println("已经删除");}
}

image-20220605222105487

image-20220605222804526

我们来测试一下:

image-20220605222628911

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

image-20220605223004566

BorrowOperation

public class BorrowOperation implements IOperation {//借阅书籍:需要从书架上拿下来供借阅@Overridepublic void work(BookList bookList) {System.out.println("借阅书籍");System.out.println("请输入您要借阅的书籍名:");Scanner scanner = new Scanner(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:

    //归还书籍:需要用到书柜,把书放进去@Overridepublic void work(BookList bookList) {System.out.println("归还书籍");System.out.println("请输入您要归还的书籍名:");Scanner scanner = new Scanner(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类

package book;public class Book {private String name;//书名private String author;//作者private double price;//价格private String type;//类型private boolean isBorrowed;//是否被借出//getter and setterpublic 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;}//构造方法//可以不带isBorrowed,因为boolean类型默认就是false,代表未被借出。一本书最刚开始的时候,默认就是未被借出的public Book(String name, String author, double price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}//toString@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +(isBorrowed == true ? ", 已借出" : ", 未借出") +'}';}
}

BookList类

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

operation包

IOperation接口

package operation;import book.BookList;public interface IOperation {//接口里面的方法默认是不能实现的void work(BookList bookList);
}

AddOperation

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("添加书籍");System.out.println("请输入图书的名字:");Scanner scanner = new Scanner(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 = new Book(name,author,price,type);int currentSize = bookList.getUsedSize();bookList.setBooks(currentSize,book);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("借阅书籍");System.out.println("请输入您要借阅的书籍名:");Scanner scanner = new Scanner(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

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class DelOperation implements IOperation {//删除书籍:需要从书架上删除@Overridepublic void work(BookList bookList) {System.out.println("删除书籍");System.out.println("请输入你要删除的图书的名字:");Scanner scanner = new Scanner(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 = i; j < currentSize - 1; j++) {//bookList[j] = bookList[j+1]Book book = bookList.getPos(j+1);bookList.setBooks(j,book);}//把最后一个位置赋值为nullbookList.setBooks(currentSize - 1,null);bookList.setUsedSize(currentSize - 1);System.out.println("已经删除");}
}

DisplayOperation

package operation;import book.Book;
import book.BookList;public class DisplayOperation implements IOperation {//展示书籍:需要用到书柜,才能展示里面的书籍@Overridepublic void work(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

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

FindOperation

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 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

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("归还书籍");System.out.println("请输入您要归还的书籍名:");Scanner scanner = new Scanner(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

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 DelOperation(),new DisplayOperation()};}//菜单public int menu() {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 = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}

NormalUser

package user;import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import operation.*;import java.util.Scanner;public class NormalUser extends User {//子类要先帮助父类构造public NormalUser(String name) {super(name);this.iOperations = new IOperation[] {new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation()};}//菜单public int menu() {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 = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}

User

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();//创建一个接口数组,存放各种方法public IOperation[] iOperations;public void doOperation(int choice, BookList bookList) {iOperations[choice].work(bookList);}
}

Main

import book.BookList;
import user.AdminUser;
import user.NormalUser;
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("请输入您的身份:");System.out.println("1:管理员   0:普通用户");int choice = scanner.nextInt();if(choice == 1) {return new AdminUser(name);} else {return new NormalUser(name);}}public static void main(String[] args) {User user = login();//user到底引用哪个对象BookList bookList = new BookList();//初始化三本书while(true) {int choice = user.menu();user.doOperation(choice,bookList);}}
}

http://chatgpt.dhexx.cn/article/ArSck0lb.shtml

相关文章

图书管理系统【java】

目录 &#x1f947;1.设计背景 &#x1f50e;2.设计思路 &#x1f511;3.book包 &#x1f4d7;3.1 Book类的实现 &#x1f4d5;3.2 BookList类的实现(书架) &#x1f511;4.user包 &#x1f4d9;4.1 User类的实现 &#x1f4d2;4.2 AdminUser&#xff08;管理员&#x…

图书管理系统(Java)

&#x1f4da; 一、前言1.1整体框架 二、book包2.1Book2.2BookList 三、user包3.1、User3.2、Adminuser3.3、Normaluser 四、Operation包4.1、IOperation接口4.2、AddOperattion4.3、ShowOperation4.4、FindOperation4.5、DelOperation4.6、BorrowOperation4.7、ReturnOperatio…

图书管理系统(Java简单版)(完整代码+详解)

目录 详解&#xff1a; BookList类&#xff1a; InOperation接口 User类&#xff08;父类&#xff09; 和 Main类&#xff08;这俩要一起看&#xff09; 完整代码 book包 Book类 BookList类 operation包 AddBook类 BorrowBook类 DeleteBook类 FindBook类 Pr…

用java实现图书管理系统。

在学完java基础篇的时候&#xff0c;安排做了一个综合版的java基础项目&#xff0c;可以把之前学到的知识综合运用。 图书管理系统。 一.项目设计到的知识1.MVC设计模式思想&#xff08;分包&#xff09;>项目分包>MVC简单介绍 2.GUI&#xff08;图形化界面&#xff09;3…

Java实现简易版的【图书管理系统】

目录 &#x1f30e;1.分析图书管理系统的功能 &#x1f30d; 2.在IDEA中进行功能类的创建 &#x1f984;2.1 创建一个名为book的包&#xff0c;里面存放书相关的 &#x1f984; 2.2 创建一个名为Operation的包&#xff0c;里面存放对书的所有操作 &#x1f30e; 3.进行用户…

Java图书管理系统(代码及详解)

图书管理系统在C、C、Java学习中我们都会进行练习来串联我们学习的一些知识以及使用场景&#xff0c;这里跟着我我带大家敲Java版本&#xff01; 结果展示&#xff1a; 这是我们最终实现的图书管理系统&#xff0c;下面我们慢慢来 思路&#xff1a; Java是面向对象的语言特点…

JAVA实现简易的图书管理系统(含过程)

目录 设计背景 成果展示 设计思路 详细代码 book包 Book类 BookList类 operation包 IOperation接口 AddOperation类 BorrowOperation类 DelOperation类 DisplayOperation类 ExitOperation类 ReturnOperation类 user包 User类 Admin类 NormalUser类 Test类…

图书管理系统(Java实现)[附完整代码]

作者&#xff1a;爱塔居的博客_CSDN博客-JavaSE领域博主 专栏&#xff1a;JavaSE 作者专栏&#xff1a;大三学生&#xff0c;希望跟大家一起进步&#xff01; 文章目录 目录 文章目录 一、图书管理系统菜单 二、实现基本框架 三、实现业务 3.1 打印所有图书 3.2 退出系统 3.3 查…

JAVA->实现图书管理系统

目录 一、图书管理系统展示 1.管理员 2.普通用户 ​编辑3.操作 二、图书管理系统基本实现思路 book --- 包 1.Book类 注意&#xff1a; 2.BookList类 注意&#xff1a; Opreration --- 包 Operration接口 1.AddOperation -- 增加图书 注意&#xff1a; 2. BorrowO…

Java实现简单的图书管理系统

图书管理系统 简介知识点类封装包继承接口多态 创建书&#xff08;Book&#xff09;书架&#xff08;BookList&#xff09;主函数&#xff08;Main&#xff09;用户&#xff08;User&#xff09;管理员&#xff08;Administrator&#xff09;接口&#xff08;IOperation&#x…

Java基础之图书管理系统

一&#xff1a;建立信息表 为图书管理人员编写一个图书管理系统&#xff0c;图书管理系统的设计主要是实现对图书的管理和相关操作&#xff0c;包括3个表&#xff1a; 图书信息表——存储图书的基本信息&#xff0c;包括书号、书名、作者、出版社、出版日期、存馆数量、定价等…

Java实现简单图书管理系统

目录 利物浦是冠军&#xff01; 一、图书管理系统的功能 二、图书管理系统的基本实现思路 1、Book包 2、user包 3、operation包 4、利用Main函数来连接所有包 三、图书管理系统的具体实现 1、Book包 &#xff08;1&#xff09;book类 &#xff08;2&#xff09;bookL…

Java实现图书管理系统(超详细解析)

图书管理系统简单实现。图书管理系统基于Java&#xff0c;页面使用jsp实现。 用户进入登录页面&#xff0c;输入账号密码&#xff0c;系统会自动检验账号和密码是否匹配&#xff0c;匹配成功则进入图书管理首页。首页查看图书信息&#xff0c;新增图书信息&#xff0c;删除不需…

Java实现简单的图书管理系统(讲解清晰,代码齐全,能正常运行)

目录 实现的样子 大致思路 代码 &#xff08;按照这个目录创建包&#xff09; 首先是book包下&#xff0c;有两个类 book类 bookList类 然后是operation包下&#xff0c;有7个类和1个接口 AddOperation类 BorrowOperation类 DelOperation类 DisplayOperation类 ExitO…

Java课程设计—— 图书管理系统

1系统需求分析 1.1功能需求分析 本课题根据图书信息管理综合分析&#xff0c;便出于方便管理考虑&#xff0c;将图书信息管理系统的功能总结起来&#xff0c;共需要实现以下几个方面功能: 1.1.1管理图书信息 管理所有图书的基本信息&#xff0c;对图书信息的操作包括添加、…

用Java实现简易的图书管理系统(超详细)

目录 1.设计背景 2.设计思路 3.模块展示及代码演示 3.1 Book类的实现 3.2 BookList类的实现(书架) 3.3 异常类的实现(OperationException) 3.4 用户类的实现 3.5 操作接口的实现(定义规范) 3.6 操作类的具体实现 3.6.1 增加操作 3.6.2 查找操作 3.6.3 删除操作 3.6…

mysql 数组函数_mysql数组函数知识讲解

MySQL的数组函数有很多种&#xff0c;今天给大家介绍的就是mysql数组中的mysql_fetch_array()函数&#xff0c;mysql_fetch_array()函数的代码编写有什么特点呢&#xff1f; MySQL中有很多功能强大的函数&#xff0c;下面为您介绍的函数mysql_fetch_array()属于MySQL数组函数&a…

MySQL聚合函数

一、聚合函数介绍 1、聚合函数作用于一组数据&#xff0c;并对一组数据返回一个值。 2、聚合函数类型 AVG() SUM() MAX() MIN() COUNT() 3、聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用。 二、AVG和SUM函数 # AVG函数用于求一组数据的平均值&a…

MySql常用函数大全讲解

MySQL数据库中提供了很丰富的函数。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数&#xff0c;可以简化用户的操作。例如&#xff0c;字符串连接函数可以很方便的将多个字符串连接在一起。在这一讲中…

MySql统计函数COUNT详解

MySql统计函数COUNT详解 1. COUNT()函数概述2. COUNT()参数说明3. COUNT()判断存在4. COUNT()阿里开发规范 1. COUNT()函数概述 COUNT() 是一个聚合函数&#xff0c;返回指定匹配条件的行数。开发中常用来统计表中数据&#xff0c;全部数据&#xff0c;不为NULL数据&#xff0…