图书管理系统(Java简单版)(完整代码+详解)

news2024/11/23 6:48:34

目录

详解: 

BookList类:

InOperation接口 

User类(父类) 和 Main类(这俩要一起看)

完整代码 

book包 

Book类 

BookList类

operation包 

 AddBook类

BorrowBook类

DeleteBook类

FindBook类

PrintBook类

ReturnBook类

Exit类

InOperation接口

user包 

Domestic类

Administrator类

User类 

Main类 


 

详解: 

按照上图逻辑来写, 因为要运行,所以要有个main函数

 

接下来我们来串联整个思路 

 

 接下来细说BookList类,InOperation接口和User类

BookList类:

1.先创建一个Book类 类型的数组(private 封装) 

 

2.再创建个书的个数的变量 (private 封装),然后创建构造方法,初始化成员(图书)(实例化BookList时直接就运行书架里的内容)(实例化一个Book对象,有参类型,所以Book类哪里要先创建有参的构造方法)

 

既然封装了就要有Getter和Setter (下面系统自动生成步骤)

 

当然自动生成的和我们要的还是有点差别的,我们要稍微改动一下 

 

 

InOperation接口 

因为每一个操作功能都要有对应的工作,所以干脆创建个接口 ,对代码更好的规范

 

User类(父类) 和 Main类(这俩要一起看)

各个包类都创建好了,但是他们如果串联运行呢,要有main才能运行起来,怎么搞,往下看 

 

(上面可能看不太清,可以对着下面看一下,或者对着代码看) 

 

 

剩下的方法实现起来都蛮简单的,对比着代码看看就能懂,不多说了 😊😊

完整代码 

book包 

Book类 

package book;

public class Book {
    private String name;
    private String author;
    private double price;
    private String type;
    private boolean borrowed;//默认false
    public Book(String name, String author, double price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    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;
    }

    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 borrowed;
    }

    public void setBorrowed(boolean borrowed) {
        this.borrowed = borrowed;//借出true
                                 //未被借出false
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ((borrowed == false)?"   未被借出":"   已借出") +
                '}';
    }
}

BookList类

package book;

public class BookList {
    //创建数组存放书
    private Book[] books = new Book[10];



    private int book_size;//书的个数
    //构造方法,初始化成员(图书)(示例化BookList时直接就运行书架里的内容)
    public BookList() {
        this.books[0] = new Book("三国演义", "罗贯中", 23.1, "小说");//实例化一个Book对象,有参类型,所以Book类哪里要先创建有参的构造方法
        this.books[1] = new Book("西游记", "吴承恩", 45.1, "小说");
        this.books[2] = new Book("红楼梦", "曹雪芹", 33.2, "小说");
        this.books[3] = new Book("水浒传", "施耐庵", 23.2, "小说");
        this.book_size = 4;
    }

    public Book getBooks(int pos) {
        return books[pos];
    }

    public void setBooks(int pos, Book book) {
        this.books[pos] = book;//新增图书需要
    }

    public int getBook_size() {
        return book_size;
    }

    public void setBook_size(int book_size) {
        this.book_size = book_size;
    }

}

operation包 

 AddBook类

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddBook implements InOperation{

    @Override
    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("请输入图书的价格:>");
        int price = scanner.nextInt();
        scanner.nextLine();
        System.out.println("请输入图书的类型:>");
        String type = scanner.nextLine();

        Book book = new Book(name, author, price, type);//实例化Book对象,存新增的书
        int currentSize = bookList.getBook_size();//当前剩下的书的数量
        for(int i = 0; i < currentSize; i++){
            Book book1 = bookList.getBooks(i);
            if(book1.getName().equals(name)){
                System.out.println("书架已有此书,不必添加");
            }
            return;
        }
        bookList.setBooks(currentSize, book);
        bookList.setBook_size(currentSize + 1);
        System.out.println("添加成功!!!");
    }
}

BorrowBook类

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class BorrowBook implements InOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");
        System.out.println("请输入所借图书名字");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentSize = bookList.getBook_size();

        for(int i = 0; i < currentSize; i++){
            Book book = bookList.getBooks(i);
            if(book.getName().equals(name)){
                if(book.isBorrowed() == false) {
                    book.setBorrowed(true);
                    System.out.println("存在该书,欢迎借阅");
                }else {
                    System.out.println("该书不存在,对不起");
                }
                return;
            }

        }
    }
}

DeleteBook类

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class DeleteBook implements InOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");
        System.out.println("请输入你要删除的图书名字:>");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentSize = bookList.getBook_size();
        if(currentSize == 0){
            System.out.println("书架为空");
        }

        int flag = -1;
        for(int i = 0; i < currentSize; i++){
            Book book = bookList.getBooks(i);
            if(book.getName().equals(name)){
                flag = i;
                break;
            }
        }
        if(flag == -1){
            System.out.println("该书不存在");
            return;
        }

        //虽然这样访问不到最后一本书,但是书的数量减一了,这样就自然没了最后一本书
        for(int i = flag; i < currentSize - 1; i++) {
            bookList.setBooks(flag, bookList.getBooks(i + 1));
        }
        bookList.setBook_size(currentSize - 1);
        System.out.println("删除成功");
    }
}

FindBook类

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindBook implements InOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("寻找图书");
        System.out.println("输入图书名字;>");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        int currentSize = bookList.getBook_size();
        int index = -1;
        for(int i = 0; i < currentSize; i++){
            Book book = bookList.getBooks(i);
            if(book.getName().equals(name)) {
               index = i;
            }
        }
        if(index == -1){
            System.out.println("该书不存在");
            return;
        }
        Book book = bookList.getBooks(index);
        System.out.println(book);
    }
}

PrintBook类

package operation;

import book.Book;
import book.BookList;

public class PrintBook implements InOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示全部图书");
        int currentSize = bookList.getBook_size();
        for(int i = 0; i < currentSize; i++){
            Book book = bookList.getBooks(i);
            System.out.println(book);
        }
    }
}

ReturnBook类

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReturnBook implements InOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");
        System.out.println("请输入图书名字");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentSize = bookList.getBook_size();
        for (int i = 0; i < currentSize; i++){
            Book book = bookList.getBooks(i);
            if(book.getName().equals(name)){
                book.setBorrowed(false);
                System.out.println("归还成功");
                return;
            }
        }
        System.out.println("没这本书");
    }
}

Exit类

package operation;

import book.BookList;

public class Exit implements InOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统");
        int currentSize = bookList.getBook_size();
        for(int i = 0; i < currentSize; i++){
            bookList.setBooks(i,null);
        }
        bookList.setBook_size(0);
        System.exit(0);
    }
}

InOperation接口

package operation;

import book.BookList;

public interface InOperation {
      void work(BookList bookList);//因为这些操作都是在书架上,所以传参位BookList类型
}

user包 

Domestic类

package user;

import operation.*;

import java.util.Scanner;

import book.BookList;

public class Domestic extends User{
    public Domestic(String name) {
        super(name);
        this.inOperations = new InOperation[]{
                new Exit(),
                new BorrowBook(),
                new ReturnBook(),
                new FindBook()//记得都要实例化对象才能用,因为他们都是类
        };
    }


    @Override
    public int menu() {
        System.out.println("**********当当当!!!欢迎来到普通用户的菜单~~ *********");
        System.out.println("1.借阅图书       2.归还图书 ");
        System.out.println("        3.查找图书       ");
        System.out.println("        0.退出系统         ");
        System.out.println("请输入你想要进行的操作所对应的数字~~");
        Scanner s = new Scanner(System.in);
        int input = s.nextInt();
        return input;
    }
}

Administrator类

package user;
import operation.*;

import java.util.Scanner;
public class Administrator extends User{
    public Administrator(String name) {
        super(name);
        this.inOperations = new InOperation[]{
          new Exit(),
          new AddBook(),
          new DeleteBook(),
          new FindBook(),
          new PrintBook()
        };
    }

    @Override
    public int menu() {
        System.out.println("**********当当当!!!欢迎来到管理员的菜单~~ *********");
        System.out.println("1.新增图书       2.删除图书 ");
        System.out.println("3.查找图书       4.显示全部图书 ");
        System.out.println("        0.退出系统         ");
        System.out.println("请输入你想要进行的操作所对应的数字~~");
        Scanner s = new Scanner(System.in);
        int input = s.nextInt();
        return input;
    }
}

User类 

package user;

import book.BookList;
import operation.InOperation;

public abstract class User {
    private String name;
    public InOperation[] inOperations;//用public哟,以便其他地方使用

