基于Java封装继承多态实现的一个简单图书系统

首先我们大概了解下图书系统的需求

 1.要有两种身份 管理员和普通用户。普通用户和管理员分别对应的功能不一样,需要分开实现

2. 图书系统肯定要有图书,和存放图书的地方,存放就用数组来实现

3.实现对应用户的功能

接下来我们第一步:

首先创建一个book的包,里面存放图书类和存放图书的列表

在图书类中我们要有图书的属性,我们这边简易版只有图书名,作者,类型,价格和图书状态(借出,未被借出)

因为是自己使用,为了安全性使用private修饰,然后构造get,set方法来进行set值和get值,在构造一个toString方法,方便后面来打印,还有一个带参数的构造方法,方便后面进行新建图书

接下来实现存放图书

首先需要创建一个数组来存放书,还需要记录当前书的数量,然后我们可以给数组一个默认的长度,和初始化图书,在初始化时就有几本默认的书,我们需要一个通过下标获取到数组中的书

图书的定义初始化和存放做完后,我们来实现用户

用户分为管理员用户和普通用户,管理员用户和普通用户都是用户,我们就可以定义一个父类User类,然后字类AdminUser和NormalUser来继承父类中共有的方法

父类中定义姓名,然后创建一个User的构造方法,doOperation方法后面会讲到

现在我们要创建我们要实现功能的类,因为每个类都要使用work(BookList bookList)的方法,我们封装一个接口给其他功能类使用

然后逐次创建,继承IOPeration接口,创建完后我们来实现主函数

主函数里要定义一个登陆方法,然后返回用户给系统

 因为登陆函数返回了用户,我们主函数调用登陆方法,第一步知道是进入哪个用户,然后通过choice来决定调用的是哪个方法,doOperation这个方法在上面已经实现,传入choice和书的列表,choice则是通过在普通用户类和管理员用户类中的menu()方法,然后输入,通过choice来接收,传给了doOperation方法,根据choice选择对应的方法

接下来我们挨个实现展示图书,查找图书,新增图书,归还图书,借阅图书,退出图书系统,删除图书的各项功能。

展示图书:

查找图书:

 新增图书:

 借阅图书:

 删除图书:

 退出系统:

归还图书:

 

接下来我给完整版代码:

Book类: 

package book;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 21:49
 */
public class Book {
    private String name;
    private String author;
    private String type;
    private int price;
    private boolean isBorrowed;


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

    public Book(String name, String author, String type, int price) {
        this.name = name;
        this.author = author;
        this.type = type;
        this.price = price;
    }

    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 String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }
    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }
}
BookList类:
package book;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 21:49
 */
public class BookList {
    private Book[] books;  //数组来存放书

    private int usedSize; //记录当前书架上  实际存放的书的数量

    //默认容量
    private static final int DEFAULT_CAPACITY = 10;

    public BookList(){
        this.books = new Book[DEFAULT_CAPACITY];
        //放好书
        this.books[0] = new Book("三国演义","罗贯中","小说",10);
        this.books[1] = new Book("西游记","吴承恩","小说",120);
        this.books[2] = new Book("红楼梦","曹雪芹","小说",110);
        this.books[3] = new Book("斗破苍穹","天蚕土豆","小说",20);

        this.usedSize = 4;
    }

    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    //获取数组某一个下标的书
    public Book getBook(int pos){
//        if (pos >= 0){
//            return books[pos];
//        } else {
//            System.out.println("下标错误");
//            //return new Exception();
//            //throw new Exception("下标错误"); //抛出异常
//        }
        return books[pos];
    }

    //通过数组的下标的位置来放书
    public void setBooks(int pos,Book book){
        books[pos] = book;
    }

    public Book[] getBooks() {
        return books;
    }
}
User类:
package user;

import book.BookList;
import operation.IOPeration;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:12
 */
public abstract class User {
    protected  String name;

    //定义一个存放方法的数组
    protected IOPeration[] ioPerations;

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

    public abstract int menu();

    //通过传入choice来判断调用的方法
    public void doOperation(int choice, BookList bookList)  {
        ioPerations[choice].work(bookList);
    }
}
AdminUser类:
package user;

