Java 从零开始写一个简单的图书管理系统

news2024/11/25 4:21:58

了解一下

先来了解要实现一个怎样的图书管理系统

从中可以看到有操作的 使用者不同 的 功能

而不同的使用者有不同的 菜单

那要如何实现呢?

请继续看下去

如何实现

首先了解我们 需要什么

图书系统需要 ,放书的 书架 ,用户 中有 管理员普通用户,以及 实现功能

也就是说

:书 书架

用户:管理员 普通用户

操作功能:管理员功能 普通用户功能

1.书

写一个书类,创建它的书名,作者,价格,类型,是否借出(boolean类型),全部使用private修饰

创建getset方法获取书的属性

创建构造方法以便之后的传值,boolean类型不需要创建构造方法,boolean默认为false,创建构造方法反而显得繁琐

由于之后需要打印重写一个toString方法

boolean类型的打印为false,可以使用 三元操作条件运算符 来解决

public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                (isBorrowed == true ? " 已借出":" 未借出")+//这里用三元条件运算符可以解决打印出来false和true的问题
//                ", isBorrowed=" + isBorrowed +
                '}';
    }

此时我们的book类就写完了 

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

    //再创建get set方法,以便后续的调用
    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;
    }

    //创建to String方法,便于打印
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                (isBorrowed == true ? " 已借出":" 未借出")+//这里用三元条件运算符可以解决打印出来false和true的问题
//                ", isBorrowed=" + isBorrowed +
                '}';
    }
}

2.书架

写一个书架类,创建一个Book数组,给上合适的空间

创建构造方法用来放书,使书架被创建的时候就能有书

定义当前书的数量useSize

Book数组和useSize创建getset方法

注意:需要再写一个能获取和设置单本书的方法,以便后续需要增加图书和删除图书

到这里我们的书架类也写完了

//书架类
public class BookList {
    //书架类用来放书,new一个书类型的数组,给上合适的空间
    Book[] books = new Book[10];

    //建立一个当前使用数
    private int useSize;
    //给书架创建构造方法,使书一开始就存在于书架
    public BookList() {
        books[0] = new Book("三块钱如何活一个月","Zack",3,"人生哲理");
        books[1] = new Book("如何征服美丽少女","Zack",999,"杂志");
        books[2] = new Book("为什么作者这么帅","Zack",666,"小说");
        this.useSize = 3;
    }

    //创建get 和set 方法便于后续使用
    //这里修改加入参数便于后续获取一本书
    public Book getBook(int pos) {
        return books[pos];
    }
    //这里为了获取全部的书
    public Book[] getBooks() {
        return books;
    }

    //同样设置一本书
    public void setBook(Book books,int pos) {
        this.books[pos] = books;
    }

    public int getUseSize() {
        return useSize;
    }

    public void setUseSize(int useSize) {
        this.useSize = useSize;
    }
}

那么书结束,接下来是用户

用户

1.User类

这里有 普通用户管理员,我们很容易想到利用多态,写一个User抽象类

定义名字

创建构造方法

创建抽象方法menu

注意:这里返回类型需要定义为int类型,以便接收操作值

//由于这个类不能具体指向某个对象,所以定义为抽象类
public abstract class User {
    //想要这个变量被其他类使用,又想要有一点限制使用protected
    protected String name;
    //创建接口的数组,对应接收操作的数字
    protected IOperation[] iOperations;
    //同样创建构造方法

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

    //创建一个menu菜单方法,子类继承的时候会需要续写,设置成int类型方便返回值
    public abstract int menu();

    //实现向下转型
    public void doOperation(int choice, BookList bookList){
        iOperations[choice].work(bookList);
    }

}

2.普通用户

继承父类User,

重写父类构造方法,

重写menu,

由于不同类型的用户的菜单不同,所以需要根据不同用户的功能设计

从输入2开始就是进入了系统,那么根据需要设计想要实现的样子,这里仅供参考

public int menu() {
            System.out.println("-----欢迎 "+this.name+" 来到图书管理系统-----");
            System.out.println("-----普通用户菜单-----");
            System.out.println("1.查找图书");
            System.out.println("2.借阅图书");
            System.out.println("3.归还图书");
            System.out.println("0.退出系统");
            System.out.println("-------------------");
            System.out.println("请输入你的操作->...");
            Scanner scanner = new Scanner(System.in);
            int choice = scanner.nextInt();
            return choice;
    }

那么管理员也是同理,只需要修改需要的功能 

到这里我们的用户类完成

接下来是写一个主类运行

主类

可以看到运行时优先出来的是要求输入姓名和身份

那么可以设置为静态方法

1.login静态方法

按照想要的要求来实现,这里的返回值设置成User方便之后接收返回值

具体实现

 //构造静态方法,一开始执行就会运行这个方法
    public static User login(){//这里把返回类型设置成User,这样不论是什么类型都可以接收
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        String name = scanner.nextLine();
        System.out.println("请输入你的身份:");
        System.out.println("1. 管理员   2. 普通用户");
        int choice = scanner.nextInt();
        if (choice == 1){
            return new Admin(name);
        }else {
            return new Normal(name);
        }
    }

先创建一个书架对象,使书架里有

创建一个User对象,接收login方法的传来的值

用User创建的对象调用子类的方法,这样就形成了多态

具体实现

BookList bookList = new BookList();
        //用User类型来接收就可以形成多态
        User user = login();
//用一个choice来接收返回的操作值
            int choice = user.menu();

这里还可以写一个循环让菜单一直出现直到退出系统

接下来是操作方法的实现

操作方法

可以实现一个操作方法的接口,这样所有实现这个接口的类都需要重写它的方法,便于调用

由于操作的是书架所以需要输入书架的值 

//创建接口使实现接口的子类都需要实现方法,注意这里要操作的是书架所以参数是BookList。。。。
public interface IOperation {
    void work(BookList bookList);
}

 把要创建的方法实现这个接口,重写work方法

例如这种

public class ExitOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统-----");
        exit(0);
    }
}

这样就完成了操作方法

(本文章仅搭建一个框架,不包含功能的实现,功能的实现我会单独放在一篇文章)

如何调用方法

既然通过数字来确定操作方法,不如直接创建一个接口的数组,把操作方法放到数组里

那么首先在User类里创建一个接口的数组ioperations,这样子类会继承

//创建接口的数组,对应接收操作的数字
    protected IOperation[] iOperations;

而管理员和普通用户的方法不同,数组就需要放入不同的值

形如,放到构造方法中同样创建就会执行

iOperations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DeleteOperation(),
                new ShowOperation()
        };

调用的时候就再在User类中写一个调用的doOperation

参数放入书架BookList booklist 和下标pos

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

在主类中调用后就将框架实现了

public class Main {
    //构造静态方法,一开始执行就会运行这个方法
    public static User login(){//这里把返回类型设置成User,这样不论是什么类型都可以接收
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        String name = scanner.nextLine();
        System.out.println("请输入你的身份:");
        System.out.println("1. 管理员   2. 普通用户");
        int choice = scanner.nextInt();
        if (choice == 1){
            return new Admin(name);
        }else {
            return new Normal(name);
        }
    }

    public static void main(String[] args) {
        BookList bookList = new BookList();
        //用User类型来接收就可以形成多态
        User user = login();


        //写一个死循环让菜单循环
        while(true){
            //用一个choice来接收返回的操作值
            int choice = user.menu();

            //利用这个返回的操作值来进行下一步
            user.doOperation(choice,bookList);
        }

    }
}

梳理运行步骤

首先主类的login方法会优先执行,返回一个类型

然后根据返回的类型调用方法

接收操作值之后就找到操作方法类并调用work方法

这里只是实现一个框架,功能的实现会放到下一篇文章

若有不足请及时指正

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

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

相关文章

Nutch爬虫在大数据采集中的应用案例

引言 在当今信息爆炸的时代,大数据的价值日益凸显。网络作为信息的海洋,蕴藏着丰富的数据资源。Nutch,作为一个开源的Java编写的网络爬虫框架,以其高效的数据采集能力和良好的可扩展性,成为大数据采集的重要工具。本文…

系统烧写工具--MfgTool

系统烧写工具--MfgTool 1 介绍1.1 概述1.2 UUU 特性1.3 UUU 功能1.4 UUU 命令1.5 MFGTools 功能 2 MFGTools 目录结构及说明2.1 MFGTools 目录结构重要文件烧写自己系统 2.2 说明2.3 分析配置文件2.3.1 UiCfg.ini2.3.2 cfg.ini2.3.3 ucl2.xml 3 MfgTool 工作流程4 烧录流程4.1 …

mysql--安装跳过验证修改密码安全加固

安装mysql 配置mysql的yum源 [rootVM-0-14-rockylinux ~]# tee /etc/yum.repos.d/mysql.repo << EOF > [MYSQL] > namemysql > baseurlhttps://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64 > gpgcheck0 > EOF yum安装mysq…

python项目(课设)——飞机大战小游戏项目源码(pygame)

主程序 import pygame from plane_sprites import * class PlaneGame: """ 游戏类 """ def __init__(self): print("游戏初始化") # 初始化字体模块 pygame.font.init() # 创建游戏…

eclipse中svn从分支合并到主干及冲突解决

1、将分支先commit&#xff0c;然后再update&#xff0c;然后再clean一下&#xff0c;将项目多余的target都清理掉。 2、将branches切换到trunk 3、工程上右键-》Team-》合并&#xff08;或Merge&#xff09; 4、默认选项&#xff0c;点击Next 5、有未提交的改动&#xff0c;…

兴顺物流管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;驾驶员管理&#xff0c;物流资讯管理&#xff0c;车辆管理&#xff0c;基础数据管理 员工账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;物流资讯管理&…

尚品汇-(三)

maven之packaging标签 &#xff08;1&#xff09;项目创建父模块 首先设置 下Maven Maven&#xff1a;仓库地址&#xff1a;这里是腾讯云仓库 作为父模块&#xff0c;src没用&#xff0c;干掉src 这里我们是Maven创建的项目&#xff0c;想要项目变成SpringBoot的项目&#xf…

