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 相关文章推荐
Spring Data JPA使用JPQL与原生SQL进行查询的操作
Jun 15 Java/Android
Maven学习----Maven安装与环境变量配置教程
Jun 29 Java/Android
Spring Boot 整合 Apache Dubbo的示例代码
Jul 04 Java/Android
小程序与后端Java接口交互实现HelloWorld入门
Jul 09 Java/Android
java设计模式--原型模式详解
Jul 21 Java/Android
Java实现房屋出租系统详解
Oct 05 Java/Android
详解Flutter和Dart取消Future的三种方法
Apr 07 Java/Android
Android Gradle 插件自定义Plugin实现注意事项
Jun 16 Java/Android
springboot实现string转json json里面带数组
Jun 16 Java/Android
Java实现注册登录跳转
Jun 16 Java/Android
Spring Cloud OpenFeign模版化客户端
Jun 25 Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
Jul 07 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递归使用示例(php递归函数)
2014/02/14 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
jQuery MD5加密实现代码
2010/03/15 Javascript
js 文件引入实现代码
2010/04/23 Javascript
Html中JS脚本执行顺序简单举例说明
2010/06/19 Javascript
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
2013/04/02 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
jQuery使用removeClass方法删除元素指定Class的方法
2015/03/26 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
layui分页效果实现代码
2017/05/19 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python使用matplotlib绘制热图
2018/11/07 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
基于python实现获取网页图片过程解析
2020/05/11 Python
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
甜品店的创业计划书范文
2014/01/02 职场文书
《猴子种树》教学反思
2014/02/14 职场文书
运动会广播稿20字
2014/02/18 职场文书
户外活动总结范文
2014/04/30 职场文书
效能监察建议书
2014/05/19 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
人间正道是沧桑观后感
2015/06/15 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript