《Java》图书管理系统

news2025/2/26 9:28:33

         这是一个对于Java中知识点的类,抽象类,封装,继承,多态,接口等进行的一个简单的代码练习,对于实际的图书管理系统还需要一点的优化

目录

前言

效果展示

 功能模块

书架

定义书的类

 创建书架

 用户

User用户类

AdminUser管理员

NormalUser普通用户 

 功能

接口

FindOperation 查找图书

 AddOperation添加图书

 DelOperation删除图书

BorrowOperation借阅图书 

DisOperation 打印图书 

 RetOperation归还图书

 ExitOperation退出系统

 整合

 总结


前言

效果展示

我们先来看看效果

首先是我们的管理员端:

 再下是我们的普通用户端:

 功能模块

 我们先试着模块化出来功能合计

1.简单的登录

2.管理端

  ·查阅图书

  ·增加图书

  ·删除图书

  ·打印图书

  ·退出系统

3.用户端

  ·查阅图书

  ·借阅图书

  ·归还图书

  ·退出

 我们先将类中的功能创建好 

 IOperation为我们所有功能的接口 很多童鞋就疑惑为何要这么做,我们直接将其定义到一个类中不可以吗,答案是可以的!,但是我们为了链接知识点 所以将其进行分化!

书架

定义书的类

我们先来定义一个书的类,首先一本书有书名、作者、价格、类型以及是否已被借出

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

​

因为这些都是private类型 所以我们还需要提供一个方法来提供给使用者来调用

教大家快捷方法为Alt+Insert

 

​
  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 isBorrwed() {
        return isBorrwed;
    }

    public void setBorrwed(boolean borrwed) {
        isBorrwed = borrwed;
    }

    @Override
    public String toString() {
        return "book{" +
                "  书名='" + name + '\'' +
                ", 作者='" + author + '\'' +
                ", 价格=" + price +
                ", 类型='" + type + '\'' +
                ((isBorrwed==true)?", 已被借出":", 未被借出") +
                '}';
    }

​

 创建书架

 我们创建一个BookList类当做书架,用来存放我们的书籍

​
public class BookList {
    private Book[] books=new Book[10];
    private int BookSize;
    public  BookList(){
        books[0]=new Book("三国演义","罗贯中",17,"小说");
        books[1]=new Book("西游记","吴承恩",47,"小说");
        books[2]=new Book("水浒传","施耐庵",37,"小说");
        this.BookSize=3;
    }

    public int getBookSize() {
        return BookSize;
    }

    public void setBookSize(int bookSize) {
        BookSize = bookSize;
    }

    /**
     * 获取到pos位置的一本书
     * @param pos
     * @return
     */
    public Book getpos(int pos){
        return books[pos];
    }

    /**
     * 新加入一本书
     * @param pos
     * @param book
     */
    public void setBooks(int pos,Book book){
        this.books[pos]=book;
    }
}

​

 我们现在可以看到已经对书架进行了初始化,现在书架上的书有三国演义、西游记、水浒传

 用户

User用户类

我们要使用User来实现多态继承

public abstract class User {
    protected String name;
    protected IOperation[] iOperations;

    public User(String name){
        this.name=name;
    }
    public abstract int menu();

    public void dowork(int choice, BookList bookList){
        iOperations[choice].work(bookList);
    }
}

AdminUser管理员

管理员要实现的功能为查找、新增、删除、打印、退出系统

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("=======管理员菜单=======");
        System.out.println("Hai!"+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);
        return scanner.nextInt();
    }
}

 AdminUser类继承了User用户类,并且实现了管理员对应的功能

NormalUser普通用户 

 普通用户要实现的功能为查找、借阅、归还、退出系统

public class NormalUser extends User {
    public NormalUser(String name){
        super(name);
        this.iOperations =new IOperation[]{
                new Exitoperation(),
                new Findoperation(),
                new Borrowoperation(),
                new Retoperation()

        };
    }
    public int menu(){
        System.out.println("=======用户菜单=======");
        System.out.println("Hai!"+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);
        return scanner.nextInt();
        }
    }

 功能

接口

public interface IOperation {
    Scanner scanner=new Scanner(System.in);

    public void work(BookList bookList);
}

FindOperation 查找图书

 我们此功能实现是非常简单的,保存好用户要查找的图书并且使用类name.equals()来查找图书即可

public class Findoperation implements IOperation{
    public void work(BookList booklist) {
        System.out.println("查找图书");
        System.out.println("请输入你要查找的书名");
        String name=scanner.nextLine();
        int size=booklist.getBookSize();
        for (int i = 0; i < size; i++) {
            Book book= booklist.getpos(i);
            if(name.equals(book.getName())){
                System.out.println("找到了你要查找的书 信息如下");
                System.out.println(book);
                return ;
            }
        }
        System.out.println("没有找到你要查找的书");
    }
}

 AddOperation添加图书

我们要给已存在的书架加入一本书,将新书存放到顺序表之后即可

public class Addoperation implements IOperation{
    public void work(BookList booklist) {
        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);
        int size=booklist.getBookSize();
        booklist.setBooks(size,book);
        booklist.setBookSize(++size);
        System.out.println("新增图书成功");
    }
}

 需要注意的地方是我们一定要切记添加图书后记得要改变bookSize的值

 DelOperation删除图书

此功能的实现与查找类似,在查找的基础上增加了删除,需要用到的知识点为顺序表的删除,删除需要将后续的书前移,并且将最后一个置为 空

public class Deloperation implements IOperation{
    public void work(BookList booklist) {
        System.out.println("删除图书");
        System.out.println("请输入要删除的图书的名字");
        String name=scanner.nextLine();
        int size= booklist.getBookSize();
        for (int i = 0; i < size; i++) {
            Book book= booklist.getpos(i);
            if(name.equals(book.getName())){
                while(i<size-1){
                    Book tmp=booklist.getpos(i+1);
                    booklist.setBooks(i,tmp);
                    i++;
                }
                booklist.setBooks(size,null);
                booklist.setBookSize(size-1);
                System.out.println("删除成功");
                return ;
            }
        }
        System.out.println("没有找到你要删除的图书");
    }
}

 切记将书架的最后一位置为空避免泄露,需要注意到的还是要将bookSize的值进行修改

BorrowOperation借阅图书 

首先利用查找的原理找到我们要寻找的书,找到后修改其状态即可

public class Borrowoperation implements IOperation {
    public void work(BookList booklist) {
        System.out.println("借阅图书");
        System.out.println("请输入你要借的书名");
        String name=scanner.nextLine();
        int size=booklist.getBookSize();
        for (int i = 0; i <size ; i++) {
             Book book=booklist.getpos(i);
            if(name.equals(book.getName())){
                book.setBorrwed(true);
                System.out.println("借阅成功!");
                System.out.println(book);
                return ;
            }
        }
        System.out.println("没有此书");
    }
}

需要注意的是记得将要借阅的书类型修改为true 

DisOperation 打印图书 

按照顺序表原理依次打印即可

public class Displayoperation implements IOperation{
    public void work(BookList booklist) {
        System.out.println("打印图书");
        int size= booklist.getBookSize();
        for (int i = 0; i < size; i++) {
            Book book= booklist.getpos(i);
            System.out.println(book);
        }
    }
}

 RetOperation归还图书

 首先要查找书库是否存在此书,如果存在将其类型修改为false

public class Retoperation implements IOperation{
    public void work(BookList booklist) {
        System.out.println("归还图书");
        System.out.println("请输入你要归还的书名");
        String name=scanner.nextLine();
        int size=booklist.getBookSize();
        for (int i = 0; i <size ; i++) {
            Book book=booklist.getpos(i);
            if(name.equals(book.getName())){
                book.setBorrwed(false);
                System.out.println("归还成功!");
                System.out.println(book);
                return ;
            }
        }
        System.out.println("没有此书");
    }

}

 ExitOperation退出系统

退出系统

public class Exitoperation implements IOperation{
    public void work(BookList booklist) {
        System.out.println("退出系统");
        System.exit(0);
    }
}

 整合

我们需要使用Main来将所有的功能进行串联

public class Main {
    public static User login(){
        System.out.println("请输入你的姓名");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.next();
        System.out.println("请输入你的身份 1--》管理员 0--》普通用户");
        int choice=scanner.nextInt();
        if(choice==1){
            return new AdminUser(name);
        }else if(choice==0) {
            return new NormalUser(name);
        }
        else {
            System.out.println("输入错误,退出系统");
            return null;
        }
    }
    public static void main(String[] args) {
        BookList bookList=new BookList();
        User user=login();//发生了向上转型
        while(true){
        int choice=user.menu();//发生了动态绑定 多态
        //根据choice调用合适的操作
        user.dowork(choice,bookList);
    }
    }
}

 我们来看一下代码写完之后的所有文件

 总结

我们现在实现的还是比较简易的,后期将结合MySQL来进行优化,并且在代码实现中也有很多业务上的处理没有实现,后期将会进行修正,感谢大家的支持

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

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

相关文章

黑马点评--优惠卷秒杀

黑马点评–优惠卷秒杀 全局ID生成器&#xff1a; 是一种在分布式系统下用来生成全局唯一ID的工具&#xff0c;一般要满足下列特性&#xff1a; 为了增加ID的安全性&#xff0c;我们可以不直接使用Redis自增的数值&#xff0c;而是拼接一些其它信息&#xff1a; Redis自增ID策…

CentOS7安装MySQL8

文章目录一 前言二、Centos 7 安装 mysql8 步骤&#xff1a;1.下载MySQL官方的 Yum Repository2.安装方法一&#xff1a; 用wget 下载后安装方法二&#xff1a;下载 RMP 软件包将该软件包上传到 Linux 服务器&#xff0c;并安装。3.Navicate 远程连接配置一 前言 最近在自己的…

Python 入门基础

第一个Python程序之打印 Hello World! print("Hello World!")字符串定义的三种方式&#xff0c;type 用了检测数据类型 # 单引号定义法&#xff0c;使用单引号进行包围 name 测试 print(type(name)) # 双引号定义法 name "测试" print(type(name)) # 三…

vue3+ts组件练习(defineExpose defineEmits defineProps)

学习关键语句&#xff1a; vue3ts 组件写法 写在前面 进化到 vue3 ts 的时代&#xff0c;vue的不少语法发生了改变&#xff0c;尤其是选项式 API 变为了组合式 API 和 typescript 的使用使得从 vue2 过来的人需要尽快熟悉新的写法&#xff0c;毕竟大差不差嘛 文章最后有本文…

图像分割 - 阈值处理 - 全局阈值处理

目录 1. 介绍 2. 代码实现 3. 代码讲解 1. 介绍 当目标和背景像素的灰度分布非常不同的时候&#xff0c;可以对整个图像使用全局阈值 在大多数的应用中&#xff0c;图像之间通常存在足够的变化&#xff0c;全局阈值是一种合适的办法。所以&#xff0c;需要一种对图像做阈值…

生存分析的图你也要拼接 图形拼接r 不同的图形组合在一起

生存分析的图你也要拼接吗 因为都是ggplot体系的图表,很容易拼接,但是里面的生存分析是一个麻烦事情。因为它本身主要是survminer包出图,而这个survminer包出图并不是很稳定,但是学员自己解决了这个问题。 可以先用survminer包的arrange_ggsurvplots函数对多个生存分析图表…

CUDA By Example(五)——常量内存与事件

本章将介绍如何使用GPU上特殊的内存区域来加速应用程序的执行&#xff0c;以及如何通过事件来测量CUDA应用程序的性能。通过这些测量方法&#xff0c;你可以定量的分析对应用程序的某个修改是否会带来性能提升 文章目录常量内存光纤跟踪简介在GPU上实现光线跟踪通过常量内存来实…

[附源码]java毕业设计家庭医生系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Java代码审计——WebGoat XML外部实体注入(XXE)

目录 前言&#xff1a; 0x01 Let’s try 0x02 代码分析 2.1 安全的代码 0x03 Modern REST framework 3.1 解题&#xff1a; 3.2 改为xml格式: 3.3 源码分析&#xff1a; 3.4 参考解决方案 0x04 Blind XXE assignment 0x05XXE DOS attack 参考文章&#xff1a; 前言…

“百花齐放、百家争鸣”,数据可视化呈现我国科学文化的发展