Mybatis 系列全解(1)——全网免费最细最全,手把手教,学完就可做项目!

Mybatis 系列全解&#xff08;1&#xff09; 1. 第一个小程序2. CURD 增删改查3. 模糊查询4. 配置解析4.1 核心配置文件4.2 环境配置4.3 属性4.4 类型别名4.5 设置4.6 映射器 mappers 1. 第一个小程序 1&#xff09;创建一个数据库&#xff0c;一个表&#xff0c;填入一些数据…

uni app 树状结构数据展示

树状数据展示&#xff0c;可以点击item 将点击数据给父组件 &#xff0c;满足自己需求。不喜勿喷&#xff0c;很简单可以根据自己需求改哈&#xff0c;不要问&#xff0c;点赞收藏就好。其实可以和上一篇文章uni app 自定义 带popup弹窗的input组件-CSDN博客结合使用&#xff…

LabVIEW项目管理中如何平衡成本、时间和质量

在LabVIEW项目管理中&#xff0c;平衡成本、时间和质量是实现项目成功的关键。通过制定详细的项目计划、合理分配资源、严格控制进度、进行质量保证和灵活应对变化&#xff0c;项目管理者可以有效地协调这三者的关系&#xff0c;确保项目按时、按质、按预算完成。 1. 制定详细…

Reid系列论文学习——换装Reid

今天要学习的有关Reid的论文是2019年提出的一篇名为&#xff1a;Beyond Scalar Neuron: Adopting Vector-Neuron Capsules for Long-Term Person Re-Identification. 论文链接&#xff1a;https://opus.lib.uts.edu.au/bitstream/10453/137156/4/Binder1.pdf Code链接&#x…

搜索python包的说明

当我发现bug时&#xff0c;就怀疑是sns包的版本问题了&#xff08;原代码是原作者以前成功运行的代码&#xff09;&#xff0c;于是直接到网上搜&#xff0c;找到对应的说明文档 根据该示例代码进行改写&#xff1a; 达成目的。

Elasticsearch 数据提取 - 最适合这项工作的工具是什么?

作者&#xff1a;来自 Elastic Josh Asres 了解在 Elasticsearch 中为你的搜索用例提取数据的所有不同方式。 对于搜索用例&#xff0c;高效采集和处理来自各种来源的数据的能力至关重要。无论你处理的是 SQL 数据库、CRM 还是任何自定义数据源&#xff0c;选择正确的数据采集…

2024年全国青少信息素养大赛python编程复赛集训第八天编程题分享

整理资料解析答案非常不容易,感谢各位大佬给个点赞和分享吧,谢谢 今天题目较难:适合初中组 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准函…

进程、线程的区别

进程、线程的关系 开工厂生产手机&#xff0c;制作一条生产线&#xff0c;这个生产线上有很多的器件以及材料。一条生产线就是一个进程。 只有生产线是不够的&#xff0c;使用找五个工人来进行生产&#xff0c;这个工人能够利用这些材料最终一步步的将手机做出来&#xff0c;这…

上位机图像处理和嵌入式模块部署(mcu之静态库生成和使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多同学做了很长时间的mcu和keil开发&#xff0c;都认为keil工程中必须包含所有的源代码&#xff0c;其实这是不对的。如果有一些代码我们不希望别…

C#.net6.0+Vue+Ant-Design智慧医院手术麻醉系统源码 手术麻醉软件信息化管理系统 麻醉文书祥解

C#.net6.0VueAnt-Design智慧医院手术麻醉系统源码 手术麻醉软件信息化管理系统 麻醉文书祥解 医护人员通过手麻信息系统可以进行手术的预约申请、受理、安排&#xff0c;从门诊医生下医嘱到发起手术申请、护士长审核通过&#xff0c;均实现了全流程信息化管理&#xff0c;大大…

内容安全复习 4 - 深度生成模型

文章目录 概述经典算法自回归模型&#xff08;Autoregressive model&#xff09;变分自编码器&#xff08;VAE&#xff09;生成对抗网络&#xff08;GAN&#xff09;扩散模型&#xff08;Diffusion model&#xff09;总结 应用 概述 深度生成模型是一类使用深度学习技术构建的…

【第25章】Vue实战篇之用户登出

文章目录 前言一、后端代码二、前端代码1.接口调用2.界面代码3.事件代码 三、效果总结 前言 这里来演示用户登出。 一、后端代码 /*** 登出* param token token* return Result*/RequestMapping("logout")public Result logout(RequestHeader("Authorization&…

【Python】从基础到进阶(一):了解Python语言基础以及变量的相关知识

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、Python简介1.1 历史背景1.2 设计哲学1.3 语言特性1.4 应用场景1.5 为什么选择Python 二、Python语言基础2.1 注释规则2.1.1 单行注释2.1.2 多行注释2.1.3 文件编码声明注释 2.2 代码缩进2.3 编码规范2.3.1 命名规范…