import operation.*;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:14
 */
public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation()

        };
    }

    public int menu(){
        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("*************");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作");
        int choice = scanner.nextInt();

        return choice;
    }
}

NormalUser类:

package user;

import operation.*;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:14
 */
public class NormalUser extends User {
    public NormalUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation()

        };

    }

    public int menu(){
        System.out.println("*****普通用户********");
        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);
        System.out.println("请输入你的操作");
        int choice = scanner.nextInt();

        return choice;
    }
}

主函数:

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 23:18
 */
public class Main {
    public static User login(){
        System.out.println("请输入用户名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入你的身份: 1 管理员    2 普通用户");
        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 user = login();
        while (true){
            int choice = user.menu();
            //System.out.println("choice: " + choice);
            //根据choice的选择来决定调用的是哪个方法
            user.doOperation(choice,bookList);
        }



    }
}

接口

IOPeration:
package operation;

import book.BookList;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:06
 */
public interface IOPeration {
    void work(BookList bookList);
}

 

功能实现类:

AddOperation:

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:02
 */
public class AddOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        //System.out.println("新增图书!");
        Scanner scanner = new Scanner(System.in);
        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,type,price);

        //检查数组当中有没有这本书
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book1 = bookList.getBook(i);
            if (book1.getName().equals(name)){
                System.out.println("有相同的书了,不进行存放");
                return;
            }
        }
        if (currentSize == bookList.getBooks().length){
            System.out.println("图书已经被放满,不能放了");
        } else {
            //将书放在下标的最后一个位置
            bookList.setBooks(currentSize,book);
            //将书的数量加1
            bookList.setUsedSize(currentSize+1);
        }
        System.out.println("新增成功");
    }
}
BorrowOperation:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:04
 */
public class BorrowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        //System.out.println("借阅图书!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要借阅的书名");
        String name = scanner.nextLine();

        int curredSize = bookList.getUsedSize();

        int i = 0;

        for (; i < curredSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)){
                if (book.isBorrowed() == false){
                    book.setBorrowed(true);
                    System.out.println("借阅成功");
                    System.out.println(book);
                    return;
                } else {
                    System.out.println("图书已被借阅,不能再次借出");
                    return;
                }

            }
        }
        System.out.println("你借阅的图书不存在");

    }
}
DelOperation:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:02
 */
public class DelOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        //System.out.println("删除图书!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要删除的书名");
        String name = scanner.nextLine();

        int pos = -1;
        int i = 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("没有你要删除的图书!");
            return;
        }
        //开始删除
        int j = pos;
        for (; j < currentSize-1 ; j++) {
            Book book = bookList.getBook(j+1);
            bookList.setBooks(j,book);
        }

        //将j置为空
        bookList.setBooks(j,null);
        //将书的数量减1
        bookList.setUsedSize(currentSize-1);
        System.out.println("删除成功");
    }
}
ExitOperation:
package operation;

import book.BookList;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:03
 */
public class ExitOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出图书系统!");
        System.exit(0);
    }
}
FindOperation:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:02
 */
public class FindOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        //System.out.println("查找图书!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的书!");
        String name = scanner.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("找到了这本书,信息如下");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有找到这本书");
    }
}
ReturnOperation:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:04
 */
public class ReturnOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        //System.out.println("归还图书!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要归还的书名");
        String name = scanner.nextLine();

        int curredSize = bookList.getUsedSize();

        int i = 0;

        for (; i < curredSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)){
                if (book.isBorrowed() == true){
                    book.setBorrowed(false);
                    System.out.println("归还成功");
                    System.out.println(book);
                    return;
                } else {
                    System.out.println("该图书没有被借出,无需归还");
                    return;
                }

            }
        }
        System.out.println("你归还的图书不存在");
    }
}
ShowOperation:
package operation;

import book.Book;
import book.BookList;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:03
 */
public class ShowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        //System.out.println("展示图书!");
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            System.out.println(book);
        }
    }
}

仓库地址:Java学习仓库,从入门到精通: Java入门学习 - Gitee.com

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字化转型背景下,企业如何做好知识管理?

在当今数字化转型的时代&#xff0c;企业面临着日益复杂和快速变化的商业环境。知识管理成为了企业成功的关键之一。有效地管理和利用知识资源可以提升企业的创新能力、决策质量和竞争力。以下我列了一些关键的点&#xff0c;讲讲在数字化转型背景下&#xff0c;企业如何可以做…

Qt程序打包成.exe可执行文件

1.使用Release进行编译 2.找到编译成功的地址: 找到对应的目录 3.把SerialTool.exe文件单独复制到一个文件夹,这里我直接在桌面创建一个SerialTool文件夹,这时候直接运行是不行的,我们需要把库都导进去 4. 在安装目录找到如下这个文件,点击打开,找到你电脑对应的版本即可,我这…

印刷企业实施MES管理系统需要哪些硬件设施

随着科技的飞速发展&#xff0c;印刷行业正面临着前所未有的挑战和机遇。为了提高生产效率&#xff0c;降低成本&#xff0c;并增强市场竞争力&#xff0c;越来越多的印刷企业开始实施制造执行系统&#xff08;MES&#xff09;管理系统。本文将重点讨论印刷企业在实施MES管理系…

Java 多线程进阶

1 方法执行与进程执行 GetMapping("/demo1")public void demo1(){//方法调用new ThreadTest1("run1").run();//线程调用new ThreadTest1("run2").start();} 下断点调试信息&#xff0c;可以看到run()方法当前线程是“main1” 继续运行到run里面&…

软件测试/测试开发/人工智能丨​Python运算符解析,小白也能轻松get

什么是运算符 运算符是用于进行各种运算操作的符号或关键词。 在数学和计算机编程中&#xff0c;运算符被用来表示不同的运算操作&#xff0c;例如加法、减法、乘法、除法等。 比如: 4 5&#xff0c;其中&#xff0c;4和5为操作数&#xff0c;为运算符。a 10&#xff0c;…

HandBrake :MacOS专业视频转码工具

handbrake 俗称大菠萝&#xff0c;是一款免费开源的视频转换、压缩软件&#xff0c;它几乎支持目前市面上所能见到的所有视频格式&#xff0c;并且支持电脑硬件压缩&#xff0c;是一款不可多得的优秀软件 优点 ∙Windows, Linux, Mac 三平台支持 ∙开源、免费、无广告 ∙支…

uni-app - 弹出框

目录 1.基本介绍 2.原生uinapp 通过uni.showActionSheet实现 3.使用组件 Popup 弹出层 ③效果展示 1.基本介绍 弹出框让我们在需要时在屏幕底部弹出一个菜单&#xff0c;它通常用于在各种应用程序中进行选择操作。Uniapp为我们提供了基本的底部弹出框组件&#xff0c;但它也有…

全国见!飞桨星河社区五周年,邀你共赴大模型盛宴!

自2018年对外发布以来&#xff0c;飞桨星河社区已汇集660万AI开发者。感谢大家一路见证了飞桨星河社区的成长&#xff0c; 也很荣幸飞桨星河社区陪伴了大家的AI开发旅程。 在这个大模型时代&#xff0c; 飞桨星河社区期待可以帮助开发者们实现自我价值&#xff0c; 获得更多成长…

[JDK工具-3] javac编译器生成class文件 java执行器运行class文件

位置&#xff1a;jdk\bin 语法&#xff1a;javac 源文件 -d class文件输出路径 -encoding utf-8 javac HelloWorld.java -d D:\project1\java8\java8\xin-javademo\src\main\java\com\xin\demo\hutooldemo\ -encoding utf-8 语法&#xff1a;java 类文件完全限定名&#xff08;…

CRM系统的销售预测是什么?怎么做?

简单来说&#xff0c;销售预测可以通过销售关键信息为团队预测收入&#xff0c;分配目标。CRM中的销售预测可以帮助企业制定合理的销售目标和策略&#xff0c;并通过实时数据发现瓶颈所在&#xff0c;提高团队绩效。下面说说CRM中销售预测是什么&#xff1f;如何销售预测&#…

数据中心走向绿色低碳,液冷存储舍我其谁

引言&#xff1a;没有最冷&#xff0c;只有更冷&#xff0c;绿色低碳早已成为行业关键词。 【全球存储观察 &#xff5c; 科技热点关注】 每一次存储行业的创新&#xff0c;其根源离不开行业端的用户需求驱动。 近些年从数据中心建设的整体发展情况来看&#xff0c;从风冷到…

目标分割技术-语义分割总览

前言 博主现任高级人工智能工程师&#xff0c;曾发表多篇SCI且获得过多次国际竞赛奖项&#xff0c;理解各类模型原理以及每种模型的建模流程和各类题目分析方法。目的就是为了让零基础快速使用各类代码模型&#xff0c;每一篇文章都包含实战项目以及可运行代码。欢迎大家订阅一…

抖音如何推广引流?抖音推广引流的经验与工具分享

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、了解抖音推广的价值 抖音作为一款热门的短视频应用&#xff0c;拥有庞大的用户群体和强大的传播力。通过抖音推广&#xff0c;企业或个人可以在短时间内获得大量的曝光和流量&…

浪潮信息云峦服务器操作系统KeyarchOS体验与实践

写在前面 大家好我是网络豆&#xff0c;一名云计算运维人员&#xff0c;本文将会带大家体验一下浪潮信息服务器操作系统云峦KeyarchOS。看看浪潮信息服务器操作系统云峦KeyarchOS的优势与实践操作如何。 背景了解 KeyarchOS是浪潮信息基于Linux Kernel、OpenAnolis等开源技术…

Windows本地搭建rtmp推流服务

前言 开发时偶尔需要使用rtmp直播流做视频流测试&#xff0c;苦于网上开源的rtmp视频流都已经失效&#xff0c;无奈只好尝试在本地自己搭建一个rtmp的推流服务&#xff0c;方便测试使用。 一、工具准备 Nginx&#xff1a;使用nginx-rtmp-win64推流工具FFmpeg&#xff1a;官方…

el-table 表格表头、单元格、滚动条样式修改

.2023.11.21今天我学习了如何对el-table表格样式进行修改&#xff0c;如图&#xff1a; 运用的两个样式主要是 1.header-cell-class-name&#xff08;设置表头&#xff09; 2.class-name&#xff08;设置行单元格&#xff09; 代码如下&#xff1a; <el-table :data&quo…

一份全面「梳理LLM幻觉问题」的综述

文章目录 一文全面梳理「LLM 幻觉问题」1. 幻觉的分类2. 幻觉的来源2.1 幻觉来自数据2.2 幻觉来自训练2.3 幻觉来自生成/推理 3. 幻觉的检测3.1 事实性幻觉的检测3.2 忠实性幻觉的检测 4. 幻觉的评估5. 幻觉的解决 一文全面梳理「LLM 幻觉问题」 相信大家在使用ChatGPT或者其他…

【开源】基于JAVA的学生日常行为评分管理系统

项目编号&#xff1a; S 010 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S010&#xff0c;文末获取源码。} 项目编号&#xff1a;S010&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2.1 登录注册模块2.2…

【Odoo条码】Odoo中二维码或者条码应用场景(生成条码、解释条码)

在本文中&#xff0c;我们将编写一个简短的脚本来使用 Python 生成条形码。我们将使用 python-barcode 模块&#xff0c;它是 pyBarcode 模块的一个分支。该模块为我们提供了以 SVG 格式生成条形码的功能。 Pillow 是生成图像格式(如 png 或 jpg)条码所必需的。 需要的模块 p…

RESTful API 设计指南——为什么要用(上)

引言 在上一篇中&#xff1a;RESTful API 设计指南——开篇词 我们介绍了几个十分有争议的案例&#xff1a; 所有的接口都使用Post请求不管成功还是失败&#xff0c;HTTP状态码都返回200API命名千奇百怪 本章我们来深入分析一下&#xff0c;为什么不要像案例中所说的那样干…