java面向对象基础练习--实现简单的图书管理系统

2023-11-08

这个系统使用的是java的基础语法(没有使用数据库),实现图书管理系统基础的查询,增加,删除,借阅,归还,打印,退出功能。这个小项目作为我java基础语法的综合运用,主要是为了建立面向对象编程的思想,培养编程习惯,如果有错误或者更好的实现方法,欢迎大家批评指教。

图书管理系统的结构

编写的基本过程

  1. 创建三个包用来装 图书类,用户类,操作类
  2. 在opera包中创建IOperation接口,在user包中创建user类作为父类
  3. 创建main类,把各功能模块串联起来。
  4. (以上步骤把整个系统框架搭好了)
  5. 开始一步一步根据main编写的操作步骤,实现具体的功能模块代码。

具体的代码实现

Book包:

  • 定义一个book类,用来定义一本书,实现构造方法,get/set,toString等方法。
  • //图书类
    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;
    
        }
    
    
        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 getBorrowed() {
            return isBorrowed;
        }
    
        public boolean isBorrowed() {
            return isBorrowed;
        }
    
        public void setBorrowed(Boolean borrowed) {
            isBorrowed = borrowed;
        }
    
        @Override
        public String toString() {
            return "Book{" +
                    "name='" + name + '\'' +
                    ", author='" + author + '\'' +
                    ", price=" + price +
                    ", type='" + type + '\'' +
                    ((isBorrowed == true) ? "已经被借出" : "未被借出") +
                    '}';
        }
    
    }
  • 定义一个BookList类,当做书架,存储图书信息。
  • //书架
    public class BookList {
        //暂时用数组做一个数据库
        private Book[] books = new Book[10];
    
        //通过构造方法创建初始的三本书
        public BookList() {
            books[0] = new Book("三国演义","罗贯中",80,"小说");
            books[1] = new Book("西游记","吴承恩",83,"小说");
            books[2] = new Book("红楼梦","曹雪芹",82,"小说");
            this.usedSize = 3 ;
        }
    
        //记录当前books数组当中有多少本书
        private int usedSize;
    
        public int getUsedSize() {
            return usedSize;
        }
    //为封装起来的Book[]数组提供get和set方法,方便其他地方使用这个数组
        public Book getBook(int pos) {
        return this.books[pos];
        }
    
    
        public void setUsedSize(int usedSize) {
            this.usedSize = usedSize;
        }
    
    
        public void setBook(Book book) {
            this.books[usedSize] = book;
        }
    
        public void setBook(int pos, Book book) {
            this.books[pos] = book;
        }
    
    }

user包

  • 创建user类,作为父类,抽象出用户类共有的属性。
  • //把用户,管理员等的共性提出来,后面用继承
    //建一个抽象类
    public abstract  class User {
        protected String name;
    
    //定义一个接口数组来存储普通用户和管理员用户对应的操作
        //此处只是一个变量名,在NomaIUser和AdminUser里去开辟空间
        protected IOPeration[] ioPerations;
        public User(String name) {
            this.name = name;
        }
    
            public abstract int menu() ;
        //提供一个方法,去调用ioperations数组的对应的choice对应的work方法
        public void doWork(int choice, BookList bookList){
            this.ioPerations[choice].work(bookList);
        }
    }
    

  • 创建管理员用户类(adminUer),实现增加图书,删除图书,查找图书,打印图书,退出系统功能。
    //管理员
    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("hellow "+name+" 欢迎来到图书管理系统");
            System.out.println("1.查找图书!");
            System.out.println("2.新增图书!");
            System.out.println("3.删除图书!");
            System.out.println("4.显示图书!");
            System.out.println("0.退出系统!");
            System.out.println("****************************");
            System.out.println("请输入你的操作:");
            Scanner scanner = new Scanner(System.in);
            int choice = scanner.nextInt();
            return choice;
        }
    }

  • 创建普通用户类(normaUser),实现借阅图书,归还图书,查询图书,打印图书,退出系统功能。
    //普通用户
    public class NomalUser extends User{
    
    
    
        public NomalUser(String name) {
            super(name);
            //引用,然后开辟空间,动态空间,调用的时候初始化下面的对象
            this.ioPerations = new IOPeration[]{
                    new ExitOperation(),
                    new FindOperation(),
                    new BrrowOperation(),
                    new ReturnOperation()
    
            };
        }
            // 菜单部分
            public int menu() {
                System.out.println("****************************");
                System.out.println("hellow" + name + "欢迎来到图书管理系统");
                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;
            }
        }
    

