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

文章目录

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

项目介绍

该项目是用的是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.mzph.cn/news/683052.shtml

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

相关文章

31.File文件

File文件 1. 概述2. 构造方法2.1 方法2.2 代码示例 3. 成员方法3.1 判断、获取的方法3.1.1 方法3.1.2 代码示例 3.2 创建、删除的方法3.2.1 方法3.2.2 代码示例 3.3 获取、遍历的方法3.3.1 重点方法3.3.1.1 方法3.3.1.2 代码示例 3.3.2 所有方法3.3.2.1 方法3.3.2.2 代码示例 4…

OpenGL-ES 学习(4)---- OpenGL-ES 坐标体系

坐标体系 我们知道 OpenGL -ES 坐标系中每个顶点的 x&#xff0c;y&#xff0c;z 坐标都应该在 -1.0 到 1.0 之间&#xff0c;超出这个坐标范围的顶点都将不可见。 将一个物体&#xff08;图像&#xff09;渲染到屏幕上&#xff0c;通常经过将物体坐标转换为标准化设备坐标&am…

蓝牙BLE学习-GAP

1.概述 GAP层&#xff08;Generic access profile-通用访问配置文件&#xff09;。GAP是对LL层payload&#xff08;有效数据包&#xff09;如何进行解析的两种方式的一种&#xff0c;而且也是最简单的一种。GAP简单的对LL payload进行一些规范和定义&#xff0c;因此GAP能实现的…

(三十八)大数据实战——Atlas元数据管理平台的部署安装

前言 Apache Atlas 是一个开源的数据治理和元数据管理平台&#xff0c;旨在帮助组织有效管理和利用其数据资产。为组织提供开放式元数据管理和治理功能 &#xff0c;用以构建其数据资产目录&#xff0c;对这些资产进行分类和管理&#xff0c;形成数据字典 。并为数据分析师和数…

深度学习之反向传播算法

反向传播算法 数学公式算法代码结果 算法中一些函数的区别 数学公式 算法代码 这里用反向传播算法&#xff0c;计算 y w * x模型 import numpy as np import matplotlib.pyplot as ply#反向传播算法&#xff0c;需要使用pytorch框架&#xff0c; #这里导入pytorch框架&#xf…

MySQL 基础知识(四)之表操作

目录 1 约束 2 查看已有表 3 创建表 4 查看表结构 5 修改表 6 删除表 1 约束 主键约束 primary key&#xff1a;唯一&#xff0c;标识表中的一行数据&#xff0c;此列的值不可重复&#xff0c;且不能为 NULL&#xff0c;此外&#xff0c;可以多个列组成主键唯一约束 uniq…

Phobos捆绑某数控软件AdobeIPCBroker组件定向勒索

前言 Phobos勒索病毒最早于2019年被首次发现并开始流行起来&#xff0c;该勒索病毒的勒索提示信息特征与CrySiS(Dharma)勒索病毒非常相似&#xff0c;但是两款勒索病毒的代码特征却是完全不一样&#xff0c;近日笔者在逛某开源恶意软件沙箱的时候发现了一款Phobos勒索病毒捆绑…

Windows编程环境配置!

喜欢的话麻烦大家多点点关注&#xff0c;谢谢&#xff01; 原文地址&#xff1a;Windows编程环境配置&#xff01; - Pleasure的博客 下面是正文内容&#xff1a; 前言 近期闲来无事&#xff0c;就想着把Windows系统中的环境给完善整理一下。方便后续码字时的不时之需。 正文…

百度云AI

百度云AI概述 Face腾讯优图科大讯飞 百度人脸识别基于深度学习的人脸识别方案&#xff0c;准确识别图片中的人脸信息&#xff0c;提供如下功能&#xff1a; 人脸检测&#xff1a;精准定位图中人脸&#xff0c;获得眼、口、鼻等72个关键点位置&#xff0c;分析性别、年龄、表…

[python] 罗技动态链接驱动库DLL 控制 键鼠

[python] 罗技动态链接驱动库DLL 控制 键鼠 最近在玩搬砖游戏晶核, 每天有很多重复繁琐的"打卡"操作, 得知隔壁御三家游戏就有大佬做了自动收割的辅助工具,我就想模仿写一个.不过大佬们写的开源工具厉害得多,加了神经网络自动识别,实现寻路和点击功能.我目前最多就是…

模拟电子技术——分压式偏置放大电路、多级放大电路、差动放大电路、互补输出级

文章目录 前言基本放大电路链接&#xff0c;上一篇 [基本放大电路](https://blog.csdn.net/weixin_47541751/article/details/136112075?spm1001.2014.3001.5502) 一、分压式偏置放大电路什么是分压式偏置电路分压式电路组成电路分析估算静态工作点 二、多级放大电路什么是多级…

仰暮计划|“他们吃树皮,挖野菜,将玉米棒和玉米皮也做成食物来解饥”

我的姥姥今年七十岁了&#xff0c;她病的很严重&#xff0c;我趁着在病房的这段时间对她进行了采访。 我的姥姥1953年出生在一个小山村里&#xff0c;她有四个兄弟和两个姐妹&#xff0c;据她说&#xff0c;她的父母既是爱她的又是严厉的&#xff0c;因为孩子多并且生活困难&a…

python - OSError:错误没有名为 [‘pytorch_model.bin‘

python - OSError&#xff1a;错误没有名为 [‘pytorch_model.bin’] 自己训练的模型存储好了以后 model MT5ForConditionalGeneration.from_pretrained(“ner/best”) 之前还可以跑 现在报错 错误没有名为 [‘pytorch_model.bin’] 还原了一下conda env 把四版变成三版了 …

C# CAD2016 判断多边形的方向正时针或逆时针旋转

方法一&#xff1a;基于相邻顶点相对位置判断顺时针排列 // 计算当前子序列是否为顺时针排列 for (int i 1; i < outerPoints.Count; i) {int index (startVertexIndex i) % outerPoints.Count;int prevIndex (startVertexIndex i - 1) % outerPoints.Count;Point2d c…

基于JAVA,SpringBoot和Vue二手房屋销售系统设计

摘要&#xff1a; 本研究旨在设计并实现一个基于JAVA, SpringBoot和Vue技术的二手房屋销售系统。该系统采用当前流行的前后端分离架构&#xff0c;后端使用SpringBoot框架快速搭建RESTful API&#xff0c;提供稳定且高效的服务端应用&#xff1b;前端则通过Vue.js框架构建动态…

Linux用户常用命令——Linux命令(一)

大家好&#xff0c;从这篇文章开始我将开始进行Linux常用命令的学习&#xff0c;本专栏的每一个知识点我都会尽量在Linux系统中手操实现一遍。如果在读这篇文章的你也想熟悉Linux常用操作命令&#xff0c;我非常推荐你也搭个Linux系统进行实操学习。因为Linux常用的命令的知识点…

Python算法探索:从经典到现代

引言 Python&#xff0c;作为一种功能强大的编程语言&#xff0c;一直是算法实现的首选工具。从经典的排序和查找算法到现代的机器学习和深度学习算法&#xff0c;Python都展现出了其强大的实力。接下来&#xff0c;我们将一起探索Python算法的经典与现代。 一、经典算法&#…

LabVIEW伺服阀动静态测试系统

LabVIEW伺服阀动静态测试系统 基于LabVIEW开发了一套伺服阀动静态测试系统&#xff0c;提高伺服阀在电液伺服控制系统中的性能测试精度和效率。通过设计合理的液压系统、电控系统及软件系统&#xff0c;实现了伺服阀的动态和静态特性测试&#xff0c;采用流量-压力双闭环稳态控…

【C语言】数据结构#实现堆

目录 &#xff08;一&#xff09;堆 &#xff08;1&#xff09;堆区与数据结构的堆 &#xff08;二&#xff09;头文件 &#xff08;三&#xff09;功能实现 &#xff08;1&#xff09;堆的初始化 &#xff08;2&#xff09;堆的销毁 &#xff08;3&#xff09;插入数据 …

快速部署MES源码/万界星空科技开源MES

什么是开源MES软件&#xff1f; 开源MES软件是指源代码可以免费获取、修改和分发的MES软件。与传统的商业MES软件相比&#xff0c;开源MES软件具有更高的灵活性和可定制性。企业可以根据自身的需求对软件进行定制化开发&#xff0c;满足不同生产环境下的特定需求。 开源MES软件…