    public User(String name) {
        this.name = name;
    }
    public abstract int menu();
    public void doOperation(int choice, BookList bookList){
        inOperations[choice].work(bookList);
        //找到了对应的操作功能    调用相应的work方法
    }
}

Main类 

import book.BookList;
import user.Administrator;
import user.Domestic;
import user.User;

import java.util.Scanner;
public class Main {
    public static User login(){
        System.out.println("********** ~~欢迎来到图书管理系统~~ **********");
        System.out.println("请登录/注册");
        System.out.println("请选择你的身份   1 ---> 管理员     0 ---> 普通用户");
        Scanner s = new Scanner(System.in);
        int choice = s.nextInt();
        System.out.println("请输入你的名字");

        String name = s.next();
        if(choice == 1){
            return new Administrator(name);
        }else {
            return new Domestic(name);
        }
    }

    public static void main(String[] args) {
        BookList bookList = new BookList();//实例化对象
        User user = login();//这个确定身份(管理员或者普通用户)
        while(true){
            int choice = user.menu();//这个确定进行什么操作
            user.doOperation(choice, bookList);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/519169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32 FreeRTOS学习总结

2023.5.11 1.Task 创建任务常用API&#xff1a; 任务函数描述xTaskCreate()使用动态的方法创建一个任务xTaskCreatePinnedToCore指定任务的运行核心(最后一个参数)vTaskDelete(NULL)删除当前任务 BaseType_t xTaskCreate(TaskFunction_t pxTaskCode, // 任…

【HBase】架构

文章目录 整体架构Master负载均衡器元数据管理器预写日志处理器 Region ServerZookeeperHDFS Master架构Meta 表格 RegionServer 架构MemStoreWALBlockCache 读写流程HFile结构写流程读操作 整体架构 Master 实现类为 HMaster。 负责监控集群中所有的 RegionServer 实例。 &…

在Fedora-Workstation-Live-x86_64-36-1.5中使用佳能喷墨打印机ip2780

在Fedora-Workstation-Live-x86_64-36-1.5中使用佳能喷墨打印机ip2780 操作系统是64位的Fedora-Workstation-Live-x86_64-36-1.5.iso&#xff0c;实物打印机是佳能ip2780&#xff0c;USB接口 应用程序——其它——设置——打印机——解锁——输入root密码——将打印机USB插入电…

Redis数据结构——动态字符串、Dict、ZipList

一、Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff1a; 获取字符串长度…

智慧产业城彰显中国智造魅力,中联重科踏出“走上去”的关键一步

5月11日至14日&#xff0c;中联重科在长沙举行了“科技献礼新时代”系列活动。 借着活动&#xff0c;松果财经实地探访了全球规模最大、品种最全的工程机械产业基地&#xff0c;领略了前沿技术赋能先进制造的魅力。 作为湖南省“一号工程”和“十大重点项目之首”&#xff0c…

好家伙,又一份牛逼笔记面世了...

最近网传的一些裁员的消息&#xff0c;搞的人心惶惶。已经拿到大厂offer的码友来问我&#xff1a;大厂还能去&#xff0c;去了会不会被裁。 还在学习的网友来问我&#xff1a;现在还要冲互联网么&#xff1f; 我是认为大家不用恐慌吧&#xff0c;该看啥看啥&#xff0c;该学啥…

你一定要知道的unittest自动化测试框架详解

目录 框架的概念 Unittest单元测试框架 常用的assert语句 unittest创建测试代码的方式&#xff1a; unittest构建测试套件&#xff08;测试用例集合&#xff09;&#xff1a; unittest忽略测试用例&#xff1a; 运行测试集 批量执行测试用例 生成HTMLTestRunner测试报告…

【运维知识进阶篇】集群架构-Nginx基础(安装+启动+配置+多业务实现+日志管理)

本篇文章介绍下Nginx有关内容&#xff0c;Nginx是一个开源且高性能、可靠的Http Web服务、代理服务。 开源&#xff1a;直接获取源代码&#xff0c;高性能&#xff1a;支持海量并发&#xff0c;可靠&#xff1a;服务稳定 Web服务有很多&#xff0c;选择Nginx是因为他的轻量化…

【软件测试】测试开发的一生之敌-BUG

文章目录 1.前言2.如何描述/创建一个BUG3.BUG的级别4.BUG的生命周期5.跟开发产生争执怎么办 1.前言 BUG相比大家都知道,程序运行出错或者与预期不符就是BUG.现在我们来用测试人员的角度来看待BUG. 2.如何描述/创建一个BUG 测试人员要测试开发人员的代码,找出开发人员可能忽略…

敏态开发在大兴机场数字化转型中的实践

一、最大事业是育人 大兴机场是一个年轻的企业&#xff0c;作为一个企业来讲&#xff0c;最宝贵的就是人才。我们在2017年开始社招大学生&#xff0c;到目前为止&#xff0c;公司有一半都是30岁左右的年轻人&#xff0c;并且每年都会招几十个。年轻人特别想做事&#xff0c;而…

C++之内存管理及函数模版

C中的内存管理机制和C语言是一样的&#xff0c;但在具体内存管理函数上&#xff0c;C语言的malloc已经无法满足C面向对象销毁的需求&#xff0c;于是祖师爷在C中新增了一系列内存管理函数&#xff0c;即 new 和 delete 著名段子&#xff1a;如果你还没没有对象&#xff0c;那就…

( 位运算 ) 342. 4的幂 ——【Leetcode每日一题】

❓342. 4的幂 难度&#xff1a;简单 给定一个整数&#xff0c;写一个函数来判断它是否是 4 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 4 的幂次方需满足&#xff1a;存在整数 x 使得 n 4 x n 4^x n4x。 示例 1&…

src学习记录(二)

学习目标&#xff1a; Apache Shiro ThinkPHP struts2 Apache Log4j Fastjson Weblogic 学习内容&#xff1a; 1.Apache Shiro 字段内容指纹信息请求包中&#xff0c;在Cookie信息中给 rememberMe变量赋任意值&#xff0c;收到返回包的Set-Cookie 值存在 rememberMedeleteMe …

类和对象【C++】【下篇】

目录 一、初始化列表 二、隐式类型转换 三、静态成员 四、友元 1、友元函数 2、友元类 五、内部类 六、匿名对象 一、初始化列表 下面是日期类的一个构造函数&#xff0c;调用该构造函数后&#xff0c;对象中已经有了一个初始值&#xff0c;但并不能将它称为对对象成员变…

实时操作系统内存管理-TLSF算法

内存管理-TLSF算法 前言TLSF算法&#xff1a;为什么内存又叫内存“块”&#xff1a;O(1)查找空闲块&#xff1a;确定fl&#xff1a;确定sl&#xff1a;提级申请&#xff1a;分割块&#xff1a; 空闲块如何串成链表&#xff1f;减少外部碎片&#xff1a;查找上下块&#xff1a; …

Java补充之MySQL入门必备知识

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/java-tutorial 】或者公众号【AIShareLab】回复 java 也可获取。 文章目录 零基础学MySQL解决之道文件、数据库MySQL 数据库的安装和配置使用命令行窗口连接MYSQL 数据库操作示意图 数据库三层结构数…

使用Intellij IDEA创建新项目时,maven路径总是默认的,一创建maven就卡死

目录 使用Intellij IDEA创建新项目时&#xff0c;maven路径总是默认的 弄了老半天&#xff0c;终于把这个破玩意给弄好了&#xff0c;真的没有意思&#xff0c;真的很恶心 我经历了两个过程&#xff0c;一个是 使用Intellij IDEA创建新项目时&#xff0c;maven路径总是默认的…

用免费蜜罐工具配置Modbus工控蜜罐

导语&#xff1a;本文将用DecoyMini免费蜜罐工具来配置自定义的ModbusTCP工控仿真模板&#xff0c;并介绍部署后的Modbus蜜罐的使用效果。 DecoyMini是一个免费的蜜罐工具&#xff0c;其特色是仿真能力采用与软件松耦合的仿真模板来进行管理。通过一键式导入云端仿真模板库里的…

【Linux】多线程 --- 线程同步与互斥+生产消费模型

人生总是那么痛苦吗&#xff1f;还是只有小时候是这样&#xff1f; —总是如此 文章目录 一、线程互斥1.多线程共享资源访问的不安全问题2.提出解决方案&#xff1a;加锁&#xff08;局部和静态锁的两种初始化/销毁方案&#xff09;2.1 对于锁的初步理解和实现2.2 局部和全局锁…