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 Swing实现自助取款机系统
Jun 11 Java/Android
解决SpringCloud Feign传对象参数调用失败的问题
Jun 23 Java/Android
swagger如何返回map字段注释
Jul 03 Java/Android
教你在 Java 中实现 Dijkstra 最短路算法的方法
Apr 08 Java/Android
Java数组详细介绍及相关工具类
Apr 14 Java/Android
java高级用法JNA强大的Memory和Pointer
Apr 19 Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 Java/Android
解决Springboot PostMapping无法获取数据的问题
May 06 Java/Android
Java界面编程实现界面跳转
Jun 16 Java/Android
java中如何截取字符串最后一位
Jul 07 Java/Android
Springboot集成kafka高级应用实战分享
Aug 14 Java/Android
Android实现获取短信验证码并自动填充
May 21 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
ecshop 2.72如何修改后台访问地址
2015/03/03 PHP
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
JavaScript window.document的属性、方法和事件小结
2012/10/24 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
js实现带搜索功能的下拉框实时搜索实时匹配
2013/11/05 Javascript
js post提交调用方法
2014/02/12 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
jquery 判断滚动条到达了底部和顶端的方法
2014/04/02 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
浅谈$('div a') 与$('div>a')的区别
2016/07/18 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python中as用法实例分析
2015/04/30 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
python游戏开发之视频转彩色字符动画
2019/04/26 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
土木工程专业自荐信
2013/10/04 职场文书
客服专员岗位职责
2014/02/28 职场文书
机关会计岗位职责
2014/04/08 职场文书
节电标语大全
2014/06/23 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
辩护词范文大全
2015/05/21 职场文书
安全教育主题班会总结
2015/08/14 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书