java基础实现的图书管理系统

news2024/11/25 7:04:11

文章目录

  • 项目介绍
  • 项目功能
  • 代码讲解
    • 如何实现不同用户之间的操作权限不同

项目介绍

该项目是用的是javase的一些知识包括了类和对象封装,继承多态等面向对象的三大特性。主要是为了让我们能够更好的使用之前学到的知识。
接下来给大家讲解一下这个项目的一个特点。首先就是登录
在这里插入图片描述
登录的时候给大家了两个选择一个是普通用户一个是超级用户,并且这些用户的权限也是不一样的。
在这里插入图片描述
如果你选择普通用户那么你的操作权限是上面那些
超级用户是下面这些。
在这里插入图片描述

项目功能

项目的功能也就是上面两张图所显示的哪些,当然这里面比较难的几个是哪些呢?我认为比较困难的是增加图书、删除图书、如何实现不同用户类型之间可以操作的权限不同、如何实现按下不同的数字达到实现相应的操作。
那么这些也就是这个项目我认为比较重要的地方
然后我们先来了解一下这个项目比较重要的两个类那就是Book和BookList这两个类是我们接下来最重要的两个类,因为首先既然是图书管理系统那么这个图书肯定是要用一个类的,其次存放图书的是什么呢?是书架因此书架也应该用一个类接下来我们看一下这两个类的代码


Book

package Book;

/**
 * @Author 12629
 * @Description: 书
 */
public class Book {
    private String name;
    private int Price;
    private String Book_Type;
    public boolean isBrow=false;
    public Book(String name,int Price,String Book_Type){
        this.name=name;
        this.Price=Price;
        this.Book_Type=Book_Type;
    }
    public String toString() {
        return "Book{" + "name='" + name + '\'' +
                ", price=" + Price +
                ", type='" + Book_Type +
                '\''
                + ((isBrow == true) ? " 已经借出" : " 未被借出") +
                /*", isBorrowed=" + isBorrowed +*/
                '}';
    }
    public boolean GetisBrow(){
        return isBrow;
    }
    public String GetName(){
        return this.name;
    }
}


BookList

package Book;

import java.lang.reflect.Array;

public class BookList {
    private Book[] books;
    private int Upsize;

    private static final  int DEFAULT_CAPACITY = 10;
    public BookList(){
        this.books=new Book[DEFAULT_CAPACITY];
        this.books[0]=new Book("三国演义",20,"小说");
        this.books[1]=new Book("红楼梦",10,"小说");
        this.books[2]=new Book("西游记",25,"小说");
        this.books[3]=new Book("zyficl",100,"爱情");

        this.Upsize=4;
    }
    public int GetBookListLength(){
        return books.length;
    }
    public int GetUpsize(){
        return Upsize;
    }
    public void  Expansion(){
        Book[] books1=new Book[Upsize*2];
        System.arraycopy(books,0,books1,0,books.length);
        books=books1;
        books1=null;
    }
    public void Add(String name,int Price,String bookType){
        books[Upsize]=new Book(name,Price,bookType);
        Upsize++;
    }
    public void show(){
        for(int i=0;i<Upsize;i++){
            System.out.println(books[i]);
        }
    }
    public Book FindBook(String name){
        for(int i=0;i<Upsize;i++){
            if(books[i].GetName().equals(name)){
               return books[i];
            }
        }
        System.out.println("没有这本书");
        return null;
    }
    public boolean DeleteBook(String name){
        int ansi=-1;
        for(int i=0;i<Upsize;i++){
            if(books[i].GetName().equals(name)){
                ansi=i;
            }
        }
        if(ansi==-1){
            System.out.println("您想删除的书籍并不存在");
            return false;
        }
        else{
            for(int i=ansi;i<Upsize;i++){
                books[i]=books[i+1];
            }
            for(int i=0;i<Upsize;i++){
                System.out.println(books[i]);
            }
            Upsize--;
            for(int i=0;i<Upsize;i++){
                System.out.println(books[i]);
            }
            return true;
        }
    }
}

代码讲解

如何实现不同用户之间的操作权限不同

在这里其实就涉及到继承和多态了,我们想使得我们输入不同的参数从而实现实例化出不同的对象有些同学可能会想到很简单啊我用if和else不就行了吗但是我们需要知道一点就是我们可以使用if和else去实现的是调用不同类的构造函数但是我们怎么才能知道哪个类实例化出对象了呢?
那么这时候有些同学可能会想到这样一个办法那就是下面这个代码
假设AdminUser(该类是超级用户)NormalUser(该类是普通用户)

public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        int t=scan.nextInt();
        AdminUser Ad;
        NormalUser No;
        if(t==1){
            No=new NormalUser("zyficl");
        }
        else if(t==2){
            Ad=new AdminUser("zyficl");
        }
        if(Ad==null){
            
        }
        else if(No==null){

        }
    }

有些同学可能会想到使用这个方法来进行从语法角度这样子做能不能做到呢?答案是可以的,但是我们会发现什么呢?这样太麻烦了,因为这样子的话我们代码更像是面向过程,而不是我们希望的面向对象,因此我们该怎么办呢?很简单那就是创造一个新的抽象类User并让普通用户和超级用户都继承这个抽象类,然后实例化对象的时候使用向上转型,这样子我们就能实现既能让两个用户类型不一样又可以使得我们在敲写代码的时候保留面向对象的特性那么该怎么做呢?代码如下
在这里插入图片描述
首先要创建一个用户包
USER

package user;

import Book.BookList;
import Operation.IOperation;

public abstract class User {
    public String name;
    protected IOperation[] iOperations;
    public abstract int menu();
    public User(String name){
        this.name=name;
    }
    public void doOpeeration(int choice,BookList bookList){
        iOperations[choice].work(bookList);
    }
}

NormalUser

package user;
import Operation.*;
import com.sun.source.tree.ReturnTree;

import java.util.Scanner;

public class NormalUser extends User {
    public NormalUser(String name){
        super(name);
        this.iOperations=new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowBooks(),
                new ReturnBook(),
        };
    }
    public int menu(){
        System.out.println("0.退出系统");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("请选择你的操作");
        Scanner scan=new Scanner(System.in);
        int SelecAction=scan.nextInt();
        return SelecAction;

    }
}


AdminUser

package user;

import Operation.*;

import java.util.Scanner;

public class AdminUser extends User {
    public AdminUser(String name){
        super(name);
        this.iOperations=new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new DeleteOperation(),
                new AddOperation(),
        };
    }
    public int menu(){
        System.out.println("0.退出系统");
        System.out.println("1.查找图书");
        System.out.println("2.删除图书");
        System.out.println("3.增加图书");
        Scanner scan=new Scanner(System.in);
        int SelecAction=scan.nextInt();
        return SelecAction;
    }
}

然后我们的主函数中该怎么去调用这些呢主函数的话我们可以写一个方法这个方法的返回类型是User就可以解决了

import Book.*;
import user.AdminUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;

public class Main {

    public static User login(){
        System.out.println("请输入你的用户名称");
        Scanner scan=new Scanner(System.in);
        String name;
        name=scan.nextLine();
        System.out.println("请选择你的用户类型");
        System.out.println("1.普通用户-------2.超级用户");
        int SelectUsers;
        SelectUsers=scan.nextInt();
        if(SelectUsers==1){
            return new NormalUser(name);
        }
        else{
            return new AdminUser(name);
        }
    }
    public static void main(String[] args) {
        User us=login();
        BookList bookList=new BookList();
        String zyficl;
        while(true) {
            int sc = us.menu();
            us.doOpeeration(sc, bookList);
        }
    }
}

好的那么此时我们解决了第一个问题那就是刚刚说的不同用户的权限不一样,那么接下来就是第二个难点如何使得我们按下不同的数字之后去做不同的任务呢?
这里我们可以用一个数组,让这个数组去存储每一个任务,而每一种任务或者说是行为我们可以单独设置为一个类,并且让这个些类实例化出的对象存到一个数组里然后通过输入数字访问数组的下标从而达到实现不同的行为
那么这时候就又出现一个问题了如何让这些行为能够存到一个数组里呢?因为我们刚刚讲了我们是把这些行为单独写成一个类的想要放进一个数组里最起码要保证这个数组是里存储的是同一种类型,这里其实有了上面的启发我们应该可以想到的那就是用一个父类让子类去继承就可以了但是呢为了保证我们的知识点覆盖全面这里我们可以用一个接口去实现这个接口就是下面这个IoOperation

package Operation;
import Book.*;
import user.*;
public interface IOperation {
    public void work(BookList bookList);
}

然后让其他的行为去继承这个接口这里主要以增加和删除为例

package Operation;
import Book.*;

import java.util.Scanner;

public class AddOperation implements IOperation {
    public void work(BookList bookList){
        System.out.println("请输入要新增的书籍名称");
        Scanner scan=new Scanner(System.in);
        String BooksName=scan.nextLine();
        System.out.println("请输入要新增的书籍的价格");
        int Price=scan.nextInt();
        scan.nextLine();
        System.out.println("请输入要插入书籍的类型");
        String BooksType=scan.nextLine();
        if(bookList.GetBookListLength()==bookList.GetUpsize()){
            bookList.Expansion();
        }
        bookList.Add(BooksName,Price,BooksType);
        bookList.show();
    }
}

删除书本

package Operation;
import Book.*;

import java.util.Scanner;

public class DeleteOperation implements IOperation {
    public void work(BookList bookList){
        System.out.println("请输入你要删除的书籍");
        Scanner scan=new Scanner(System.in);
        String name=scan.nextLine();
        bookList.DeleteBook(name);
    }
}

在删除书本的时候其实就是对数组的内容做删除那么假如说我们要删除的书本下标是2那么就要把2后面的书籍依次往前挪动一位。而增加书本的时候只需要在末尾增加即可。

	我们一定会开开心心快快乐乐的生活在一起的,一直一直在一起的无论如何我都不会分开

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

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

相关文章

FL Studio 21.2.3.4004 All Plugins Edition Win/Mac音乐软件

FL Studio 21.2.3.4004 All Plugins Edition 是一款功能强大的音乐制作软件&#xff0c;提供了丰富的音频处理工具和插件&#xff0c;适用于专业音乐制作人和爱好者。该软件具有直观的用户界面&#xff0c;支持多轨道录音、混音和编辑&#xff0c;以及各种音频效果和虚拟乐器。…

blender在几何节点中的这些变换中的旋转,其实可以是两种旋转顺序

看似xyz的旋转角度&#xff0c;但如果按照欧拉角来谈它的旋转&#xff0c;就大有学问了。 我们知道&#xff0c;在blender中有局部旋转和全局旋转。但其实这两者在某种情况下可以等价。 那就是&#xff0c;如果参照全局坐标系&#xff0c;按xyz的顺序进行欧拉旋转&#xff0c;…

【Linux】并发解决(上)-中断屏蔽,原子操作

&#x1f525;博客主页&#xff1a;PannLZ &#x1f38b;系列专栏&#xff1a;《Linux系统之路》 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 文章目录 并发解决1.中断屏蔽2.原子操作2.1整形原子操作2.2位原子操作原子变量使用例子 并发解决…

【Linux学习】线程池

目录 23.线程池 23.1 什么是线程池 23.2 为什么需要线程池 23.3 线程池的应用场景 23.4 实现一个简单的线程池 23.4.1 RAII风格信号锁 23.4.2 线程的封装 23.4.3 日志打印 22.4.4 定义队列中存放Task类任务 23.4.5 线程池的实现(懒汉模式) 为什么线程池中需要有互斥锁和条件变…

无监督学习:探索数据的潜在结构与规律

目录 前言1. 概念2. 聚类2.1 定义2.2 应用场景 3. 异常检测3.1 定义3.2 应用场景 结语 前言 在当今信息时代&#xff0c;数据扮演着至关重要的角色&#xff0c;其海量、多样的形式为我们提供了前所未有的机会和挑战。在这个大数据的背景下&#xff0c;无监督学习的概念日益引起…

《剑指offer》--字符串左旋【超详细建议收藏】

字符串左旋的三种方法 1. 一个一个字符挪2. 库函数---strcpy和strncat3. 三段逆置法 1. 一个一个字符挪 代码实现如下&#xff1a; #include <stdio.h> #include <string.h>void Left_Reverse(char* str,int k) {int len strlen(str);//6int time 0;time k % …

开源≠不赚钱,开源软件盈利的7大模式。