公共财政对文化建设的支持日益加强&#xff0c;公共文化设施不断完善&#xff0c;覆盖城乡的公共文化服务网络初步建立&#xff0c;公共文化服务理念逐步深化&#xff0c;公共文化服务能力和均等化水平逐渐提高&#xff1b;文化产业投资向发展水平较低的中西部地区倾斜&#xf…

node.js+Express框架,前端自己创建接口

目录 一、安装 1、安装node.js 2、安装Express框架 3、安装nodemon 二、写接口 三、连接数据库 1、安装&#xff1a; 2、连接数据库 3、执行 四、注意事项 1、跨域 这篇文章看完如果您觉得有所收获&#xff0c;认为还行的话&#xff0c;就点个赞收藏一下呗 一、安装…

多线程详细介绍

一、分类 创建线程的四种方法&#xff1a; &#xff08;1&#xff09;继承Thread &#xff08;2&#xff09;实现Runnable &#xff08;3&#xff09;实现Callable &#xff08;4&#xff09;线程池创建一个新的线程可以通过继承Thread类或者实现Runnable接口来实现&#xff0…

JAVA基础—面向对象

1、面向对象介绍 2、类和对象 2.1、如何定义类、得到类的对象、使用对象 2.2、类和对象的总结 2.3、定义类的补充事项—测试类与Javabean类 成员变量一般无需指定初始值&#xff0c;存在默认值。 但是局部变量必须定义初始值。 2.4、定义类的注意事项 2.4.1、驼峰模式 单词…

容器docker安装,以及paddle容器环境安装

例如 一台新的 服务器部署环境 1.环境服务器部署 第一步:查看显卡的驱动是否装好了,可以用nvidia-smi,正常显示表示已经安装 上面版本没有问题,但是下面版本驱动本本比较低,不支持11.2cuda安装,要更新驱动 docker, nvidia-docker 安装之前先确认如下三个 paddle 2.3 …

Win11 KB5019157(22000.1281)11月累积补丁推送了!

微软在最新推出的KB5019157更新补丁中修复了Microsoft Store更新等多个错误&#xff0c;但是仍然存在Direct Access问题。Win11用户安装之后即可升级至22000.1281&#xff0c;下面就来看看详细内容。 重要信息 KB5019157累积更新补丁 它解决了 Microsoft Store 的一些持续更新失…

shell中通配符的使用

shell中的通配符与正则表达式是不同的两种功能。 正则表达式一般不会在bash直接应用&#xff0c;需要使用sed、grep、awk来解释正则表达式。 通配符则可以通过bash直接解释&#xff0c;一般用作名称展开。 bash中可以使用的通配符符号包括&#xff1a;*、?、{}、[]、^ 这些…

【环境配置笔记】基于clang15搭建liunx内核代码阅读环境

环境&#xff1a; Toolchain&#xff08;yocto导出&#xff09;Linux5-15&#xff0c;arm64VS codeclangd15.0.3 1. VScode配置 在VS code / VS code server中配置以下插件&#xff1a; ClangdC/CC/C Extension PackC/C SnippetsCode RunnerCode Spell CheckercompareitDev…

拖拽页面元素+flip动画的案例

先上效果&#xff1a; 实现思路和流程&#xff1a; 基础页面布局 给每个拖动元素加上 draggable"true"ondragstart(开始拖动某个元素时)做出 对应的处理 获得操作的具体元素 给目标元素添加对应的样式 显示透明 增加虚线描边ondragover 被拖动的元素hover到目标元素…

java计算机毕业设计ssm养老管理系统-敬老院系统

项目介绍 1.登录页面要有验证码 2.在健康信息模块中有三个小模块分别是饮食信息、身体信息、医疗常识,饮食信息就是护工每天负责老人的饮食搭配包括;早中晚餐;各种菜谱、图片、注意事项等,身体信息就是老人的各项身体指标,医疗常识就是每一种病对应一种病例还有每天推送更新的关…

互联网获客经验分享(一)

现在的流量都很贵了。特别是公域的流量。在这样的情况下,我们如何从互联网上获取客户?满足我业务的需求呢。 今天为大家分享基础的方法,后续我们会不定期的分享一些互联网软件获客的经验,希望能够帮助到你。 流量的本质 不管是平台方还是用户,流量都是生命线。在这样的…