基础版图书管理系统(Java实现)

2023-11-18


前言

对于图书管理系统我想大家都不会陌生,在C语言的学习中相信大家都写过这个系统,那么今天我们就用Java来实现一下图书管理系统,看看和C语言又有什么不一样的地方呢。


一、设计书类、书架类

图书管理系统最重要的就是书,首先我们需要设计一个书,然后又书架来存放书籍,所以就需要设计一个Book类和一个BookShelf类。

Book里面有各种图书的信息,并提供带参构造方法,同时为了代码的安全性更高,我们将Book中的数据全部用private修饰,然后利用get方法来获取图书信息。

public class Book {
    private String name;//图书名
    private String author;//作者
    private double price;//价格
    private String category;//图书分类
    private boolean isBorrow;//是否借出

    public Book(String name, String author, double price, String category) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.category = category;
    }

    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 getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public boolean isBorrow() {
        return isBorrow;
    }

    public void setBorrow(boolean borrow) {
        isBorrow = borrow;
    }

    @Override
    public String toString() {
        return "Book{" +
                "书名:'" + name + '\'' +
                ", 作者:'" + author + '\'' +
                ", 价格:" + price +
                ", 类别:'" + category + '\'' +
                ", 借阅情况:" + (isBorrow?"已被借出":"未被借出") +
                '}';
    }
}

 然后再写BookShelf类,存放书籍。首先里面需要定义一个Book类型的数组,我们在调用书架类的构造方法时在书中初始化三本书。

public class Bookshelf {
    private Book[] books = new Book[10];
    private int num;

    public Bookshelf() {
        books[0] = new Book("三国演义","罗贯中",18,"名著");
        books[1] = new Book("红楼梦","曹雪芹",19,"名著");
        books[2] = new Book("西游记","吴承恩",20,"名著");
        setNum(3);
    }

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

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

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

二、设计用户类

我们的用户一共有两种,为管理员和普通用户,他们的很多信息都是相同的,所以我们可以定义一个抽象类User,然后让管理员和普通用户继承它的属性,并分别重写其中的抽象方法。


public abstract class User {
    protected String name;//用户的名字
    protected IOperation[] iOperations;//不同的方法的数组
    public User(String name){
        this.name = name;
    }
    public abstract int menu();//需要子类重写的打印菜单方法
    public void doOperation(int choice,Bookshelf bookshelf){//操作方法
        this.iOperations[choice].work(bookshelf);
//根据选择的操作,调用操作接口数组中对应下标的方法。
    }
}

 

1.管理员

public class Admin extends User{
    public Admin(String name) {//构造方法
        super(name);//调用父类的构造方法
        this.iOperations = new IOperation[]{//给操作接口数组赋值
                new ExitOperation(),//退出系统
                new FindOperation(),//查找操作
                new AddOperation(),//增加操作
                new DelOperation(),//删除操作
                new ShowOperation()//显示所有图书操作
        };
    }
    @Override
    public int menu() {//重写menu方法
        Scanner sc = new Scanner(System.in);
        int choice = -1;
        System.out.println("管理员操作系统");
        System.out.println("1.查找图书");
        System.out.println("2.增加图书");
        System.out.println("3.删除图书");
        System.out.println("4.显示全部图书");
        System.out.println("0.退出程序");
        System.out.println("输入操作:");
        choice = sc.nextInt();
        return choice;//返回选择的操作,调用对应下标操作数组中方法。
    }
}

2.普通用户

public class Reader extends User{
    public Reader(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowBook(),
                new ReturnBook()
        };
    }
    public int menu() {
        Scanner sc = new Scanner(System.in);
        int choice = -1;
        System.out.println("借阅系统");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出系统");
        System.out.println("输入操作:");
        choice = sc.nextInt();
        return choice;
    }
}

 


三、操作包

为了实现这些不同的操作方法,我们创建了一个包,在包里面创建了一个操作接口,可以通过它来实现不同的操作类。

public interface IOperation {
    void work(Bookshelf bookshelf);
}

 新增图书

public class AddOperation implements IOperation {
    @Override
    public void work(Bookshelf bookshelf) {
        System.out.println("增加图书");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入图书的名字:");
        String name = sc.nextLine();
        System.out.println("请输入图书的作者:");
        String author = sc.nextLine();
        System.out.println("请输入图书的类别:");
        String category = sc.nextLine();
        System.out.println("请输入图书的价格:");
        double price = sc.nextDouble();
        Book book = new Book(name,author,price,category);
        int num = bookshelf.getNum();
        bookshelf.setBooks(num,book);
        bookshelf.setNum(num+1);
        System.out.println("新增图书成功");
    }
}

借阅图书

public class BorrowBook implements IOperation{

