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新手教程之ArrayList的基本使用
Jun 20 Java/Android
SpringCloud的JPA连接PostgreSql的教程
Jun 26 Java/Android
Java Kafka 消费积压监控的示例代码
Jul 01 Java/Android
Java使用httpRequest+Jsoup爬取红蓝球号码
Jul 02 Java/Android
Spring Boot 整合 Apache Dubbo的示例代码
Jul 04 Java/Android
SpringBoot整合Mybatis Generator自动生成代码
Aug 23 Java/Android
关于EntityWrapper的in用法
Mar 22 Java/Android
Java GUI编程菜单组件实例详解
Apr 07 Java/Android
零基础学java之带返回值的方法的定义和调用
Apr 10 Java/Android
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
Apr 13 Java/Android
解决springboot druid数据库连接失败后一直重连的方法
Apr 19 Java/Android
Android 界面一键变灰 深色主题工具类
Apr 28 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初学者头疼问题总结
2006/07/08 PHP
了解Joomla 这款来自国外的php网站管理系统
2010/03/11 PHP
PHP 设置MySQL连接字符集的方法
2011/01/02 PHP
php构造函数的继承方法
2015/02/09 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
解决js图片加载时出现404的问题
2020/11/30 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
JavaScript中ES6字符串扩展方法
2016/08/26 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
js推箱子小游戏步骤代码解析
2018/01/10 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
vue使用@scroll监听滚动事件时,@scroll无效问题的解决方法详解
2019/10/15 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
python中字符串的操作方法大全
2018/06/03 Python
python 美化输出信息的实例
2018/10/15 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
普天C++笔试题
2016/03/20 面试题
会计核算科岗位职责
2014/03/19 职场文书
任长霞观后感
2015/06/16 职场文书
无房证明样本
2015/06/17 职场文书
2016年母亲节寄语
2015/12/04 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers