Java实现图书管理系统

news2025/7/28 9:09:37

作者:~小明学编程 

文章专栏:JavaSE基础

格言:目之所及皆为回忆,心之所想皆为过往
在这里插入图片描述

今天给大家带来的是用Java实现的图书管理系统。

目录

需求

图书类

创建图书类

创建书架

Operation

IOperation接口

添加图书AddOperation

借阅图书BorrowOperation

删除图书DelOperation

打印图书DisplayOperation

退出系统ExitOperation

查询书籍FindOperation

归还书籍ReturnOperation

user

User

NormalUser

AdminUser

Main

演示


需求

1 、简单的登录
2 、管理端
查阅书籍
增加书籍
删除书籍
打印书籍列表
退出
3 、用户端
查询书籍
借阅书籍
归还书籍
退出

图书类

首先我们创建一个book包,在包里面放一个Book类和一个BookList类。

然后创建一个operation里面放的是我们的各种操作方法。

接着是我们的user类,里面分别放我们的管理员的类和普通成员的类。

最后就是我们的Main类,我们的程序从这里开始执行。

创建图书类

首先我们需要创建一个图书类,该类里面是我们的图书属性例如书名,作者名,价格等等。

public class Book {
    //书名
    private String name;
    //作者名
    private String author;
    //价格
    private int price;
    //书的类型
    private String type;
    //是否借出
    private boolean isBorrowed;

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

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

定义好我们的基本变量之后,然后给出set和get方法,方便之后对数据的修改,最后重写一下我们的toString()方法,便于直接打印。

创建书架

创建好我们书的类之后就是该创建书架了,所谓书架就是存放我们的书的,这里我们可以在里面给一个数组,用于存放不同的书。

然后就是给出我们书的数量,这里我们定义一个userSize用来记录我们图书的数量。

public class BookList {
    private Book[] books = new Book[10];
    private int userSize;
    public BookList() {
       books[0] = new Book("三体","刘慈欣",80,"科幻");
       books[1] = new Book("平凡的世界","路遥",88,"文学");
       books[2] = new Book("明朝那些事儿","当年明月",180,"历史");
       this.userSize = 3;
    }

    public int getUserSize() {
        return userSize;
    }

    public void setUserSize(int userSize) {
        this.userSize = userSize;
    }
    //获取到pos位置的书
    public Book getPos(int pos) {
        return this.books[pos];
    }
    //设置pos位置下标的一本书
    public void setBooks(int pos,Book book) {
        this.books[pos] = book;
    }
}

然后就是set和get方法用于我们对userSize的调整,同时我们给出了调整我们书架里面书的方法。

这里我们给了一个构造方法,用于给我们的书架初始化放上三本书(小编我最爱看的对我影响最大的三本书哈哈),并且指定了书的个数userSize的大小为3。

Operation

该包里面装着我们的所有的对bookList的操作,还有一个接口IOperation,

IOperation接口

public interface IOperation {
    void work(BookList bookList);
}

添加图书AddOperation

public class AddOperation implements IOperation {
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("添加图书操作");
        System.out.println("请输入书名:");
        String name = scanner.nextLine();
        System.out.println("请输入作者:");
        String Author = scanner.nextLine();
        System.out.println("请输入类型:");
        String type = scanner.nextLine();
        System.out.println("请输入价格:");
        int price = scanner.nextInt();
        Book book = new Book(name,Author,price,type);
        bookList.setBooks(bookList.getUserSize(),book);
        bookList.setUserSize(bookList.getUserSize()+1);

    }
}

借阅图书BorrowOperation

public class BorrowOperation implements IOperation {
    public void work(BookList bookList) {
        System.out.println("借书操作");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入想要借阅的书:");
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getUserSize(); i++) {
            if (name.equals(bookList.getPos(i).getName())==true) {
                if(bookList.getPos(i).isBorrowed()==true) {//判断一下该书是否已经被借阅了
                    System.out.println("该书已经被借阅");
                } else {
                    bookList.getPos(i).setBorrowed(true);
                    System.out.println("借阅成功!");
                }
                return;
            }
        }
        System.out.println("您想要借阅的书不存在");
    }
}

删除图书DelOperation

public class DelOperation implements IOperation {
    public void work(BookList bookList) {
        System.out.println("删除图书操作");
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入想要删除图书的名称:");
        String name = scanner.nextLine();
        //循环遍历所有图书
        for (int i = 0; i < bookList.getUserSize(); i++) {
            //找到书名后进行删除
            if (name.equals(bookList.getPos(i).getName())==true) {
                for (int j = i; j < bookList.getUserSize()-1; j++) {
                    bookList.setBooks(j,bookList.getPos(j+1));
                }
                bookList.setBooks(bookList.getUserSize(), null);//防止内存泄漏
                bookList.setUserSize(bookList.getUserSize()-1);
                System.out.println("删除完毕!");
                return;
            }
        }
        System.out.println("您要删除的图书不存在");
    }
}

打印图书DisplayOperation

public class DisplayOperation implements IOperation {
    public void work(BookList bookList) {
        System.out.println("打印图书操作");
        for (int i = 0; i < bookList.getUserSize(); i++) {
            System.out.println(bookList.getPos(i));
        }
    }
}

退出系统ExitOperation

public class ExitOperation implements IOperation {
    public void work(BookList bookList) {
        System.out.println("退出操作");
        System.exit(0);
    }
}

查询书籍FindOperation

public class FindOperation implements IOperation {
    public void work(BookList bookList) {
        System.out.println("查询操作");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入查找的书名:");
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getUserSize(); i++) {
            if (name.equals(bookList.getPos(i).getName())==true) {
                System.out.println("信息如下");
                System.out.println(bookList.getPos(i));
                return;
            }
        }
        System.out.println("没有找到该书!");
    }
}

归还书籍ReturnOperation

public class ReturnOperation implements IOperation {
    public void work(BookList bookList) {
        System.out.println("返回操作");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入想要归还的书:");
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getUserSize(); i++) {
            if (name.equals(bookList.getPos(i).getName())==true) {
                if(bookList.getPos(i).isBorrowed()==false) {//判断一下该书是否已经被借阅了
                    System.out.println("该书已经归还");
                } else {
                    bookList.getPos(i).setBorrowed(false);
                    System.out.println("归还成功!");
                }
                return;
            }
        }
        System.out.println("您想要归还的书不存在");
    }
}

以上就是我们对BookList的操作部分。

user

我们的user这个部分是我们的分部管理,因为我们登录的时候会提醒我们是普通用户登录还是管理员登录,所以我们至少需要创建两个类,但是这两个类肯定会有很多相似的方法和成员,所以这个时候我们就再创建一个User的抽象类,然后让我们AdminUser管理员的类和我们的NormalUser普通类分别继承我们的User

User

public abstract class User {
    protected String name;    //用户姓名
    protected IOperation[] iOperation;    //定义接口类型的数组每个元素指向实现接口的对象
    public User(String name) {
        this.name = name;
    }
    //此时的menu为后续的动态绑定做准备
    public abstract int menu();
    public void doWork(int choice, BookList bookList) {
        iOperation[choice].work(bookList);
    }
}

这里我们的抽象类有name成员,还有IOperation类型的数组,这里也解释了为什么我们刚刚要创建接口,因为有了接口我们后面可以向接口里面放我们的操作方法,因为其它的类都实现了我们的接口并且重写了接口里面的work()方法。

NormalUser

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.iOperation = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation(),
        };
    }
    public int menu() {
        System.out.println("********管理员菜单********");
        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;
    }

}

这里首先是我们的构造方向,先帮父类构造,然后将IOperation进行初始化里面放着是我们普通用户所能进行的一系列操作,再下面就是我们的菜单方法,因为我们的普通用户和管理员所能进行的操作是不一样的,同时选择我们需要的操作。

AdminUser

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        this.iOperation = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new DisplayOperation(),

        };
    }

    public int menu() {
        System.out.println("********管理员菜单********");
        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;
    }
}

管理员类就是菜单里面的方法和IOperation数组与前面有一点区别。

Main

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 NormalUser(name);
        }
    }

    public static void main(String[] args) {
        BookList bookList = new BookList();
        //发生向上转型
        User user = login();
        //此时将发生动态绑定
        while (true) {
            int choice = user.menu();
            user.doWork(choice, bookList);
        }
    }

}

首先看我们的主函数,我么new了一个BookList也就是我们的书架,然后开始登录操作输入身份之后最后返回一个用户的对象,此时我们拥有了两个对象,一个是书架bookList,还有就是我们的用户对象,然后我们的用户就可以对我们的书架进行一系列的操作了。

首先就是打印我们的菜单,顺便返回我们的操作,接着拿着我们的操作choice和我们的书架bookList去执行,user.doWork(),拿着我们的choice找到我们IOperation找到对应的操作最后完成指定的功能。

演示

 

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

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

相关文章

easyrecovery15最新版数据恢复类软件测评

当下如今&#xff0c;利用笔记本进行学习和办公已经是毋庸置疑的了&#xff0c;所以会需要在电脑上保存大量的数据信息&#xff0c;但是电脑在带来方便的同时&#xff0c;也存在很多的隐患。万一数据丢失了&#xff0c;该怎么办呢&#xff1f;要解决数据丢失问题&#xff0c;就…

VUE3 中实现拖拽和缩放自定义看板 vue-grid-layout

Vue Grid Layout官方文档 Vue Grid Layout中文文档 1. npm下载拖拽缩放库 npm install vue-grid-layout3.0.0-beta1 --save 2. vue3 使用 vue-grid-layout报错&#xff1a;external_commonjs_vue_commonjs2_vue_root_Vue_default.a is not a constructor 解决方案: vue3版本…

力扣刷题(代码回忆录)——数组部分

数组 数组过于简单&#xff0c;但你该了解这些&#xff01;数组&#xff1a;二分查找数组&#xff1a;移除元素数组&#xff1a;序数组的平方数组&#xff1a;长度最小的子数组数组&#xff1a;螺旋矩阵II数组&#xff1a;总结篇704. 二分查找 给定一个 n 个元素有序的&#…

什么是MQ

MQ概述 MQ全称 Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进 行通信。 分布式系统之间进行通信&#xff1a; 远程调用&#xff1a;各系统间直接通过远程调用的方式&#xff1b; 借助第三方完成系统…

【GlobalMapper精品教程】019:基于DSM提取离散随机点的高程信息

本文讲解在globalmapper中,基于DSM提取离散随机点的高程信息,配套数据为data019.rar。 文章目录 1. 离散点创建2. 提取离散点高程信息3. 高程标注1. 离散点创建 本文在ArcGIS中,根据给定的范围,随机生成离散点,如下图: 拓展阅读: ArcGIS根据范围创建随机点教程:【ArcG…

关于Kdo N3,1380099-68-2,3-脱氧-D-甘露-辛酸(Kdo)相关物理化学知识了解下

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a; CAS号&#xff1a;1380099-68-2 中文名&#xff1a;2-酮基-3-脱氧辛酸叠氮糖 英文名&#xff1a;Kdo Azide&#xff0c;Kdo N3 结构式&#xff08;Structural&#xff09;&#xff1a; 试剂基团反应特点&a…

基于51单片机的波形发生器proteus仿真数码管LCD12864显示

仿真图1简介&#xff1a; 本系统采用51单片机作为系统的MCU&#xff08;具体型号见下图&#xff09;&#xff0c;该系统显示器为四位数码管&#xff0c;可实时显示波形的参数情况 可显示四种波形&#xff0c;分别是方波、正弦波、三角波、锯齿波。 该设计具有电压表功能&#…

C语言MFC导出dll回调函数方法详解

如何将回调函数导出来 这一章节主要讲述在导出函数的基础上如何将回调函数导出来。 C程序设计语言&#xff08;第1-3部分&#xff09;&#xff08;原书第4版&#xff09; 京东自营优惠价&#xff1a;&#xffe5;119.1立即抢购 回调函数的应用相信很多C程序猿儿们都不陌生吧…

弘玑Cyclone2022年产品发布会:人人可用的数字化工作平台——弘玑工作易

