Java学习【面向对象综合练习——实现图书管理系统】

news2024/9/25 1:20:08

Java学习【面向对象综合练习——实现图书管理系统】

  • 前期效果
  • 图书的创建
  • 用户的创建
  • 操作的实现
  • 完善操作
    • 显示图书
    • 查找图书
    • 新增图书
    • 借阅图书
    • 归还图书
    • 删除图书

前期效果

在这里插入图片描述
用户分为普通用户和管理员,登录进系统之后可以对图书进行一系列操作,此时我们要明白,对图书的操作是通过书架来执行的,我们平常在图书馆上借书就是在书架上

在这里插入图片描述

图书的创建

接下来我们来创建图书类,对图书的属性进行封装,并写上对应的get和set 方法,

    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isBorrowed;

    public Book() {
    }

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }
    /······get set toString······/

接下来就是创建书架的类,书架上肯定不止一本书,所以这里选择数组来存储多个book对象,因为在一开始就有了一部分书,所以在创建书架的对象时,就要把图书的对象放进去

public class BookList {

    private Book[] books = new Book[10];//用到了组合
    private int usedSize = 0;//实际放的数量
    public BookList() {
        //创建对象之后就已经有了三本书
        books[0] = new Book("三国演义", "罗贯中", 20,"小说");
        books[1] = new Book("西游记", "吴承恩", 30,"小说");
        books[2] = new Book("红楼梦", "曹雪芹", 20,"小说");
        usedSize = 3;
    }
}

用户的创建

接着创建用户,而用户又分为普通用户和管理员,就可以通过继承来实现这种关系,这两种用户的菜单也不相同,就可以抽取出来,在子类进行重写

public abstract class User {
    //不同包的子类可以访问
    protected String name;

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

    public abstract int menu();
}

在这里插入图片描述
之后就可以在Main类里面以多态的方式,根据不同的对象调取不同的菜单

public class Main {
    public static User login() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String name = sc.nextLine();
        System.out.println("请输入身份:1.管理员 2. 普通用户");
        int choice = sc.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();
    }
}

操作的实现

菜单里的操作可以通过接口来实现这个业务逻辑,

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

例如添加图书,直接去实现一个操作接口,具体的逻辑再在本类中进行重写

public class AddOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("添加图书");
    }
}

接下来就是创建各种操作了
在这里插入图片描述
那么有了这些操作该怎么调用呢,无论时普通用户还是管理员,都是用户在操作,所以要在父类User中创建接口数组,再调用具体的方法实现操作
在这里插入图片描述
在这里插入图片描述
捋一下现在的逻辑
在这里插入图片描述
在这里插入图片描述

完善操作

接下来就是完善菜单中的操作内容了

显示图书

因为之前book是用数组存在BookList中的,所以只要遍历数组就可以了

BookList中要提供对应的get,set方法:

    public int getUsedSize() {
        return usedSize;
    }

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

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

显示图书:

public class ShowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        int currentSize = bookList.getUsedSize();
        for(int i= 0;i < currentSize;i++){
            System.out.println(bookList.getBook(i));//输出当前书架上的所有书籍信息
        }
    }
}

查找图书

明白了怎么遍历之后,查找图书就非常简单了

public class FindOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入查找的图书:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int currentSize = bookList.getUsedSize();
        for(int i = 0;i < currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                System.out.println(book);
                return;
            }
        }
        System.out.println("不存在该图书");
    }
}

新增图书

public class AddOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        int currentSize = bookList.getUsedSize();
        if(currentSize == bookList.getBooks().length){
            System.out.println("书架已满,无法添加");
            return;
        }
        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("请输入价格:");
        int price = scanner.nextInt();
        scanner.nextLine();
        System.out.println("请输入类型:");
        String type = scanner.nextLine();

        Book book = new Book(name, author, price, type);
        //添加图书
        bookList.setBook(currentSize, book);
        bookList.setUsedSize(currentSize + 1);
        System.out.println("添加成功");
    }
}

添加之后要记得更改currentSize

借阅图书

借书其实就是查找之后满足借阅条件就可以借阅

public class BorrowOperation implements IOPeration{
    public void work(BookList bookList) {
        System.out.println("请输入借阅的图书:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int currentSize = bookList.getUsedSize();
        for(int i = 0;i < currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                //判断是否借出
                if(book.isBorrowed()){
                    System.out.println("该图书已被借阅");
                    return;
                }
                //修改借阅状态
                book.setBorrowed(true);
                System.out.println("借阅成功");
                return;
            }
        }
        System.out.println("不存在该图书");
    }
}

归还图书

public class ReturnOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入归还的图书:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
                //判断是否借出
                if (book.isBorrowed()) {
                    //修改借阅状态
                    book.setBorrowed(false);
                    System.out.println("归还成功");
                    return;
                }
            }
        }
        System.out.println("此书未被借出");
    }
}

删除图书

由于是用顺序表存储的图书,所以当删除其中的一本书之后,这本书后面的图书都要往前移

public class DeleteOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入删除的图书:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int i = 0,pos = 0;
        int currentSize = bookList.getUsedSize();
        for(;i < currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                pos = i;
                break;
            }
        }
        if(i == currentSize){
            System.out.println("没有找到该图书");
        }
        for(int j = pos;j < currentSize - 1;j++){
            Book book = bookList.getBook(j + 1);
            bookList.setBook(j,book);
        }
        bookList.setBook(currentSize - 1,null);
        //更新currentSize
        bookList.setUsedSize(currentSize - 1);
        System.out.println("删除成功");
    }
}

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

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

相关文章

集成Vision Transformer 的概率模型改进了复杂的息肉分割

文章目录 标题摘要方法实验结果 标题 摘要 结直肠息肉在结肠镜检查中被发现&#xff0c;与结直肠癌密切相关&#xff0c;因此息肉分割是诊断和治疗计划的重要临床决策工具。然而&#xff0c;准确的息肉分割仍然是一个具有挑战性的任务&#xff0c;尤其是在涉及微小息肉和其他…

白酒瓶子上的“10781”代表什么?识别粮食酒的3大秘密,买酒也简单

酒瓶子上即便是有“10781”,也不一定是粮食酒! 这可是不少朋友常犯的一个小迷糊。我曾经也经历过这样的误区,直到和一个对酒超级痴迷的哥们儿逛超市,才让我开了窍。 那天,他带了一瓶茅台,在那坐看又看“这茅子,是假的?怎么不是粮食酒呢,都没有10781呢?” 我当时心里还犯嘀咕…

中国大型相亲交友婚恋平台有哪些?测评5款大型恋爱脱单处对象软件

现今呀&#xff0c;生活节奏那是蹭蹭加快&#xff0c;时间也超紧张&#xff0c;工作压力更是山大&#xff01;想要成功脱单&#xff0c;找到一个真正契合的伴侣真的不是一件容易的事儿呢。不过呢&#xff0c;好在随着科技不断地持续发展&#xff0c;社交平台已经变成了一种超流…

windows 11 23H2更新总是失败解决过程

频繁更新失败的困扰 最近一个月以来 windows 11 系统 23H2 更新总是失败&#xff0c;更新失败会撤销更改: 之后会自动重启系统&#xff0c;但是重启进不去系统&#xff0c;屏幕有背光但是不显示任何内容。 这时候只能长按开机键强制关机。每次出现这种情况我都没办法远程连接到…

如果查看svn的账号和密码

一、找到svn存放目录&#xff08;本地默认存放SVN用户信息的目录为&#xff1a;C:\Users\Administrator\AppData\Roaming\Subversion\auth\svn.simple&#xff09;每个人的电脑环境不一样&#xff0c;因人而异。 如果找不到直接搜索svn.simple 二、下载密码查看工具 链接: 百…

易稿是什么?在易稿平台怎么赚钱?

如有一技之长&#xff0c;在网络上赚钱也会相对容易些&#xff0c;比如会写点文章的朋友。下面就给大家分享一个写作赚钱的靠谱平台——易稿&#xff1a; 易稿简介 易稿&#xff08;原创稿件交易一站式服务平台&#xff09;隶属于上海雅鲁网络科技有限公司旗下网站&#xff0…

如何保证员工在精益变革中始终保持积极的态度?

在当今日新月异的商业环境中&#xff0c;企业为了保持竞争力&#xff0c;需要不断寻求创新和变革。精益变革作为一种提升效率和质量的有效手段&#xff0c;已逐渐成为企业转型升级的关键。然而&#xff0c;变革往往伴随着挑战和不确定性&#xff0c;如何保证员工在精益变革中始…

Ovid医学库文献如何在家查找下载

今天讲的数据库是一个知名医学库——Ovid Ovid隶属于威科集团的健康出版事业集团&#xff0c;与LWW、Adis等公司属于姊妹公司。Ovid数据库在医学外文文献数据库方面占据绝对地位&#xff0c;目前已有包涵人文、科技等多领域数据库300个&#xff0c;其中80多个是生物医学数据库…

单片机超声波测距+WTD588D语音播报的设计