opera包

  • 创建IOperation接口,用于后面的各功能类之间的连接。
  • public interface IOPeration {
        void work(BookList bookList);
    }
    
  • 各功能模块的实现
  • 添加图书
  • //添加图书
    //实现IOPeration接口
    public class AddOperation implements IOPeration{
    //重写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 book = new Book(name,author,price,type);
            //遍历数组
            int currentSize = bookList.getUsedSize();
            for (int i = 0; i < currentSize ; i++) {
                Book tmp =bookList.getBook(i);
                //遍历,对比是否有所输入的图书名字
                if (tmp.getName().equals(name)){
                    System.out.println("已经存在这本书了,不能再添加了!");
                    return;
                }
            }
            //把新的图书数据放到数组的后面
            bookList.setBook(book);
            //修改usedSize
            bookList.setUsedSize(currentSize+1);
    
        }
    }
    

  • 删除图书
    public class DelOperation implements IOPeration {
        //重写IOPeration接口
        @Override
        public void work(BookList bookList) {
            System.out.println("删除图书!");
            System.out.println("请输入需要删除的图书名字:");
            Scanner scanner = new Scanner(System.in);
            System.out.println("输入书名:");
            String name = scanner.nextLine();
            int currentSize = bookList.getUsedSize();
            int index = -1;
            for (int i = 0; i < currentSize ; i++) {
                Book tmp = bookList.getBook(i);
                //遍历,对比是否有所输入的图书名字
                if (tmp.getName().equals(name)) {
                    //用index去存找到的目标的下标
                    index = i;
                    break;
                }
            }
            for (int j = index; j < currentSize-1 ; j++) {
                Book book = bookList.getBook(j + 1);
                bookList.setBook(j, book);
            }
            bookList.setUsedSize(currentSize-1);
            //因为删除的是对象,所以需要把最后一个数组元素置为null
            bookList.setBook(currentSize-1,null);
    
            System.out.println("删除成功!");
    
        }
    
        }
    

  • 查询图书
  • public class FindOperation implements IOPeration {
        //重写IOPeration接口
        @Override
        public void work(BookList bookList) {
            System.out.println("查找图书!");
            System.out.println("请输入书名:");
            Scanner scanner = new Scanner(System.in);
            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("很抱歉,没有找到!");
    
        }
    }

  • 借阅图书
  • public class BrrowOperation implements IOPeration {
        //重写IOPeration接口
        @Override
        public void work(BookList bookList) {
            System.out.println("借出图书!");
            System.out.println("请输入你要借阅的图书:");
            Scanner scanner = new Scanner(System.in);
            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)&&
                book.isBorrowed () == false){
                book.setBorrowed(true);
                System.out.println("借阅成功");
                return ;
            }
            }
        }
    }
    

  • 归还图书
  • public class ReturnOperation implements IOPeration {
        //重写IOPeration接口
        @Override
        public void work(BookList bookList) {
            System.out.println("归还图书!");
            System.out.println("请输入你要归还的图书:");
            Scanner scanner = new Scanner(System.in);
            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)&&
                        book.isBorrowed () == true){
                    book.setBorrowed(false);
                    System.out.println("归还成功");
                    return;
                }
            }
            System.out.println("没有你要归还的书!");
        }
    }

  • 打印图书
  • public class ShowOperation implements IOPeration {
        //重写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);
            }
        }
    }

  • 退出系统
  • public class ExitOperation implements IOPeration {
        //重写IOPeration接口
        @Override
        public void work(BookList bookList) {
            System.out.println("退出系统!");
            System.exit(0);//直接调用这个系统方法
        }
    }

main

public class Main {
    private static BookList bookList;