开源不是目的&#xff0c;目的是圈用户&#xff0c;留住用户&#xff0c;盈利自然不成问题。 开源系统可以通过多种方式赚钱&#xff0c;以下是其中几种常见的方式&#xff1a; 提供付费支持&#xff1a; 开源系统可以提供付费的技术支持服务&#xff0c;包括安装、配置、维…

代码随想录 Leetcode406. 根据身高重建队列

题目&#xff1a; 代码(首刷看解析 2024年2月15日&#xff09;&#xff1a; class Solution { static bool cmp(const vector<int>& A, const vector<int>& B) {if(A[0] B[0]) return A[1] < B[1];return A[0] > B[0]; } public:vector<vector&…

2001-2022年368个地级市平均气温数据

2001-2022年368个地级市平均气温数据 1、时间:2001-2022年 2、范围&#xff1a;368个地级市 3、来源&#xff1a;基于NOAA下属NCEI提供的原始数据编制而成的。 4、指标&#xff1a;年份、省份、省份代码、城市、城市代码、平均气温 5、指标解释&#xff1a;平均气温指某一…

Java奇缘:林浩然与杨凌芸的数学冒险记

Java奇缘&#xff1a;林浩然与杨凌芸的数学冒险记 Java Adventure: The Mathematical Odyssey of Lin Haoran and Yang Lingyun 在Java编程世界的某一个角落&#xff0c;住着两位才华横溢的程序员——林浩然和杨凌芸。林浩然&#xff0c;人称“算法大侠”&#xff0c;对Java Ma…

Linux第56步_根文件系统第3步_将busybox构建的根文件系统烧录到EMMC

1、第1次将“rootfs”打包 1)、打开第1个终端&#xff0c;准备在“mnt”目录下创建挂载目录“rootfs”&#xff1b; 输入“ls回车” 输入“cd /mnt回车” 输入“ls回车”&#xff0c;查看“mnt”目录下的文件和文件夹 输入“sudo mkdir rootfs回车”&#xff0c;在“mnt”…

对进程与线程的理解

目录 1、进程/任务&#xff08;Process/Task&#xff09; 2、进程控制块抽象(PCB Process Control Block) 2.1、PCB重要属性 2.2、PCB中支持进程调度的一些属性 3、 内存分配 —— 内存管理&#xff08;Memory Manage&#xff09; 4、线程&#xff08;Thread&#xff09;…

程序员搞什么副业才有性价比?

干一行恨一行&#xff0c;三百六十行&#xff0c;行行干破防&#xff01; 一份稳定的主业固然重要&#xff0c;但是有性价比的副业更令人心动。朝九晚五的工作日复一日&#xff0c;当然也可能是996的生活反复捶打。从整体来讲&#xff0c;程序员算是高收入群体&#xff0c;但往…

前端秘法进阶篇之事件循环

目录 一.浏览器的进程模型 1.进程 2.线程 二.浏览器的进程和线程 1. 浏览器进程 2. 网络进程 3. 渲染进程 三.渲染主线程 四.异步 五.优先级 1. 延时队列&#xff1a; 2.交互队列&#xff1a; 3.微队列&#xff1a; 六.JS 的事件循环 附加:JS 中的计时器能做到精…

java数据结构与算法基础-----字符串------KMP算法

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 一、概述二、KMP思想三、代码实现 一、概述 什么是KMP算法 我们…

43.1k star, 免费开源的 markdown 编辑器

简介 项目名&#xff1a; MarkText-- 简单而优雅的开源 Markdown 编辑器 Github 开源地址&#xff1a; https://github.com/marktext/marktext 官网&#xff1a; https://www.marktext.cc/ 支持平台&#xff1a; Linux, macOS 以及 Windows。 操作界面&#xff1a; 在操作界…

猫头虎分享已解决Bug || DNS解析问题(DNS Resolution Issue):DNSLookupFailure, DNSResolveError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

猫头虎分享已解决Bug || Error: Minified React Error #130

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Shell 学习笔记(一)-Shell脚本编程简介

一 什么是shell&#xff1f; shell是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内…

Go教程-什么是编程?

什么是编程&#xff0c;这是个有趣的话题。 编程是什么 编程&#xff0c;字面意思即编写程序&#xff0c;即通过既定的关键字&#xff0c;来描述你的想法&#xff0c;并让计算机的各个部件按照你的想法来做事。 这里计算机的各个部件通常来说&#xff0c;指的是CPU和IO设备。…