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 相关文章推荐
springboot中一些比较常用的注解总结
Jun 11 Java/Android
MybatisPlus代码生成器的使用方法详解
Jun 13 Java/Android
SpringBoot整合JWT的入门指南
Jun 29 Java/Android
总结Java对象被序列化的两种方法
Jun 30 Java/Android
Java并发编程必备之Future机制
Jun 30 Java/Android
SpringBoot 拦截器妙用你真的了解吗
Jul 01 Java/Android
Spring Boot 排除某个类加载注入IOC的操作
Aug 02 Java/Android
mybatis3中@SelectProvider传递参数方式
Aug 04 Java/Android
SpringDataJPA在Entity中常用的注解介绍
Dec 06 Java/Android
Android Canvas绘制文字横纵向对齐
Jun 05 Java/Android
Spring Security动态权限的实现方法详解
Jun 16 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
php将日期格式转换成xx天前的格式
2015/04/16 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
PHP $O00OO0=urldecode & eval 解密,记一次商业源码的去后门
2020/09/13 PHP
javascript之大字符串的连接的StringBuffer 类
2007/05/08 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
js中class的点击事件没有效果的解决方法
2016/10/13 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
nodejs 最新版安装npm 的使用详解
2018/01/18 NodeJs
javascript 高级语法之继承的基本使用方法示例
2019/11/11 Javascript
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
Python爬虫爬取美剧网站的实现代码
2016/09/03 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
python实现图片横向和纵向拼接
2020/03/05 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
罗技英国官方网站:Logitech UK
2020/11/03 全球购物
中软国际Java程序员笔试题
2014/07/19 面试题
金融事务专业毕业生求职信
2014/02/23 职场文书
销售个人求职信范文
2014/04/28 职场文书
优秀应届生求职信
2014/06/16 职场文书
机械工程师岗位职责
2014/06/16 职场文书
节电标语大全
2014/06/23 职场文书
饭店服务员岗位职责
2015/02/09 职场文书
导游词之吉林花园山
2019/10/17 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers