当前位置: 首页 > article >正文

JavaSE1.0(实战之图书管理系统)

项目背景

使用JavaSE实现的的一个图书管理系统,涵盖基础语法、封装、继承、多态等,内容简单实用,对初学者非常友好,是初学者首选的实践项目,能够很好的熟悉语法知识,帮助快速理解前面所学语法内容,加深对语法的理解与使用。

实现思路 

项目代码

book包

图书类
package book;

/**
 * 创建一个图书类
 * 定义成员变量书名、作者、价格、书的类型、是否被借出
 * 成员变量访问权限为private权限
 * 构造方法初始化成员变量
 * 给每个成员变量创建get和set方法用来访问
 */
public class Book {
    private String name;//书名
    private String author;//作者
    private double price;//价格
    private String type;//书的类型
    private boolean isBorrowed;//是否被借出

    public Book(String name, String author, double price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;

    }
//调用get方法返回name,得到书名
    public String getName() {
        return name;
    }
//调用set方法,把私有成员变量name给到一个公有的name,这样就可以使用name
    public void setName(String name) {
        this.name = name;
    }
//同上述所讲
    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
//同上所述
    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

    /**
     * 重写一个toString方法,把图书转换成字符串格式
     * @return
     */
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ((isBorrowed == true) ? "已经被借出 " : " 未被借出")
                /*", isBorrowed=" + isBorrowed*/ +
                '}';
    }
}
  • 代码中有注释度代码进行讲解

书架类
package book;

public class BookList {
    private Book[] books = new Book[20];//抽象一个书架
    private int count;//计数书架中的书

    /**
     * 创建一个书架类BookList
     * 定义两个成员变量books和count
     * books数组用来存放图书 = 书架,访问权限是私密访问权限,类型为book类型,count用来计数书架中有多少书籍
     * 创建一个构造方法BookList用来初始化成员变量books和count
     * 给每个成员变量创建get和set方法用来访问成员
     */
    public BookList() {
        this.books[0] = new Book("三国演义","罗贯中",18.9,"经典小说");
        this.books[1] = new Book("西游记","吴承恩",19.9,"经典小说");;
        this.books[2] = new Book("红楼梦","曹雪芹",21.9,"经典小说");;
        this.books[3] = new Book("水浒传","施耐庵",20.9,"经典小说");;
        this.books[4] = new Book("社会契约论","卢梭",29.7,"西方哲学");
        this.count = 5;

    }
    //通过下标来获取当前所对应的图书
  public Book getBook(int pos) {
        return books[pos];
  }
  //每次创建图书把值传回来,在pos位置新增图书
  public Book setBook(int pos, Book book) {
        return books[pos] = book;
  }
    public Book[] getBooks() {
        return books;
    }

    public void setBooks(Book[] books) {
        this.books = books;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}
  • 代码中有对代码的注释

openation包

IOperation接口
package openation;

import book.BookList;

/**
 * 定义一个接口IOperation,用作公共标准
 * 给定一个抽象方法work,参数类型为BookList
 * 继承接口则重写work方法
 */
public interface IOperation {