    public static User login() {
        System.out.println("请输入你的姓名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入你的身份:1-->管理员,0-->普通用户");
        int choice = scanner.nextInt();
        //判断进入那个操作
        if (choice == 1 ) {
            return new AdminUser(name);
        } else {
            return new NomalUser(name);
        }
    }
        public static  void main(String[] args){
        BookList bookList = new BookList();
            User user = login();
            //调用login方法后打印出菜单,然后输入要执行的操作的代码
            //然后接收代码
      //用一个循环来重复显示
            while (true) {
                int choice = user.menu();
                //根据choice和user来确定到底调用哪一个对象的哪个操作
                user.doWork(choice,bookList);
            }
            }

    }

归纳反思

这个图书管理系统的练习难度不大,实现的都是基本功能,做这个小项目的目的是为了建立对面向对象程序编写过程的理解,增强对类,继承,多态,抽象类等面型对象的运用和理解,本次项目中也出现了一个小但是很难受的问题,不小心把boolean写成了Boolean(包装类),忽略了这个知识点导致调试一致出现空指针异常的bug,调试了好久才发现,就很难受。

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

java面向对象基础练习--实现简单的图书管理系统 的相关文章

  • Java - 因内存不足错误而关闭

    关于如何最好地处理这个问题 我听到了非常矛盾的事情 并且陷入了以下困境 OOME 会导致一个线程崩溃 但不会导致整个应用程序崩溃 我需要关闭整个应用程序 但不能 因为线程没有剩余内存 我一直认为最佳实践是让它们离开 这样 JVM 就会死掉
  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • Base36 编码字符串?

    我一直在网上查找 但找不到解决此问题的方法 在 Python Ruby 或 Java 中 如何对以下字符串进行 Base 36 编码 nOrG9Eh0uyeilM8Nnu5pTywj3935kW 5 Ruby 以 36 为基数 s unpa
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • Java中的断点和逐步调试?

    抱歉我的问题名称很奇怪 我不知道如何寻找这个 因为我不知道这些东西是如何称呼的 Visual Studio 中至少有一个功能 您可以单击代码左侧并设置一个大红点的起点 然后运行程序 您可以通过按 f8 或 f5 实际上是不同的 f 来跟踪步
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • Eclipse - 安装新的 JRE (Java SE 8 1.8.0)

    我正在尝试安装 Java 8 到目前为止我所做的 安装最新版本的 Eclipse 下载并安装 Java SE 运行时环境 8http www oracle com technetwork java javase downloads jre8
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • 使用 Java https 上传到 Imgur v3 错误

    我目前正在尝试使用他们当前的 API v3 上传到 imgur 但是我不断收到错误 错误 javax net ssl SSLException 证书中的主机名不匹配 api imgur com imgur com OR imgur com
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • ArrayList.clear() 和 ArrayList.removeAll() 有什么区别?

    假如说arraylist定义为ArrayList
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • leveldb注释7–key与value

    作为一个kv的系统 key的存储至关重要 在leveldb中 主要涉及到如下几个key user key InternalKey与LookupKey memtable key 其关系构成如下图 user key就是用户输入的key 而Int
  • 华为OD机试 - 第k个排列(Java )

    题目描述 给定参数n 从1到n会有n个整数 1 2 3 n 这n个数字共有n 种排列 按大小顺序升序列出所有排列的情况 并一一标记 当n 3时 所有排列如下 123 132 213 231 312 321 给定n和k 返回第k个排列 输入描
  • 关于校园招聘的感受(汇总)

    对招聘会的法想法 今天春季招聘会在我校的西苑体育馆拉开了序幕 我作为大二的一名学生去看了此次招聘会 进到馆内 第一反应就是一个人 多 人多 单位多 感觉到以后大四毕业就业的压力 那么多学长学姐把自己简历送到各个用人单位 开始面试 考官出的题
  • java 动态代理

    动态代理 这里讲解jdk 动态代理 不讲解cglib动态代理 使用jdk 的InvocationHandler接口与Proxy类实现动态代理 自定义InvocationHandler接口与Proxy类 自定义实现 分析 我们想要实现动态代理
  • dcdc升压计算器excel_优秀DCDC升压

    Figure 1 Basic Application Circuit GENERAL DESCRIPTION The MT3608 is a constant frequency 6 pin SOT23 current mode step
  • pycharm简单使用(Mac):创建一个helloWord

    说明 VSCode是一款轻量级的开发工具 可以支持多款插件这个学习使用确实是一个好的工具 PyCharm是一款Python专门支持的IDE 为什么这里要使用PyCharm呢 PyCharm支持断点调试 1 第一步 创建一个项目 2 第二步
  • CUDA 基础 01 - 概念

    最近在GPU编译器测试方面遇到一些瓶颈 准备学习下cuda 相关的基础知识 warp sm index grid等 CPU VS GPU GPU最重要的一点是可以并行的实现数据处理 这一点在数据量大 运算复杂度不高的条件下极为适用 可以简单
  • 3 Ubuntu上使用Qt运行多线程,设置程序自启动及保护脚本

    Ubuntu上使用Qt运行多线程 设置程序自启动及保护脚本 多线程 自启动及保护脚本 自启动及保护脚本 结束自启动脚本 脚本程序简单说明 设置自启动 多线程 使用多线程时我们需要加入 include lt thread gt 这个头文件包含
  • 区块链常见的几大共识机制

    区块链技术被广泛应用于许多领域 其中共识机制是构成区块链系统的核心部分 共识机制是指用来维护区块链数据一致性 安全性和可靠性的机制 常见的区块链共识机制有以下几种 1 工作量证明 Proof of Work 是最早的共识机制 它将矿工通过解
  • 毕业设计-基于机器视觉的交通标志识别系统

    目录 前言 课题背景和意义 实现技术思路 一 交通标志识别系统 二 交通标志识别整体方案 三 实验分析 四 总结 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计
  • 开源项目Tinyhttp项目源码详解

    HTTP协议 http协议叫做超文本传输协议 是基于tcp ic协议的应用层协议 具体内容可以借鉴这一篇博客 https blog csdn net qq 36894974 article details 103930478 本文主要涉及T
  • [人工智能-深度学习-33]:卷积神经网络CNN - 常见分类网络- LeNet网络结构分析与详解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 120893764 目录 第1章 卷积神
  • Ubuntu14.04安装配置NFS用于挂载嵌入式文件系统

    Ubuntu14 04安装配置NFS用于挂载嵌入式文件系统 1 安装 sudo apt get install nfs kernel server rpcbind 2 配置 vi etc exports 在文件的最后一行加上 yaffs2
  • 获取随机位数阿拉伯数字

    int Math random 9 1 1000 这里是随机4位数 需要几位数 就乘以几个零 int Math random 9 1 100 随机3位数 int Math random 9 1 10 随机2位数 来个方法吧 获取随机位数的阿
  • IPSec 基础介绍

    IPSec是IETF Internet Engineering Task Force 制定的一组开放的网络安全协议 它并不是一个单独的协议 而是一系列为IP网络提供安全性的协议和服务的集合 包括认证头AH Authentication He
  • python TimedRotatingFileHandler 配置参数 (转)

    TimedRotatingFileHandler这个模块是满足文件名按时间自动更换的需求 这样就可以保证日志单个文件不会太大 用法很简单 示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 impo
  • python学习之【模块】

    前言 上一篇文章 python学习之 深拷贝 中学习了python中的深浅拷贝学习内容 这篇文章接着学习python中的模块 什么是模块 在python中 一个文件 以 py 为后缀名的文件 就叫做一个模块 每一个模块在python里都被看
  • 群晖做网页服务器_群晖NAS软件DS get介绍及使用方法教程

    我的NAS介绍第二篇 群晖NAS软件介绍与应用之DS get篇前言 1 为什么选择NAS之所以我现在建议大家选择NAS 不仅仅因为网盘的不稳定性和不安全性 遇到和谐大神不说 网盘也经历了各种风风雨雨 从和谐到倒闭不过一步之遥 大家都懂的 还
  • Mysql-连接https域名的Mysql数据源踩的坑

    背景介绍 大家在实际项目中 大部分都会用到关系数据库mysql 通常数据库服务器提供的都是ip的方式 所以不会出现本文涉及到的https域名的问题 本文介绍的是基于数据库服务器是分配了指定域名且有ssl证书的https 连接数据源 遇到的问
  • java面向对象基础练习--实现简单的图书管理系统

    这个系统使用的是java的基础语法 没有使用数据库 实现图书管理系统基础的查询 增加 删除 借阅 归还 打印 退出功能 这个小项目作为我java基础语法的综合运用 主要是为了建立面向对象编程的思想 培养编程习惯 如果有错误或者更好的实现方法