Java入门项目——读书管理系统

news2025/8/7 7:50:39

Java简单实现读书管理系统

  • 一、前言
  • 二、思路及整体框架
  • 三、代码展示
    • 1.有关读书包(Book)
    • 2.有关用户包
    • 3.有关操作书的包

一、前言

相信有很多小伙伴学习完了【JavaSE】基础语法,想知道自己到底学的怎么样,或则学完不知道这么把知识点连窜起来使用,自己学到的知识会用才是真正的学到了。

下面就来领取你的第一个Java入门项目(读书管理系统),这里我们肯定是有针对性的去完成的,里面涵盖了许多知识点,例如:数组、循环以及面向对象方面的知识,主要是封装、继承、多态、抽象类、接口、代码块等等的知识点,相信你自己去实现一遍再和小编的实现进行对比或者直接拿来进行学习一定会有所收获。

学完【JavaSE】写的读书管理系统,编译器用到是IDEA,数据存储在内存中,这里没有用到数据库,随着学习的深入可以后面再改进的哦,实现了读书的查询、添加、删除、借阅、归还、修改。分为管理员和用户。

码源地址gitee):

二、思路及整体框架

**

  • 思路
    随着学习的深入,做项目无从下手,首先要弄明白有什么需求,有需求我们才去实现的嘛,然后再考虑程序的框架,先把框架搭起来,这个过程可以减少后续的很多麻烦。

  • 整体框架:
    正如上面所说的读书管理,既然有读书,那就免不了需要管理,这样我们就可以把有关读书信息的放到一个包下(Book),在这个包下再创建有关读书的类。有用户分为管理员和普通用户,我们就可以把管理员和普通用户放到一个包(User)下,再这个包下再创建有关用户的类。有关于读书的操作,比如增加、删除读书,我们也可以单独的把它写到一个包(Operate)下,再这个包下再创建有操作读书的类。

**

这里为小编搭的框架:

在这里插入图片描述

为什么要说先搭框架呢?而不是先把一个个功能先实现呢?道理很简单,我先搭框架,我就能以一个整体的思想去实现这个项目,即使我们把所需要的包以及类全部都创建出来后,你写起来就不会那么的绕,你也一个很好功能实现顺序,会减少很多的开发时间,效率也高。

三、代码展示

1.有关读书包(Book)

这里创建一个Book类来存储有关读书学习的类,所有有关读书的信息我都封装在这个类中。

package Book;

public class Book {
	//书的属性
    private String name;
    private String author;
    private String type;
    private double price;
    private boolean isBorrowed;//表示书籍状态,是否被借阅,默认false没有借阅

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

    public void setType(String type) {
        this.type = type;
    }

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

    public void isBorrowed(boolean flag) {
        this.isBorrowed = flag;
    }

    public boolean getIsBorrow() {
        return isBorrowed;
    }
	
	//重写toString方法,方便把每本读书信息打印出来
    @Override
    public String toString() {
        return "Book{" +
                "name ='" + name + '\'' +
                ", author ='" + author + '\'' +
                ", type ='" + type + '\'' +
                ", price =" + price +
                ", isBorrowed =" + (isBorrowed ? "已被借阅!" : "未被借阅") +
                '}';
    }
}

在这个包下我们在创建BookShelf类表示书架,用来管理我的每一本书,这里用到一个组合的思想,用Book类型的变量作为Bookshelf的成员变量。

package Book;

public class BookShelf {
    private static final int BOOK_NUMBER = 100;//书籍容量
    private Book[] books = new Book[BOOK_NUMBER];
    private int currentNumber;//当前书籍的数量

    /**实例代码块/非静态代码块
     * 在我实例这个类的对象的时候就已经加载了着三本书
     */
    {
        books[0] = new Book("三国演义", "罗贯中", "小说", 69.9);
        books[1] = new Book("红楼梦", "曹雪芹", "小说", 49.9);
        books[2] = new Book("水浒传", "施耐庵", "小说", 59.9);

    }
    public void setCurrentNumber(int currentNumber) {
        this.currentNumber = currentNumber;
    }

    //获取书籍列表长度
    public int getCurrentNumber() {
        int index = 0;
        while (books[index] != null) {
            index++;
        }
        return index;
    }

    public void setBooks(int pos, Book book) {
        this.books[pos] = book;
    }
    
    public Book[] getBooks() {
        return books;
    }
    public Book getBook(int pos) {
        return this.books[pos];
    }
    
    //判断书籍是否存在,存在就返回下标,不存在就返回-1
    public int isExist(String name) {
        int length = this.getCurrentNumber();
        for (int i = 0; i < length; i++) {
            if (this.books[i].getName().equals(name)) {
                return i;
            }
        }
        return -1;
    }
}

2.有关用户包

这里有关用户就是管理员和普通用户,由于管理员和普通用户都是用户,这里就用到继承方面的知识,让普通用户(NormalUser)和管理员(AdministerUser)这两个类继承我的用户(User)类,由于我是不希望实例用户(User)这个类的实例对象的,所以这个类需设置为抽象类为宜,再由普通用户和管理员的菜单都不一样,我们就可以把菜单方法设置为抽象方法。这样操作之后我们不仅体验到抽象类的好处还有多态的好处。

抽象类User的实现:

package User;

import Book.BookShelf;
import Operation.Operate;

public abstract class User {
    protected String name;
    protected Operate[] operations;
    public User(String name) {
        this.name = name;
    }
	//抽象方法,继承我的子类必须单独实现这个方法
    public abstract void menu();
    
    //用户进行读书操作的方法,无非就是choice的值对应操作的方法
    public void doWork(int choice, BookShelf bookShelf) {
        this.operations[choice].operate(bookShelf);
    }
}

子类普通用户类和管理员的实现:

package User;

import Operation.*;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        super.operations = new Operate[] {
        		//直接赋值对应操作的对象,再实例这个类对象时就有这个操作功能
                new ExitOperation(),
                new BorrowOperation(),
                new ReturnOperation(),
                new SearchOperation()
        };
    }

	//重写抽象方法,属于普通用户的菜单
    @Override
    public void menu() {
        System.out.println("--------------欢迎来到普通用户管理系统--------------");
        System.out.println("--------------0.退出系统-------------------------------------");
        System.out.println("--------------1.借阅读书-------------------------------------");
        System.out.println("--------------2.归还读书-------------------------------------");
        System.out.println("--------------3.查找读书-------------------------------------");
        System.out.println("--------------请选择:》------------------------------------");
    }
}

package User;

import Operation.*;

public class AdministerUser extends User{

    public AdministerUser(String name) {
        super(name);
        super.operations = new Operation.Operate[]{
        		//直接赋值对应操作的对象,再实例这个类对象时就有这个操作功能
                new ExitOperation(),
                new AddOperation(),
                new DeleteOperation(),
                new SearchOperation(),
                new ShowOperation(),
                new UpdateOperation()
        };
    }
	//属于管理员的菜单方法
    @Override
    public void menu() {
        System.out.println("--------------欢迎来到普通用户管理系统--------------");
        System.out.println("--------------0.退出系统-------------------------------------");
        System.out.println("--------------1.添加读书-------------------------------------");
        System.out.println("--------------2.删除读书-------------------------------------");
        System.out.println("--------------3.查找读书-------------------------------------");
        System.out.println("--------------4.显示读书-------------------------------------");
        System.out.println("--------------5.修改读书-------------------------------------");
        System.out.println("--------------请选择:》------------------------------------");
    }
}

3.有关操作书的包

这里操作有增加、删除读书等操作,不过这些都是对书的操作,我们就可以在一个接口定义操作书的抽象方法,然后让每个操作书的类都实现这个接口,为什么这样做呢?这样可以实现多态啊,又用到多态的好处了😊😊😊。

接口operate的实现:

package Operation;

import Book.BookShelf;

public interface Operate {
    void operate(BookShelf bookShelf);
}

添加读书类的实现:

package Operation;

import Book.Book;
import Book.BookShelf;

import java.util.Scanner;

public class AddOperation implements Operate{
    @Override
    public void operate(BookShelf bookShelf) {
        System.out.println("添加读书!");
        System.out.println("请输入书名:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        System.out.println("请输入作者:");
        String author = sc.nextLine();
        System.out.println("请输入书籍类型:");
        String type = sc.nextLine();
        System.out.println("请输入书籍价格:");
        double price = sc.nextDouble();
        Book book = new Book(name,author,type,price);
        //获取书籍当前该插入的位置
        int length = bookShelf.getCurrentNumber();
        bookShelf.setBooks(length,book);

        System.out.println("添加成功!");
    }
}

删除读书类的实现:

package Operation;

import Book.Book;
import Book.BookShelf;

import java.util.Scanner;

public class DeleteOperation implements Operate{
    @Override
    public void operate(BookShelf bookShelf) {
        System.out.println("删除读书!");
        System.out.println("请输入要删除读书的名称:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        if(bookShelf.isExist(name) > 0) {
            int pos = bookShelf.isExist(name);
            if(pos == bookShelf.getCurrentNumber()) {
              bookShelf.setBooks(pos,null);
               bookShelf.setCurrentNumber(pos - 1);
                System.out.println("删除成功!");
            } else {
                int getTheEndBookPos = bookShelf.getCurrentNumber();
                Book book = bookShelf.getBook(getTheEndBookPos - 1);
                bookShelf.setBooks(pos,book);
                System.out.println("删除成功!");
            }
        } else {
            System.out.println("没有这本书,不能删除!");
        }
    }
}

借阅读书类的实现:

package Operation;

import Book.BookShelf;

import java.util.Scanner;

public class BorrowOperation implements Operate {
    @Override
    public void operate(BookShelf bookShelf) {
        System.out.println("借阅读书!");
        System.out.println("请输入要借阅读书的名字:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();

        if (bookShelf.isExist(name) >= 0 && !bookShelf.getBook(bookShelf.isExist(name)).getIsBorrow()) {
            int pos = bookShelf.isExist(name);
            bookShelf.getBook(pos).isBorrowed(true);
            System.out.println("借阅成功!");
        } else {
            System.out.println("没有这本书!");
        }
    }
}

归还读书类的实现:

package Operation;

import Book.BookShelf;

import java.util.Scanner;

public class ReturnOperation implements Operate{
    @Override
    public void operate(BookShelf bookShelf) {
        System.out.println("归还读书!");
        System.out.println("请输入你要归还读书的名称:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        if(bookShelf.isExist(name) >= 0 && bookShelf.getBook(bookShelf.isExist(name)).getIsBorrow()) {
            int pos = bookShelf.isExist(name);
            bookShelf.getBook(pos).isBorrowed(false);
            System.out.println("归还成功!");
        } else {
            System.out.println("没有这本书,不能归还!");
        }
    }
}

查询读书类的实现:

package Operation;

import Book.BookShelf;

import java.util.Scanner;

public class SearchOperation implements Operate{
    @Override
    public void operate(BookShelf bookShelf) {
        System.out.println("查找读书!");
        System.out.println("请输入要查找读书的名称:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        if(bookShelf.isExist(name) >= 0) {
            int pos = bookShelf.isExist(name);
            System.out.println(bookShelf.getBook(pos));
            System.out.println("查找成功!");
        } else {
            System.out.println("没有这本书,查找失败!");
        }
    }
}

展示读书类的实现:

package Operation;

import Book.BookShelf;

public class ShowOperation implements Operate{
    @Override
    public void operate(BookShelf bookShelf) {
        System.out.println("显示读书!");
        int length = bookShelf.getCurrentNumber();
        for (int i = 0; i < length; i++) {
            System.out.println(bookShelf.getBook(i));
        }
        System.out.println("显示成功!");
    }
}

修改读书类的实现:

package Operation;

import Book.BookShelf;

import java.util.Scanner;

public class UpdateOperation implements Operate {
    @Override
    public void operate(BookShelf bookShelf) {
        System.out.println("修改读书!");
        System.out.println("请输入要修改读书的名称:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        if (bookShelf.isExist(name) > 0) {
            int pos = bookShelf.isExist(name);

            System.out.println("请输入修改的书名:");
            String newName = sc.nextLine();
            bookShelf.getBook(pos).setName(newName);

            System.out.println("请输入要修改的作者:");
            String newAuthor = sc.nextLine();
            bookShelf.getBook(pos).setAuthor(newAuthor);

            System.out.println("请输入要修改的书籍类型:");
            String newType = sc.nextLine();
            bookShelf.getBook(pos).setType(newType);

            System.out.println("请输入要修改的价格:");
            double newPrice = sc.nextDouble();
            bookShelf.getBook(pos).setPrice(newPrice);

            System.out.println("修改成功!");
        }
    }
}

总结:整体来说学完语法对于有些小伙伴来说是还可以的,但是把它们串起来使用还是有一些难度,最好是要多去实现一下入门的小项目或者直接去了解别人已经写好的项目,自己在上手写一个项目可能对知识点掌握得深刻一些。

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

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

相关文章

JavaFX之Scene Builder的使用(开发一款GUI小工具原来这么简单)

文章目录一、前言二、JavaFX与Scene Builder下载三、Scene Builder的使用四、详细教学&#xff08;示例&#xff09;4.1 环境配置4.2 创建fxml文件以及Controller类文件4.3 自定义界面4.4 运行我们的程序五、拓展总结博主个人社区&#xff1a;开发与算法学习社区 博主个人主页&…

创建.gitignore文件并使用

创建 .gitignore文件 第一种方式 在项目根目录下直接创建一个文件&#xff0c;后缀改成 .gitignore 即可。 第二种方式 用git创建&#xff0c;到根目录下&#xff0c;执行 touch .gitignore&#xff0c;即可看见目录下已经出现了该忽略文件。 添加忽略规则 # 忽略所有以 …

httpOnly对于抵御Session劫持的个人小结

Ⅰ 什么是http only?起到什么防护作用&#xff1f; cookie中设置了HttpOnly属性&#xff0c;那么通过js脚本将无法读取到cookie信息&#xff0c;主要防护的攻击手段&#xff1a;XSS不能通过document对象直接获取cookie Ⅱ 怎么绕过http only的防护&#xff08;三种&#xff…

5、CSS——三种样式和样式优先级、CSS中颜色设置方式、标签选择器和基本选择器的优先级

目录 一、行内样式 二、内部样式 三、外部样式 1、创建外部样式步骤 2、引入外部样式的两种方式 2.1 第一种 2.2 第二种 3、style标签内的注释符号 四、样式优先级 五、CSS中颜色设置方式 1、使用颜色的英文单词 2、使用十六进制表示法 3、使用rgb()表示法…

Redis分区/分片详解

分区/分片详解 分区是分割数据到多个Redis实例的处理过程&#xff0c;因此每个实例只保存key的一个子集。 如果只使用一个redis实例时&#xff0c;其中保存了服务器中全部的缓存数据&#xff0c;这样会有很大风险&#xff0c;如果单台redis服务宕机了将会影响到整个服务。解决的…

easyExcel不同版本按照模板导出

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解压后存储都是在内存中完成的…

力扣(LeetCode)7. 整数反转(C++)

模拟 整数反转&#xff0c;需要一个中间变量 ansansans &#xff0c; 循环存入 xxx 的最低位 x%10x\%10x%10&#xff0c; 然后 xx/10x x/10xx/10 &#xff0c;得到 xxx 新的最低位 。如果进入新的循环&#xff0c;ans10ans\times 10ans10 &#xff0c;让上一次的 ansansans 十…

Makefile 基础(一) —— 自定义变量、预定义变量、自动变量

目录 一、自定义变量 1、定义变量 2、使用变量 3、修改变量的值 二、预定义变量 三、自动变量 一、自定义变量 1、定义变量 变量定义有两种方式&#xff0c;一种会在使用的时候递归展开&#xff0c;一种是直接赋值。两种定义方式如下&#xff1a; 递归展开&#xff1a…

Servlet的基本使用

目录 一、Servlet是什么 二、Servlet的基本使用 1、创建项目 2、引入依赖 3、创建目录 4、编写代码 5、打包程序 6、部署程序 7、验证程序 三、优化部署方式 1、安装Smart Tomcat 2、使用Smart Tomcat 四、使用Servlet时常见的错误 1、404 2、405 3、500 4、…

Linux文件目录之查看篇【cat、more、less、head、tail、>、>>】【简直不要太详细】

目录cat 查看文件内容morelessecho&#xff1a;将输入内容到控制台>指令和>>指令&#xff1a; >输出重定向 &#xff0c;>>追加head:tailcat 查看文件内容 cat【选项】 【要查看的文件】 -n 显示行号 注意&#xff1a;cat只能浏览文件&#xff0c;并不能修…

第二章--应用层

2.1应用层协议原理 研发网络应用程序的核心是写出能够运行在不同的端系统和同构网络彼此通信的程序&#xff0c;将应用软件限制在端系统&#xff0c;从而促进大量的网络应用程序的迅速研发和部署。 2.1.1网络应用程序体系结构 应用程序的体系不同于网络的体系结构&#xff0c…

实验(二):单片机数据区传送程序设计

一、实验目的与任务 实验目的&#xff1a; 1. 掌握单片机C语言程序设计和调试方法&#xff1b; 2. 了解单片机RAM中的数据操作。 任务&#xff1a; 1.根据要求编写程序&#xff0c;并写出原理性注释&#xff1b; 2. 检查程序运行的结果&#xff0c;分析一下是否正确&#xff1…

leetcode 42.接雨水,leetcode 503. 下一个更大元素Ⅱ

“即使到不了远方&#xff0c;心中也要有远方的模样。” 文章目录1.leetcode 503. 下一个更大元素Ⅱ1.1 详细思路及步骤1.2 java版代码示例2.leetcode 42.接雨水2.1 详细思路及步骤2.2 java版代码示例1.leetcode 503. 下一个更大元素Ⅱ 1.1 详细思路及步骤 这题基本上和昨天总结…

GoWeb从无到有(读取配置文件、gin、gorm)

GoWeb从无到有 – 读取配置文件、gin、gorm 创建go项目&#xff0c;结构如下 1. golang读取配置文件 引入包 go get -u gopkg.in/ini.v1在main.go的同级目录创建config文件夹&#xff0c;在文件夹中创建配置文件 config.ini # 项目配置 [app] Port8010 # mysql配置 [mysql] …

C++初阶 Stack和Queue的介绍和使用

作者&#xff1a;小萌新 专栏&#xff1a;C初阶 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客介绍&#xff1a;本篇博客会简单的介绍STL中的栈和队列 本章目标 复习下栈这种数据结构特点知道怎么使用STL中的栈复习下队列这种数据结构的特点知道怎么使用STL中…

多功能螯合剂FAPI-04-NH2,FAPI04-氨基,含有DOTA配体显示出良好的药代动力学

NH2-FAPI-04产品描述&#xff1a; FAPI是FAP的特异性抑制剂。在这些FAPI中&#xff0c;含有DOTA配体(FAPI-04)的[68Ga]Ga-DOTA-FAPI-04 PET/CT能显示出良好的体内药代动力学&#xff0c;导致快速kidney​清除和注射后10分钟至3小时的低背景活性。不久之后&#xff0c;[68Ga]Ga-…

Mybatis+Mybatis-plus+SpringBoot整合(完整版)

文章目录一、Mybatis&#xff08;一&#xff09;Mybatis简介1、Mybatis历史2、Mybatis特性3、Mybatis下载4、和其它持久化层技术对比&#xff08;二&#xff09;搭建Mybatis1、MySQL不同版本的注意事项2、创建Maven工程1、引入依赖3、创建MyBatis的核心配置文件3.1、核心配置文…

SpringMVC学习笔记

目录 SpringMVC 为什么出现了SpringMVC? 什么是SpringMVC? 简单使用 SpringMVC工作流程 设置bean加载控制 在服务器启动时加载SpringConfig 后台接受五种类型参数传递 REST风格 描述 RESTful入门 新建以下目录 实体类 控制器 统一异常处理 新建Code类用于记…

c#反序列化json

语句&#xff1a;JsonConvert.DeserializeObject(json); json字符串&#xff1a; [ { "id": "130000", "cityList": [ { "cityList": [ { …

Linux root用户忘记密码的恢复方法

日常运维工作中可能会遇到服务器忘记root密码的问题&#xff0c;本次以红帽8为例&#xff0c;讲解在忘记root密码后如何绕过密码登录然后重新设置密码的办法 目录 准备工作 问题复现 启动并进入引导 进入修复模式 修改用户密码文件 重置密码 准备工作 下载与系统匹配的…