    void work(BookList bookList);

}
新增图书类 
package openation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation{
    /**
     * 创建一个新增图书类AddOperation,用来新增图书,继续接口IOperation
     * 重写接口的抽象方法work,参数类型为书架bookList,通过操作参数bookList来实现新增图书
     * work方法中实现了具体的新增图书的功能
     * 1输入图书的各种参数书名、作者、价格、所属类型,需要把价格之后的回车接收
     * 2实例化一个Book对象,调用构造方法,得到一本新的图书
     * 3创建一个整型变量currentCount用来接收获取bookList里面的count的值
     * 4调用bookList里面setBook方法,把currentCount值和book新的图书传给bookList.setBook
     * 5、把数组的下标往后移一位,调用里面bookList的.setCount方法,给count+1
     * @param bookList
     */
    public void work(BookList bookList) {

        System.out.println("请输入新增的图书:");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入书名:");
        String name = scanner.nextLine();
        System.out.println("请输入作者:");
        String author = scanner.nextLine();
        System.out.println("请输入价格:");
        double price = scanner.nextDouble();
        String d = scanner.nextLine();
        System.out.println("请输入所属类型:");
        String type = scanner.nextLine();

        Book book = new Book(name,author,price,type);

        int currentCount = bookList.getCount();

        bookList.setBook(currentCount,book);
        System.out.println("图书新增成功");
        bookList.setCount(currentCount + 1);
    }
}
删除图书类
import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * 创建一个删除图书的类DeleteOperation,继承接口IOperation
 * 重写接口中的work方法来实现删除图书的操作
 * 1给出提示删除图书,整型变量currentCount用来获取接收当前bookList.getCount()的下标
 * 2判断书架是否存在书籍,没有书籍直接返回
 * 3输入要删除的书名,设置一个整型变量index,值为负数
 * 4遍历数组,创建一个Book类的book用来接收当前下标的书籍,通过书名来判断是否存在与书架中
 * 5如果存在则把下标i给index跳出循环,不存在相同书名的则提示书籍不存在
 * 6通过循环,从index开始把数组下标的后一位给前一位,做到覆盖 = 删除,每次存在setBook方法中
 * 7把计数器count往前移动一位
 */
public class DeleteOperation implements IOperation{

    @Override
    public void work(BookList bookList) {

        System.out.println("请输入需要删除的图书:");

        int currentCount = bookList.getCount();

        if(currentCount == 0) {

            System.out.println("书架为空,无法删除");

            return;
        }

        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入书名:");

        String name = scanner.nextLine();

        int  index = -1;

        for (int i = 0; i < currentCount; i++) {
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)) {
                index = i;
                break;
            }

        }
        if(index == -1) {
            System.out.println("暂时不存在这本书");
            return;
        }
        for (int i = index; i < currentCount-1; i++) {
            Book book = bookList.getBook(i + 1);
            bookList.setBook(i,book);
        }
        System.out.println("图书删除成功");
        bookList.setCount(currentCount-1);
    }
}
 查找图书类
import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindOperation implements IOperation{
    /**
     * 实现查找图书的操作,继续接口IOperation,参数类型BookList
     * 重写抽象方法work,在里面实现查找图书这个操作
     * 1输入需要查找的书名,获取当前数组的下标
     * 2遍历数组,获取当前对应下标的书籍,通过书名对比查找是否存在这本书,
     * 3找到则给出提示并输出书籍信息返回,没有找到则提示不存在书籍
     * @param bookList
     */
    public void work(BookList bookList) {

        System.out.println("请输入需要查找的图书:");

        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        int currentCount = bookList.getCount();

        for (int i = 0; i < currentCount; i++) {

            Book book = bookList.getBook(i);

            if(book.getName().equals(name)) {

                System.out.println("找到了你要找的书:");

                System.out.println(book);

                return;
            }

        }
        System.out.println("暂时没有这本书");
    }
}
显示图书类
import book.Book;
import book.BookList;
import openation.IOperation;

/**
 * 实现显示所有图书的操作ShowOperation类,继承接口IOperation,参数类型为BookList
 * 重写work方法,参数BookList,获取当前下标
 * 1遍历所有书籍,并输出书籍信息
 */
public class ShowOperation implements IOperation {

    @Override

    public void work(BookList bookList) {
        int currentSize = bookList.getCount();

        System.out.println("显示所有图书:");

        for (int i = 0; i < currentSize; i++) {

            Book book = bookList.getBook(i);

            System.out.println(book);
        }
    }
}
借阅图书类
import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * 创建一个借阅图书的类BorrowedOperation,用来实现图书的借阅
 * 继承接口IOperation,需要重写work这个抽象方法
 * 1重写work方法,参数为BookList书架类型,通过操作BookList来实现图书的借阅
 * 2输入需要借阅的图书名称,整型变量currentCount用来接收获取bookList.getCount()里面的值
 * 通过遍历数组来查找是否存在要借阅的书籍
 * 创建一个Book类的变量book,通过调用bookList.getBook,用来获取当前下标中的书籍是什么
 * if判断当前下标书籍的名称是否跟需要借阅的书籍名称一致
 * 找到之后在用if判断当选书籍的状态是true还是false,是否被借出,找到则返回,没找到给出提示
 */
