Java 写一个简单的图书管理系统


Posted in Java/Android onApril 26, 2022

Java中的最主要的语法之前基本都介绍完毕,本篇将使用之前的内容来写一个简单的图书管理系统,中间会展示部分代码来讲解,源码地址在这?项目: 个人练习的项目 - Gitee.com

首先还是来看看运行的效果

Java 写一个简单的图书管理系统

Java 写一个简单的图书管理系统

我们来分析一下:

Java中是通过对象之间的交互来解决事情的,所以我们来看看有哪些对象

首先显而易见的两个对象:用户和书,所以创建两个包book和user

通过上图可以看到:不同用户之间有相同的操作,也有不同的操作,所以不妨将所有的操作都放在一个包中,需要什么操作直接调用即可,我将这个包命名为operate

1.book包

首先包中肯定需要有一个Book类,此类中记录数的各种信息,包括书名、作者、书的类型、价格和借阅状态,所有包中的所有类中的成员变量我都使用private修饰,只提供对外的方法,后面就不再重复,代码如下(只展示部分代码):

package book;
public class Book {
    private String name;
    private String author;
    private String type;
    private int price;
    private boolean borrow;
    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;
    }
}

既然有书,那么就需要书架来存放书,所以在book包中再定义一个类为BookShelf用来存放书以及记录书的数量,存放书可以用Book类数组实现

public class BookShelf {
    private Book[] books=new Book[1000];
    private int count; //记录书的数量
}

由于数组不能直接访问,所以在类中增加一个获取数组下标的方法,而访问数组的方法一般都是对书进行操作,所以setBook方法也进行修改

package book;
public class BookShelf {
    private Book[] books=new Book[1000];
    private int count; //记录书的数量
    public void setBooks(int pos,Book book) {
        books[pos] = book;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public BookShelf() {
        books[0]=new Book("呐喊","鲁迅","小说集",30); //默认初始有一本书,写不写随你
        this.count=1;
    }
    //获取下标对应的书
    public Book pos(int i) {
        return books[i];
    }
}

book包初步的代码就到这,继续下一个包

2.user包

包中肯定会有普通用户(NormalUser)和管理员(AdminUser)两个类,但重点是如何实现图中的不同用户有不同的操作

那我们先将登陆方法写出来,然后分析:

public static void login() {
        System.out.println("输入姓名:");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        System.out.println("输入你身份:1.管理员  2.普通用户");
        int i=scanner.nextInt();
        if(i==1) {
            //管理员
        } else {
            //普通用户
        }
    }

方法根据不同的数字来判断是哪种用户,所以返回值应该是返回一个类,但这里有两个类,为解决这个问题,我们可以让NormalUser和AdminUser都继承同一个父类,方法只要返回父类即可

父类代码如下:

public abstract class User { 
    private String name;
     public User(String name) {
        this.name = name;
    }
    public abstract void menu(); //菜单抽象方法,子类实现
}

子类代码:

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
    }
     @Override
    public void 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("选择操作");
    }
}
public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
    }
    @Override
    public void menu() {
        System.out.println("欢迎使用");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出系统");
        System.out.println("选择操作");
    }
}

不同用户对应着不同的操作,但有相同的操作数,所以两个类需要有一个数组来存放各自的方法来防止出错,而且这个数组是要在用户选择之前就准备好,所以数组应该是在构造方法内,修改后的类如下:

public abstract class User {
    private String name;
    public IOperate[] ioperate;
    public void chooseOperate(int choice,BookShelf bookShelf) {
        ioperate[choice].work(bookShelf);
    }
    public User(String name) {
        this.name = name;
    }
    public abstract int menu();
}
public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        this.ioperate=new IOperate[] {
                new Exit(),
                new FindBook(),
                new AddBook(),
                new DelBook(),
                new DisplayBook(),
        };
    }
    @Override
    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);
        int choice=scanner.nextInt();
        return choice;
    }
}
public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.ioperate=new IOperate[] {
                new Exit(),
                new FindBook(),
                new BorrowBook(),
                new ReturnBook(),
        };
    }
    @Override
    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);
        int choice=scanner.nextInt();
        return choice;
    }
}