第一章 绪论 1.1 课题设计目的及意义 1.1.1设计的目的 随着科学技术的快速发展&#xff0c;超声波在测距中的应用越来越广。但就目前的急速水平来说&#xff0c;人们可以具体利用的测距技术还十分有限&#xff0c;因此&#xff0c;这是一个正在蓬勃发展而又有无限前景的技术…

C++多态总结与原理、菱形继承问题

文章目录 多态什么是多态 多态的定义及实现多态的构成条件虚函数 虚函数的重写虚函数重写的两个例外协变 重写C11 override 和 final重载、覆盖(重写)、隐藏(重定义)的对比 抽象类概念接口继承和实现继承小结 多态的原理虚函数表多态的原理动态绑定与静态绑定 单继承和多继承关…

Python 机器学习 基础 之 模型评估与改进 【网格搜素】的简单说明

Python 机器学习 基础 之 模型评估与改进 【网格搜素】的简单说明 目录 Python 机器学习 基础 之 模型评估与改进 【网格搜素】的简单说明 一、简单介绍 二、网格搜索 1、简单网格搜索 2、参数过拟合的风险与验证集 3、带交叉验证的网格搜索 附录 一、参考文献 一、简单…

英语学习笔记27——Mrs. Smith‘s living room

Mrs. Smith’s living room 史密斯太太的客厅 词汇 Vocabulary living room 客厅 都成&#xff1a;living liveing 生活    room 屋子 搭配&#xff1a;in the living room 在客厅 文化&#xff1a;西方人一般都在起居室活动&#xff0c;所以客厅很大&#xff0c;一般可以…

联想桌面助手接入攻略

产品接入文档 1.产品介绍 1.1 产品功能介绍 联想桌面助手&#xff0c;是针对Windows用户的桌面开放平台产品&#xff0c;该产品致力于为用户提供更便捷、更高效的PC服务&#xff0c;同时为开发者提供有效触达用户的方式。 官方下载体验地址&#xff1a; 联想电脑_电脑管家_弹…

基于51单片机多功能太阳能充电器设计

1 绪论1.1 本课题研究背景及现状 当代社会随着一些不可再生资源如煤炭&#xff0c;石油等日益减少&#xff0c;使得各国社会经济越来越受能源问题的约制&#xff0c;因此许多国家开始逐渐的实行“阳光计划”&#xff0c;开发洁净的能源如太阳能&#xff0c;用以成为本国经济发…

scala完整笔记-5万字一周入门到精通系列(一)

scala完整笔记-5万字一周入门到精通写在开篇 1.scala学习前一定要具备了解一些java基本知识&#xff0c;无需精通&#xff1b;如果从未接触java&#xff0c;最好熟悉一门编程语言&#xff0c;否则相对还是学习起来相对吃力且很难学懂 2.本篇主要以代码示例为主&#xff0c;很多…

【稳定检索】2024年电子技术、传感器与信号处理国际会议(ETSS 2024)

2024年电子技术、传感器与信号处理国际会议 2024 International Conference on Electronic Technology, Sensors, and Signal Processing 【1】会议简介 2024年电子技术、传感器与信号处理国际会议&#xff0c;作为业内领先的学术交流平台&#xff0c;将汇聚全球顶尖的电子技术…

GpuMall智算云:fofr/cog-face-to-many/cog-face-to-many

通过该镜像创建实例后&#xff0c;点击更多-创建自定义端口 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 输入8188&#xff0c;因为该镜像中的cog-face-tomany监听8188端口&#xff0c;所以必须要填写为8188端口&#xff0c;然后点击确定#au…

基于jeecgboot-vue3的Flowable新建流程定义(三)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 接上一节 8、同时可以进行流程的编辑 /** 编辑流程设计弹窗页面 */const handleLoadXml (row) > {console.log("handleLoadXml row",row)designerData.title "流程设…

如何自建谷歌站点?

自建谷歌站点其实是一个相对简单的过程&#xff0c;主要是指创建一个能够被谷歌搜索引擎索引和搜索的网站 首先要做的自然就是选择一个域名&#xff0c;域名基本就相当于你的门牌号了&#xff0c;你得想一个既好记又能代表你网站内容的名字&#xff0c;注册域名可以去很多网站…

分析训练全球 2k+ 水文站数据,中科院团队发布 ED-DLSTM,实现无监测数据地区洪水预测

随着全球气候变化&#xff0c;洪水灾害正变得愈发频繁。联合国减少灾害风险办公室与比利时鲁汶大学灾害流行问题研究中心联合发布的报告指出&#xff1a;过去 20 年间&#xff0c;全球洪水灾害数量从 1,389 起上升到 3,254 起&#xff0c;增加了超两倍&#xff0c;占到灾害总数…