    @Override
    public void work(Bookshelf bookshelf) {
        System.out.println("借书");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入图书的名字:");
        String name = sc.nextLine();
        int num = bookshelf.getNum();
        for (int i = 0; i < num; i++) {
            Book book = bookshelf.getBooks(i);
            if(book.getName().equals(name)){
                book.setBorrow(true);
                System.out.println("借阅成功");
                return;
            }
        }
        System.out.println("没有这本书");
    }
}

查找图书

public class FindOperation implements IOperation{
    @Override
    public void work(Bookshelf bookshelf) {
        System.out.println("查找图书");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入图书的名字:");
        String name = sc.nextLine();
        int num = bookshelf.getNum();
        for (int i = 0; i < num; i++) {
            Book book = bookshelf.getBooks(i);
            if(book.getName().equals(name)){
                System.out.println("找到了这本书");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有这本书");
    }
}

删除图书

public class DelOperation implements IOperation{
    @Override
    public void work(Bookshelf bookshelf) {
        System.out.println("删除图书");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入图书的名字:");
        String name = sc.nextLine();
        int num = bookshelf.getNum();
        for (int i = 0; i < num; i++) {
            Book book = bookshelf.getBooks(i);
            if(book.getName().equals(name)){
                for(int j = i; j < num; j++){
                    bookshelf.setBooks(j,bookshelf.getBooks(j+1));
                }
                bookshelf.setNum(bookshelf.getNum()-1);
                System.out.println("删除成功");
                return;
            }
        }
        System.out.println("没有这本书");
    }
}

归还图书

public class ReturnBook implements IOperation{
    @Override
    public void work(Bookshelf bookshelf) {
        System.out.println("归还图书");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入图书的名字:");
        String name = sc.nextLine();
        int num = bookshelf.getNum();
        for (int i = 0; i < num; i++) {
            Book book = bookshelf.getBooks(i);
            if(book.getName().equals(name)){
                book.setBorrow(false);
                System.out.println("归还成功");
                return;
            }
        }
        System.out.println("没有此书");
    }
}

退出系统

public class ExitOperation implements IOperation{
    @Override
    public void work(Bookshelf bookshelf) {
        System.out.println("退出程序");
        System.exit(0);
    }
}

显示全部图书

public class ShowOperation implements IOperation{
    @Override
    public void work(Bookshelf bookshelf) {
        System.out.println("显示全部图书信息");
        int num = bookshelf.getNum();
        for (int i = 0; i < num; i++) {
            Book book = bookshelf.getBooks(i);
            System.out.println(book);
        }
    }
}

以上就是我们操作类包里面的所有类,下面就看一下我们主函数如何使用这些类来实现图书管理系统:

public class Main {
    public static User login() {
        System.out.println("请输入你的姓名:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        System.out.println("请输入你的身份:1 -》 管理员  2 -》 普通用户");
        int choice = sc.nextInt();
        if(choice == 1){
            return new Admin(name);
        }
        else {
            return new Reader(name);
        }
    }

    public static void main(String[] args) {
        Bookshelf bookshelf = new Bookshelf();
        User user = login();
        while (true){
            while(true){
                int choice = user.menu();
                user.doOperation(choice,bookshelf);
            }
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基础版图书管理系统(Java实现) 的相关文章

  • 如何将变量的全部内容发送/导出到文本文件/xml 文件/剪贴板?

    我想将实例的内容 最好以树形形式 发送给某人 打印屏幕是不行的 因为类太复杂了 您需要将输出转回实例吗 在这种情况下 其他答案都是正确的 如果您只想手动检查实例的内容 理想情况下您的类都将实现toString 你可以将其重定向到一个文件 如
  • Quarkus 不以编程方式选择 bean

    我试图以编程方式选择 bean 但 quarkus 不会注入 bean 并引发异常 不支持吗 public enum ReportType ONE TWO Qualifier Retention RUNTIME Target METHOD
  • GET 请求的 Spring 注解

    这两种spring GET方法有什么区别呢 哪一种是首选方法 Component Scope request Path public class TestComponent GET Path hello public String prin
  • 如何在Java中优雅地处理SIGKILL信号

    当程序收到终止信号时如何处理清理 例如 我连接到一个应用程序 希望任何第三方应用程序 我的应用程序 发送finish注销时的命令 发送该信息最好说什么finish当我的应用程序被破坏时的命令kill 9 编辑1 kill 9无法被捕获 谢谢
  • 迁移到Java 9或更高版本时是否需要切换到模块?

    我们目前正在从 Java 8 迁移到 Java 11 但是 升级我们的服务并没有我们预期的那么痛苦 我们基本上只需要更改我们的版本号build gradle文件和服务都顺利启动并运行 我们升级了库以及使用这些库的 微 服务 到目前为止没有问
  • 使用 JSch 分别为各个提示提供输入

    问题是 SSH 连接需要在常规登录后提供另一个用户 ID 和密码信息 我正在使用 JSch 连接到远程服务器 它接受以下形式的输入InputStream 和这个InputStream只能通过一次 由于会话是交互式的 这会导致问题 我尝试将输
  • OpenNLP 与斯坦福 CoreNLP

    我一直在对这两个包进行一些比较 但不确定该往哪个方向走 我简单地寻找的是 命名实体识别 人 地点 组织等 性别识别 一个不错的训练 API 据我所知 OpenNLP 和斯坦福 CoreNLP 提供了非常相似的功能 然而 Stanford C
  • 使用 JAX-WS 的 WebLogic 中没有模式导入的单个 WSDL

    如何使用 JAX WS 配置由 WebLogic 10 3 6 生成的 Web 服务 以将对象架构包含在单个 WSDL 文件声明 而不是导入声明 中 示例代码 界面 import javax ejb Local Local public i
  • 当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer

    简短的问题 有没有办法强制无状态 EJB 调用的 POJO 存在于 EJB 的上下文中 以便事务和资源注入可以在 POJO 中工作 具体来说 在我想要做的事情的上下文中 如何在 EJB 的事务中包含 POJO JMS 生产者 该生产者在调用
  • 在 Junit 测试中使用 ReflectionTestUtils.setField()

    我是 JUnittesting 的新手 所以我有一个问题 谁能告诉我为什么我们使用ReflectionTestUtils setField 在我们的 Junit 测试示例中 正如评论中提到的 java 文档很好地解释了用法 但我还想给你们举
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 更改 JComboBox 中滚动条的大小

    有谁知道如何手动更改 jComboBox 中的滚动条大小 我已经尝试了一大堆东西 但没有任何效果 好吧 我明白了 您可以实现 PopUpMenuListener 并使用它 public void popupMenuWillBecomeVis
  • 如何使用 swagger-codegen-plugin (maven) 生成客户端代码?

    我需要使用 swagger codegen plugin for maven 在 eclipse 中生成服务器存根代码 你能帮忙怎么做吗 以及需要什么配置 在 pom xml 中 我找到了这个答案 您只需要像下面这样更改 pom xml 即
  • 多线程——更快的方法?

    我有一堂有吸气剂的课程getInt 和一个二传手setInt 在某个领域 比如说领域 Integer Int 一个类的一个对象 比如说SomeClass The setInt 这里是同步的 getInt isn t 我正在更新的值Int来自
  • Android项目中使用java获取电脑的IP地址

    我在用ksoap2 android http code google com p ksoap2 android 我需要使用java获取IP地址 这样我就不必每次都手动输入它 我所说的 IP 地址是指 例如 如果我这样做ipconfig使用命
  • android 中的 java.net.URL ..新手问题

    我是java新手 正在尝试android开发 以下代码生成 malformedURLException 有人可以帮助我识别异常吗 任何提示都会非常有帮助 package com example helloandroid import and
  • java中的预增量/后增量

    有人可以帮助我理解为什么 int i 1 int j 1 int k 1 int l 1 System out println i i System out println j j System out println k k System
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和
  • java.lang.ClassCastException:com.sun.proxy.$Proxy8 无法转换为 org.openqa.selenium.internal.WrapsDriver

    我有以下切入点和 AspectJ 中给出的建议 Pointcut call org openqa selenium WebElement sendKeys public void onWebElementAction After onWeb
  • 将数组值导出到 csv 文件 java

    我只需要帮助将数组元素导出到 csv 文件 我不知道我的代码有什么问题 任何帮助将不胜感激 谢谢 for int index 0 index lt cols length index FileWriter fw new FileWriter

随机推荐

  • 基于深度学习的语义分割之FCN、SegNet、UNet、LinkNet、PSPNet、DeepLab系列

    图像分割 Image Segmentation 是计算机视觉研究中的一个经典难题 也是图像理解领域关注的一个热点 在场景理解 医学图像分析 机器人感知 视频监控 增强现实 图像压缩等领域有着广泛的应用 图像分割 简单来说就是在图像中把目标从
  • linux下wifi编程(基于netlink和nl80211.h)

    http blog csdn net vichie2008 article details 37520325
  • Mac系统(Linux系统) 当不知道MySql的root密码时候, 重置root密码

    1 首先打开终端 进入MySQL的安装目录下的bin文件夹 如 usr local mysql bin 2 执行以下命令以无密码方式登录MySQL mysql u root 3 进入MySQL后 选择mysql数据库 use mysql 4
  • QT信号与槽的自动连接

    信号与槽的自动连接 信号与槽可以通过使用手写代码显式的实现关联 也可以运用 QMetaObject 类规定的槽 函数命名范式来实现自动关联 显式关联 首先我们来看一下 不使用 自动关联规则 的情形 在下面这段代码里面 我们定义了一个对话框类
  • 48、Flutter之widgets LayoutBuilder组件

    LayoutBuilder 通过 LayoutBuilder 我们可以在布局过程中拿到父组件传递的约束信息 然后我们可以根据约束信息动态的构建不同的布局 比如我们实现一个响应式的 Column 组件 ResponsiveColumn 它的功
  • jquery筛选器

    在Web应用程序中 大部分的客户端操作都是基于对象的操作 要操作对象就必须先获取对象 jQuery提供了强大的选择器让我们获取对象 我人为地将jQuery选择器分为两大部分 选择对象和筛选条件 选择对象表示要获取什么对象 筛选条件是对获取的
  • # 2023 好用免费图床推荐

    1 聚合图床 该免费图床由来已久 稳定运行多年 满足多种个性化需要 可以说该图床是所有推荐当中最为灵活 扩展性最强图床 支持水印设置 防盗链设置 甚至还可以统计数据量大小 有普通用户和付费用户区分 付费用户自定义功能将更加强大 就个人而言
  • Spring Cloud Config配置服务及那些你不知道的坑

    目录 1 为什么选择Spring Cloud Config 1 1 集中式管理 1 2 动态修改配置 2 Spring Cloud Config 简介 3 服务端配置 3 1 添加依赖 3 2 开启服务注册 3 3 添加YML配置 3 4
  • springboot结合aop和pagehelper实现分页筛选排序功能

    一 前言 首先我们要知道什么是aop 什么是pagehelper 从而我们知道 pagehelper的实现其实是两行代码 PageHelper startPage pageNum pageSize 开始分页 PageInfo pageInf
  • Python中class的内置函数__str__

    Python中class的内置函数 str 一 说明 init 类实例初始化函数 str 类实例字符串化函数 二 示例1 1 2 3 4 5 6 class Fri
  • Java并发编程学习2-线程安全性

    Java并发编程学习系列 线程安全性 引言 1 什么是线程安全性 1 1 如何编写线程安全的代码 1 2 线程安全类 1 3 无状态对象 2 原子性 2 1 竞态条件 2 2 延迟初始化 2 3 复合操作 3 加锁机制 3 1 内置锁 3
  • 华为OD机试 - 根据某条件聚类最少交换次数(Java)

    目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 给出数字K 请输出所有结果小于K的整数组合到一起的最少交换次数 组合一起是指满足条件的数字相邻 不要求相邻后在数组中的位置 数据范围 100 lt K lt 100 1
  • 编写程序,生成一个包含50个随机整数的列表,然后删除奇数

    可以这样编写程序 list for i in range 50 list append random randint 1 100 for num in list if num 2 0 list remove num print list
  • latex入门学习笔记总结

    目录 latex文件的组织方式 latex中的字符 latex中的强调 latex中的分页和断行 latex中文档元素 latex的环境 列表环境 代码环境 htbp 命令 latex中的表格 latex中的图片 插入一张图片 两图并排 插
  • linux指令timedatectl,centos7设置时间命令timedatectl

    在新的centos7里 关于时间的指令除了保留了之前版本中常用到的date hwclock等命令外 还增加了一个统一的命令timedatactl 下面结合其用法进行下小结 查看 timedatectl 指令用法帮助 root 361way
  • WPF自学篇--第一篇--Hello world

    主要知识点为 1 WPF如何修改启动页面 2 如何写Hello Word Sample 内容 1 由于专案是先加window wpf想加web wpf是调试找启动页面找了很久 终于发现在app config中Application下 Sta
  • python LeetCode 88 刷题记录

    题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums1 中 使合并后的数组同样按 非递减顺序 排列 注意
  • 修改Windows系统注册表并使其立即生效

    title 修改Windows系统注册表并使其立即生效 update 2019 12 22 15 38 06 description 修改Windows系统注册表并使其立即生效的方法 原文地址https tomsworkspace gith
  • 日常生活中常用的五星级句子

    1 After you 你先请 这是一句很常用的客套话 在进 出门 上车得场合你都可以表现一下 好象现在女士不愿意你这么做 特别是那些女权主义者 我还记得这么一段话 一个女士对一个让她先行的男士说 you do this because i
  • 基础版图书管理系统(Java实现)

    文章目录 前言 一 设计书类 书架类 二 设计用户类 1 管理员 2 普通用户 三 操作包 前言 对于图书管理系统我想大家都不会陌生 在C语言的学习中相信大家都写过这个系统 那么今天我们就用Java来实现一下图书管理系统 看看和C语言又有什