近日&#xff0c;在弘玑Cyclone“智无边界&#xff0c;数字未来”发布会上&#xff0c;弘玑Cyclone2022年超级自动化系列产品全新亮相&#xff0c;首席产品官贾岿博士带领产品团队以创新技术对新时代语境下的数字生产力进行了全新解读。 本文将为大家分享本次发布会重磅推出的…

为什么要让员工入职流程实现自动化

人和人之间的第一印象非常重要&#xff0c;一段缘分能不能开始&#xff0c;就看第一印象够不够给力了。其实&#xff0c;公司和新员工之间也存在着这样的关系&#xff0c;但也有些许差别。公司对新员工的第一印象&#xff0c;更多是从第一次见面的时候就产生了&#xff0c;而新…

NodeJs实战-待办列表(4)-解决待办事项中文乱码问题

NodeJs实战-待办列表4-解决待办事项中文乱码问题乱码问题在哪里产生的定位乱码问题VSCode 启动 NodeJs 调试模式浏览器中调试JS效果图执行添加执行完成乱码问题在哪里产生的 运行第3节的server.js, 当添加中文待办事项时候&#xff0c;会产生中文乱码问题。乱码可能在以下地方…

一款超好用的开源密码管理器?

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store DevWeekly收集整理每周优质开发者内容&#xff0c;包括开源项目、资源工具、技术文章等方面。 每周五定期发布&#xff0c;同步更新到 知乎&#xff1a;Jackpop 。 欢迎大家投稿&#xff0c;提交iss…

最新消息:2022高被引科学家名单已公布,都想成为高被引,到底应该怎么做?(附名单)

11月15日&#xff0c;科睿唯安发布了2022年“高被引科学家”名单。该名单旨在遴选全球自然科学和社会科学领域最具影响力的研究人员。入选“高被引科学家”名单&#xff0c;意味着该学者在其所研究领域具有世界级影响力&#xff0c;其科研成果为该领域发展作出了较大贡献。 全球…

百度全景数据采集与分析

1、百度街景是什么 全景是通过将平面数字图像转换为三维空间&#xff0c;从而带来拟真交互体验的地图浏览方式。 全景技术通过专业相机将现实世界的空间场景捕捉下来&#xff0c;利用软件将多幅平面照片拼接合成&#xff0c;并模拟成三维空间的360度全景景观。全景具有真实感强…

127. 单词接龙

127. 单词接龙 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相邻的单词只差一个字母。对于 1 < i < k 时&#xff0c;每个 si 都在 wordList 中。注意&…

linux线程互斥锁

互斥量mutex 大部分情况&#xff0c;线程使用的数据都是局部变量&#xff0c;变量的地址空间在线程栈空间内&#xff0c;这种情况&#xff0c;变量归属单个线程&#xff0c;其他线程无法获得这种变量。 但有时候&#xff0c;很多变量都需要在线程间共享&#xff0c;这样的变量…

基于粒子群优化算法的冷热电联供型综合能源系统运行优化附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

JAVA图书管理练习

目录0.前言1.书类(BOOK)1.1 Book1.2 BookList2. User类2.1 user类2.2 AdminUser类2.3 NormalUser类3.Operation类3.1 添加图书3.2 删除图书3.3 查找图书3.4 展示图书3.5 退出系统3.6 借阅图书3.7 归还图书0.前言 1.在学习了面向对象,接口继承等语法后,综合使用这些语法完成一个…

【第九章】vim 程序编辑器

文章目录vi与vimvi的使用范例按键说明一般指令模式可用的按钮说明&#xff1a;光标移动、复制贴上、搜寻取代等一般指令模式切换到编辑模式的可用的按钮说明一般指令模式切换到命令行界面的可用按钮说明vim的暂存盘、救援回复与打开时的警告讯息vi与vim 一、Linux上面的指令都…

Java#12(String中的常用方法)

目录 一.String中的方法substring 1.作用:截取字符串 2.格式:对象名.substring(开始的索引,结束的索引(没写就截到结尾)) 3.返回类型是String,所以要用一个字符串对象来接收 4.特点: 二.String中的办法replace 1.作用:替换字符串中的内容 2.格式:对象名.replace("要…