3.operate包

图书的增删改查等操作其实都是在对Book数组来进行操作的,所以这些方法的参数都是BookShelf类,那么我们可以定义一个接口,接口内定义此方法,然后其它类实现此接口即可

接口代码:

package operate;
import book.BookShelf;
public interface IOperate {
    public void work (BookShelf bookShelf);
}

至于对书的操作,这里以增加书籍为例

我们需要知道书的信息,然后要有一个Book类来接收,最后放到数组中

按照这个逻辑,之前的Book类就需要修改:在Book类中添加一个构造方法以便接收书的信息,注意方法在数组中的位置要和你自己写的菜单中的位置对应

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

增加书的方法代码:

public class AddBook implements IOperate {
    @Override
    public void work(BookShelf bookShelf) {
        System.out.println("请输入图书的名字:");
        Scanner scanner = new Scanner(System.in);
        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 count=bookShelf.getCount();
        bookShelf.setBooks(count,book);
        bookShelf.setCount(count+1);
        System.out.println("新增成功");
    }
}

注:

1.由于引用变量默认是输出修改的地址,所以要打印书的内容的话需要在类Book中重写toString方法

2.退出方法在退出前需遍历数组将其指向的对象都改为null方便回收,虽然程序结束后系统也会回收,但你要知道大型工程里面有些程序一旦跑起来后想要停下来不是那么容易的

到这里这个图书管理系统基本完成,完

到此这篇关于Java手写图书管理基本功能附代码的文章就介绍到这了!

Java/Android 相关文章推荐
Java实现斗地主之洗牌发牌
Jun 14 Java/Android
Java用自带的Image IO给图片添加水印
Jun 15 Java/Android
Java常用函数式接口总结
Jun 29 Java/Android
解决SpringBoot文件上传临时目录找不到的问题
Jul 01 Java/Android
Java SSM配置文件案例详解
Aug 30 Java/Android
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
Aug 30 Java/Android
Java 超详细讲解IO操作字节流与字符流
Mar 25 Java/Android
Android Studio实现简易进制转换计算器
May 20 Java/Android
Spring IOC容器Bean的作用域及生命周期实例
May 30 Java/Android
Spring Boot项目如何优雅实现Excel导入与导出功能
Jun 10 Java/Android
springboot 全局异常处理和统一响应对象的处理方式
Jun 28 Java/Android
IDEA中sout快捷键无效问题的解决方法
Jul 23 Java/Android
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
Apr 24 #Java/Android
Spring Boot 使用 Spring-Retry 进行重试框架
Apr 24 #Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 #Java/Android
Android开发 使用文件储存的方式保存QQ密码
Apr 24 #Java/Android
IDEA 2022 Translation 未知错误 翻译文档失败
Android开发实现极为简单的QQ登录页面
Flutter Navigator 实现路由传递参数
Apr 22 #Java/Android
You might like
56.com视频采集接口程序(PHP)
2007/09/22 PHP
关于PHP5 Session生命周期介绍
2010/03/02 PHP
php将csv文件导入到mysql数据库的方法
2014/12/24 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
win10环境PHP 7 安装配置【教程】
2016/05/09 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
2019/05/01 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
python保存字符串到文件的方法
2015/07/01 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
python中logging包的使用总结
2018/02/28 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
Python类成员继承重写的实现
2020/09/16 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
2014信息公开实施方案
2014/02/22 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
倡议书格式
2014/04/14 职场文书
心理咨询承诺书
2014/05/20 职场文书
护士医德医风自我评价
2014/09/15 职场文书
小学生大队委竞选稿
2015/11/20 职场文书