JAVA实现图书管理系统(思路,和完整代码)

简介: JAVA实现图书管理系统(思路,和完整代码)

因为文件过多每个文件之间的关系如下(每个文件中都只有一个类):


image.png

因为JAVA属于面向对象编程的语言,所以我们想要实现图书管理系统就得分以下几步:

    • 找出其中的所有的对象
    • 实现所有的对象
    • 完成对象之间的交互

    在图书管理系统中我们可以想到这几个对象用户(用户还可以分为普通用户管理员),还得有存放书的书架

    找出对象之后我们将它们分别放在两个包中(一个放书和书架,另一个放普通用户和管理员)。

    我们可以在书架类中创建一个书的数组,这样就相当于把书放在了书架中。

    package book;
    public class BookList {
        public Book[] books;//书架
        public int numBooks;//书架实际存放的书的本书
    }

    image.gif

    此时你还可以将书类中的属性都用private修饰因为后面我们的所有操作都是针对书架(如果用private修饰就需要对每个属性都实现get 和 set 方法)。

    书类包含以下属性:

    String name;

    String author;

    int money;

    String type;

    boolean isBorrow;

    以下方法:

    publicBook(){};
    publicBook(Stringname, Stringauthor, intmoney, Stringkind) {}
    publicStringgetName() {}
    publicvoidsetName(Stringname) {}
    publicStringgetAuthor() {}
    publicvoidsetAuthor(Stringauthor) {}
    publicintgetMoney() {}
    publicvoidsetMoney(intmoney) {}
    publicStringgetType() {}
    publicvoidsetType(Stringkind) {}
    publicbooleangetBorrow() {}
    publicvoidsetBorrow(booleanborrow) {}
    @OverridepublicStringtoString() {
    return"name='"+name+'\''+", author='"+author+'\''+", money="+money+", kind='"+type+'\''+", 状态:"+(isBorrow==false?"未被借出" : "已被借出");
    }

    此处重写toString是为了可以直接使用System.out.println();输出book

    因为普通用户和管理员都属于用户所以可与使用继承让 普通用户管理员继承用户这个父类。

    这样我们就可以利用多态的思想,创建一个用户类,由于引用的对象不同调用相同的方法结果也不相同。

    可是现在又有一个新问题就是管理员和普通用户所打印出来的菜单是不同的,所以就不能在父类中实现,所以父类就不能是一个普通的父类,它必须是一个抽象类

    因为用户的操作太多而且有重复方法所以这里推荐新建一个包将其全部放入新的包中,并将所有的操作都单独封装成一个类。

    操作属于用户所以写成如下格式:

    //用户类abstractpublicclassUser {
    protectedStringname;
    protectedWork[] work;//存放用户所有的操作publicintcounst; //work中的元素个数}
    //管理员publicclassAdvancedUserextendsUser{
    publicAdvancedUser(Stringname){
    this.name=name;
    this.work=newWork[]{
    newExitOperation(),
    newFindOperation(),
    newAddOperation(),
    newDelOperation(),
    newShowOperation()
            };
    this.counst=5;
        }
    }
    //普通用户publicclassNormalUserextendsUser {
    publicNormalUser(Stringname){
    this.name=name;
    this.work=newWork[]{
    newExitOperation(),
    newFindOperation(),
    newBorrowOperation(),
    newRetOperation(),
            };
    this.counst=4;
        }
    }

    image.gif

    这样就可以用数组来调用方法

    publicvoidoperation(intchoice, BookListbookList){
    work[choice].work(bookList);
        }

    image.gif

    完整代码:

    packagemain;
    importbook.BookList;
    importuser.AdvancedUser;
    importuser.NormalUser;
    importuser.User;
    importjava.util.Scanner;
    publicclassMain {
    publicstaticUserlogin(){
    Scannerin=newScanner(System.in);
    System.out.println("请输入你的姓名:");
    Stringname=in.nextLine();
    System.out.println("请选择你的身份:1.管理员    0.普通用户");
    if (in.nextInt() ==1){
    returnnewAdvancedUser(name);
            }else {
    returnnewNormalUser(name);
            }
        }
    publicstaticvoidmain(String[] args) {
    BookListbookList=newBookList();
    Useruser=login();
    while(true){
    intchoice;
    do{
    choice=user.menu();
                }while(choice<0||choice>=user.counst);
    user.operation(choice, bookList);
            }
        }
    }

    image.gif

    packagebook;
    publicclassBook {
    privateStringname;
    privateStringauthor;
    privateintmoney;
    privateStringtype;
    privatebooleanisBorrow;
    publicBook(){};
    publicBook(Stringname, Stringauthor, intmoney, Stringkind) {
    this.name=name;
    this.author=author;
    this.money=money;
    this.type=kind;
        }
    publicStringgetName() {
    returnname;
        }
    publicvoidsetName(Stringname) {
    this.name=name;
        }
    publicStringgetAuthor() {
    returnauthor;
        }
    publicvoidsetAuthor(Stringauthor) {
    this.author=author;
        }
    publicintgetMoney() {
    returnmoney;
        }
    publicvoidsetMoney(intmoney) {
    this.money=money;
        }
    publicStringgetType() {
    returntype;
        }
    publicvoidsetType(Stringkind) {
    this.type=kind;
        }
    publicbooleangetBorrow() {
    returnisBorrow;
        }
    publicvoidsetBorrow(booleanborrow) {
    isBorrow=borrow;
        }
    @OverridepublicStringtoString() {
    return"name='"+name+'\''+", author='"+author+'\''+", money="+money+", kind='"+type+'\''+", 状态:"+(isBorrow==false?"未被借出" : "已被借出");
        }
    }

    image.gif

    packagebook;
    publicclassBookList {
    publicBook[] books;//书架publicintnumBooks;//书架实际存放的书的本书publicBookList() {
    this.books=newBook[10];
    //默认书架存放两本书this.books[0] =newBook("西游记","吴承恩",39,"小说");
    this.books[1] =newBook("红楼梦","曹雪芹",39,"小说");
    this.numBooks=2;
        }
    }

    image.gif

    packageoperation;
    importbook.Book;
    importbook.BookList;
    importjava.util.Scanner;
    publicclassAddOperationextendsWork{
    @Overridepublicvoidwork(BookListbookList) {
    Scannerin=newScanner(System.in);
    bookList.books[bookList.numBooks] =newBook();
    System.out.print("请输入书名:");
    bookList.books[bookList.numBooks].setName(in.nextLine());
    System.out.print("请输入作者:");
    bookList.books[bookList.numBooks].setAuthor(in.nextLine());
    System.out.print("请输入所属书类:");
    bookList.books[bookList.numBooks].setType(in.nextLine());
    System.out.print("请输入书价:");
    bookList.books[bookList.numBooks].setMoney(in.nextInt());
    bookList.numBooks++;
        }
    }

    image.gif

    packageoperation;
    importbook.BookList;
    importjava.util.Scanner;
    publicclassBorrowOperationextendsWork{
    @Overridepublicvoidwork(BookListbookList) {
    intnumBooks=bookList.numBooks;
    Scannerin=newScanner(System.in);
    System.out.print("请输入书名:");
    Stringname=in.nextLine();
    for (inti=0; i<numBooks; i++) {
    if (name.equals(bookList.books[i].getName())) {
    if (bookList.books[i].getBorrow() ==false){
    System.out.println("借阅成功");
    bookList.books[i].setBorrow(true);
    return;
                    }else{
    System.out.println("该书已被借出");
    return;
                    }
                }
            }
    System.out.println("未收录该书");
        }
    }

    image.gif

    packageoperation;
    importbook.BookList;
    importjava.util.Scanner;
    publicclassDelOperationextendsWork{
    @Overridepublicvoidwork(BookListbookList) {
    intnumBooks=bookList.numBooks;
    Scannerin=newScanner(System.in);
    System.out.print("请输入书名:");
    Stringname=in.nextLine();
    for (inti=0; i<numBooks; i++) {
    if (name.equals(bookList.books[i].getName())){
    intj=0;
    for (j=i; j<numBooks-1; j++) {
    bookList.books[j] =bookList.books[j+1];
                    }
    bookList.books[j] =null;
    bookList.numBooks--;
    return;
                }
            }
        }
    }

    image.gif

    packageoperation;
    importbook.BookList;
    publicclassExitOperationextendsWork{
    @Overridepublicvoidwork(BookListbookList) {
    System.exit(0);
        }
    }

    image.gif

    packageoperation;
    importbook.BookList;
    importjava.util.Scanner;
    publicclassFindOperationextendsWork{
    @Overridepublicvoidwork(BookListbookList) {
    intnumBooks=bookList.numBooks;
    Scannerin=newScanner(System.in);
    System.out.print("请输入书名:");
    Stringname=in.nextLine();
    for (inti=0; i<numBooks; i++) {
    if (name.equals(bookList.books[i].getName())) {
    System.out.println(bookList.books[i]);
    return;
                }
            }
    System.out.println("未收录该书");
        }
    }

    image.gif

    packageoperation;
    importbook.BookList;
    importjava.util.Scanner;
    publicclassRetOperationextendsWork{
    @Overridepublicvoidwork(BookListbookList) {
    intnumBooks=bookList.numBooks;
    Scannerin=newScanner(System.in);
    System.out.print("请输入书名:");
    Stringname=in.nextLine();
    for (inti=0; i<numBooks; i++) {
    if (name.equals(bookList.books[i].getName())) {
    if (bookList.books[i].getBorrow()){
    System.out.println("归还成功");
    bookList.books[i].setBorrow(false);
    return;
                    }else{
    System.out.println("该书未被借出");
    return;
                    }
                }
            }
    System.out.println("未收录该书");
        }
    }

    image.gif

    packageoperation;
    importbook.BookList;
    publicclassShowOperationextendsWork{
    @Overridepublicvoidwork(BookListbookList) {
    for (inti=0; i<bookList.numBooks; i++) {
    System.out.println(bookList.books[i]);
            }
        }
    }

    image.gif

    packageoperation;
    importbook.BookList;
    abstractpublicclassWork {
    abstractpublicvoidwork(BookListbookList);
    }

    image.gif

    packageuser;
    importoperation.*;
    importjava.util.Scanner;
    publicclassAdvancedUserextendsUser{
    publicAdvancedUser(Stringname){
    this.name=name;
    this.work=newWork[]{
    newExitOperation(),
    newFindOperation(),
    newAddOperation(),
    newDelOperation(),
    newShowOperation()
            };
    this.counst=5;
        }
    @Overridepublicintmenu() {
    System.out.println("###########################");
    System.out.println(" Hello "+"AdvancedUser:"+this.name);
    System.out.println("1.查找图书");
    System.out.println("2.新增图书");
    System.out.println("3.删除图书");
    System.out.println("4.显示图书");
    System.out.println("0.退出系统");
    System.out.println("###########################");
    System.out.println("请选择你的操作:");
    Scannerin=newScanner(System.in);
    returnin.nextInt();
        }
    }

    image.gif

    packageuser;
    importoperation.*;
    importjava.util.Scanner;
    publicclassNormalUserextendsUser {
    publicNormalUser(Stringname){
    this.name=name;
    this.work=newWork[]{
    newExitOperation(),
    newFindOperation(),
    newBorrowOperation(),
    newRetOperation(),
            };
    this.counst=4;
        }
    @Overridepublicintmenu() {
    System.out.println("###########################");
    System.out.println(" Hello "+"NormalUser:"+this.name);
    System.out.println("1.查找图书");
    System.out.println("2.借阅图书");
    System.out.println("3.归还图书");
    System.out.println("0.退出系统");
    System.out.println("###########################");
    System.out.println("请选择你的操作:");
    Scannerin=newScanner(System.in);
    returnin.nextInt();
        }
    }

    image.gif

    packageuser;
    importbook.BookList;
    importoperation.Work;
    abstractpublicclassUser {
    protectedStringname;
    protectedWork[] work;//存放用户所有的操作publicintcounst; //work中的元素个数abstractpublicintmenu();
    publicvoidoperation(intchoice, BookListbookList){
    work[choice].work(bookList);
        }
    }

    image.gif

    运行结果:

    image.png

    目录
    相关文章
    |
    2月前
    |
    Java
    在 Java 中捕获和处理自定义异常的代码示例
    本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
    86 1
    |
    3天前
    |
    SQL Java 数据库连接
    如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
    大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
    90 11
    |
    7天前
    |
    JSON Java 数据挖掘
    利用 Java 代码获取淘宝关键字 API 接口
    在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
    |
    2月前
    |
    Java
    在Java中实现接口的具体代码示例
    可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
    96 38
    |
    25天前
    |
    安全 Java 编译器
    深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
    `synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
    47 3
    |
    2月前
    |
    Java
    java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
    java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
    63 24
    |
    1月前
    |
    前端开发 Java 测试技术
    java日常开发中如何写出优雅的好维护的代码
    代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
    66 2
    |
    1月前
    |
    Java 编译器 数据库
    Java 中的注解(Annotations):代码中的 “元数据” 魔法
    Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
    89 5
    |
    1月前
    |
    存储 算法 Java
    Java 内存管理与优化:掌控堆与栈,雕琢高效代码
    Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
    71 5
    |
    2月前
    |
    Java API 开发者
    Java中的Lambda表达式:简洁代码的利器####
    本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####