public class BorrowedOperation implements IOperation{
    @Override
    public void work(BookList bookList) {

        System.out.println("请输入需要借阅的图书");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入书名:");
        String name = scanner.nextLine();

        int currentCount = bookList.getCount();

        for (int i = 0; i < currentCount; i++) {

            Book book = bookList.getBook(i);

            if(book.getName().equals(name)) {
                if(!book.isBorrowed()) {
                    book.setBorrowed(true);
                    System.out.println("借阅成功");
                }else {
                    System.out.println("已经被借出");
                }
                return;
            }
        }

        System.out.println("没有你要借阅的图书");
    }
}
归还图书类 
import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * 实现一个归还图书的操作ReturnOperation类,继承接口IOperation,参数类型BookList
 * 1--重写work方法,提示操作,输入书名,获取当前数组下标
 * 2--遍历书籍,通过对比书名是否一样来确认是否可以归还
 * 3如果存在则归还图书,把图书状态设置为false,没有则给出提示
 */
public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入需要归还的图书:");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入书名:");
        String name = scanner.nextLine();

        int currentSize = bookList.getCount();

        for (int i = 0; i < currentSize; i++) {

            Book book = bookList.getBook(i);

            if(book.getName().equals(name)) {
                book.setBorrowed(false);
                System.out.println("归还成功");
                return;
            }
        }
        System.out.println("没有你要归还的图书");
    }
}

user包

User类(抽象类)
import book.BookList;
import openation.IOperation;

public abstract class User {
    /**
     * 创建一个抽象类User,用户
     * 定义两个成员变量String类型的name和IOperation[]类型的iOperations数组
     * 创建一个带有参数的构造方法,获取当前输入的对象
     * 定义一个抽象方法menu(),返回值的int
     * 定义一个doOperation方法,参数为整型choice和BookList类型的书架
     * 给数组iOperations传入下标choice,调用方法work,传参类型bookList
     * 根据下标不同,调用的书籍不同
     */
    protected String name;

    public IOperation[] iOperations;

    public User(String name) {
        this.name = name;
    }

    public abstract int menu();

    public void doOperation(int choice, BookList bookList) {

        iOperations[choice].work(bookList);

    }
}
管理员类
import openation.ShowOperation;
import openation.*;

import java.util.Scanner;

/**
 * 实现管理员操作界面AdminUesr类,继承父类User
 * 创建带有一个参数的构造方法初始化父类成员和构造自己的成员
 * 1构造方法的参数name,super(name)帮助父类构造的构造
 * 2this引用当前对象,初始化IOperation[]类型的数组里面的数据
 * 3数组里面创建对应用户的操作的对象,(关键一步,把用户和对应的操作关联起来了)
 * 4重写menu()方法,返回值为整型,里面输出管理员用户可以操作的对应信息
 * 5输入一个数,返回输入的数。
 */
public class AdminUesr extends User{

