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面向对象基础练习--实现简单的图书管理系统 的相关文章

随机推荐

  • 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基础语法的综合运用 主要是为了建立面向对象编程的思想 培养编程习惯 如果有错误或者更好的实现方法