    public AdminUesr(String name) {
        super(name);
        this.iOperations = new IOperation[] {
                new ExitOperation(),
                new FindOperation(),
                new ShowOperation(),
                new AddOperation(),
                new DeleteOperation()
        };
    }
    public int menu() {
        System.out.println("-------------------------------------------------------");
        System.out.println("-------------------------------------------------------");
        System.out.println("欢迎进入图书管理系统" + "   " + 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("-------------------------------------------------------");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}
普通用户类
import openation.*;

import java.util.Scanner;

public class NomalUser extends User{
    /**
     * 创建一个子类普通用户类NomalUser继承父类User
     *1构造方法的参数name,super(name)帮助父类构造的构造
     *2this引用当前对象,初始化IOperation[]类型的数组里面的数据
     *3数组里面创建对应用户的操作的对象,(关键一步,把用户和对应的操作关联起来了)
     *4重写menu()方法,返回值为整型,里面输出普通用户可以操作的对应信息
     *5输入一个数,返回输入的数。
     * @param name
     */
    public NomalUser(String name) {
        super(name);
        this.iOperations = new IOperation[] {
                new ExitOperation(),
                new FindOperation(),
                new BorrowedOperation(),
                new ReturnOperation(),
        };
    }
    public int menu() {
        System.out.println("-------------------------------------------------------");
        System.out.println("-------------------------------------------------------");
        System.out.println("欢迎进入图书管理系统" + "   " +  this.name + "   ");
        System.out.println("1--查找图书");
        System.out.println("2--借阅图书");
        System.out.println("3--归还图书");
        System.out.println("0--退出图书管理系统");
        System.out.println("-------------------------------------------------------");
        System.out.println("-------------------------------------------------------");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

Main类程序运行

import book.BookList;
import user.AdminUesr;
import user.NomalUser;
import user.User;

import java.util.Scanner;

public class Main {
/**
 * 1、创建一个静态方法login,用来确认是普通用户还是管理员,返回值为父类User
 * 1.1调用库函数Scanner用来输出,提示下一步操作进行交互,输入用户名
 * 1.2提示下一步的操作,根据输入来确认是普通用户还是管理员
 * 1.3if语句判断输入的值,根据输入的值返回
 * 1.4创建一个管理员对象或者普通用户对象,传参name
 * 1.5执行对象的构造方法,User接收返回值(向上转型)
 */
    public static User login() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        String name = scanner.nextLine();
        System.out.println("请输入你的身份: 1 --》 管理员  0 --》 普通用户");
        while (true) {
            int choice = scanner.nextInt();
            if (choice == 1 || choice == 0) {
                if (choice == 1) {
                    return new AdminUesr(name);
                } else {
                    return new NomalUser(name);
                }
            } else {
                System.out.println("输入错误请重新输入");

            }
        }
    }

    /**
     * 2、main执行程序
     * 2.1实例化一个bookList对象,构造BookList,进行一个初始化
     * 2.3定义一个user类型的变量user调用login方法,可以确认用户是普通用户还是管理员
     * 2.4设置一个while循环确保程序可以重复多次操作,根据不同的用户调用不同的menu()方法
     * 2.4重写了父类方法,(多态)
     * 2.5user调用父类本身的方法doOperation,传参choice和bookList
     * 2.5choice = 输入的数值 = 要选择的操作,bookList = 数组 = 书架
     * 执行完一次回到循环开始的时候
     * @param args
     */
    public static void main(String[] args) {

        BookList bookList = new BookList();

        User user = login();
        while (true) {
            int choice = user.menu();

            user.doOperation(choice, bookList);

           /* System.out.println(choice);
            System.out.println(user);*/
        }
    }
}


http://www.kler.cn/a/597316.html

相关文章:

  • Ubuntu-Server 设置多个ip和多个ipv6 笔记250320
  • 【AIGC 前沿】蓝耘 MaaS 搭载海螺 AI 视频,开启视频创作 “芯” 时代
  • 自定义reset50模型转换到昇腾om
  • ubuntu高并发内核参数调优 - (集群服务端调优)
  • docker compose部署minio报错
  • 【后端】【djanog】【进阶】【models】自定义模型方法 (`Model Methods`)——封装业务逻辑
  • 物联网 - JetLinks与ThingsBoard技术选型对比
  • liquid-dsp下windows的编译
  • 跨境电商IP安全生死线,住宅代理与浏览器指纹攻防实录
  • 阿里云国际站代理商:如何构建交互式安全分析看板?
  • CCF开源发展委员会常委会会议召开,共绘开源新蓝图
  • JavaScript事件
  • ref setState 合成事件
  • 第十六届蓝桥杯康复训练--5
  • 单片机原理与应用笔记
  • Excel(进阶篇):powerquery详解、PowerQuery的各种用法,逆透视表格、双行表头如何制作透视表、不规则数据如何制作数据透视表
  • 【Vitis AIE】FPGA图像处理 11 双线性插值 Bilinear Interpolation
  • 使用 ncurses 库创建文本用户界面:基础函数详解
  • 淘宝历史价格数据获取指南:API 与爬虫方案的合法性与效率对比
  • Baklib智能内容推荐的核心是什么?