Java 从零开始写一个简单的图书管理系统

了解一下

先来了解要实现一个怎样的图书管理系统

从中可以看到有操作的 使用者不同 的 功能

而不同的使用者有不同的 菜单

那要如何实现呢?

请继续看下去

如何实现

首先了解我们 需要什么

图书系统需要 ,放书的 书架 ,用户 中有 管理员普通用户,以及 实现功能

也就是说

:书 书架

用户:管理员 普通用户

操作功能:管理员功能 普通用户功能

1.书

写一个书类,创建它的书名,作者,价格,类型,是否借出(boolean类型),全部使用private修饰

创建getset方法获取书的属性

创建构造方法以便之后的传值,boolean类型不需要创建构造方法,boolean默认为false,创建构造方法反而显得繁琐

由于之后需要打印重写一个toString方法

boolean类型的打印为false,可以使用 三元操作条件运算符 来解决

public String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +(isBorrowed == true ? " 已借出":" 未借出")+//这里用三元条件运算符可以解决打印出来false和true的问题
//                ", isBorrowed=" + isBorrowed +'}';}

此时我们的book类就写完了 

public class Book {private String name;private String author;private int price;private String type;private boolean isBorrowed;//首先给变量创建构造方法,赋值public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}//再创建get set方法,以便后续的调用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 int getPrice() {return price;}public void setPrice(int 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;}//创建to String方法,便于打印@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +(isBorrowed == true ? " 已借出":" 未借出")+//这里用三元条件运算符可以解决打印出来false和true的问题
//                ", isBorrowed=" + isBorrowed +'}';}
}

2.书架

写一个书架类,创建一个Book数组,给上合适的空间

创建构造方法用来放书,使书架被创建的时候就能有书

定义当前书的数量useSize

Book数组和useSize创建getset方法

注意:需要再写一个能获取和设置单本书的方法,以便后续需要增加图书和删除图书

到这里我们的书架类也写完了

//书架类
public class BookList {//书架类用来放书,new一个书类型的数组,给上合适的空间Book[] books = new Book[10];//建立一个当前使用数private int useSize;//给书架创建构造方法,使书一开始就存在于书架public BookList() {books[0] = new Book("三块钱如何活一个月","Zack",3,"人生哲理");books[1] = new Book("如何征服美丽少女","Zack",999,"杂志");books[2] = new Book("为什么作者这么帅","Zack",666,"小说");this.useSize = 3;}//创建get 和set 方法便于后续使用//这里修改加入参数便于后续获取一本书public Book getBook(int pos) {return books[pos];}//这里为了获取全部的书public Book[] getBooks() {return books;}//同样设置一本书public void setBook(Book books,int pos) {this.books[pos] = books;}public int getUseSize() {return useSize;}public void setUseSize(int useSize) {this.useSize = useSize;}
}

那么书结束,接下来是用户

用户

1.User类

这里有 普通用户管理员,我们很容易想到利用多态,写一个User抽象类

定义名字

创建构造方法

创建抽象方法menu

注意:这里返回类型需要定义为int类型,以便接收操作值

//由于这个类不能具体指向某个对象,所以定义为抽象类
public abstract class User {//想要这个变量被其他类使用,又想要有一点限制使用protectedprotected String name;//创建接口的数组,对应接收操作的数字protected IOperation[] iOperations;//同样创建构造方法public User(String name) {this.name = name;}//创建一个menu菜单方法,子类继承的时候会需要续写,设置成int类型方便返回值public abstract int menu();//实现向下转型public void doOperation(int choice, BookList bookList){iOperations[choice].work(bookList);}}

2.普通用户

继承父类User,

重写父类构造方法,

重写menu,

由于不同类型的用户的菜单不同,所以需要根据不同用户的功能设计

从输入2开始就是进入了系统,那么根据需要设计想要实现的样子,这里仅供参考

public int menu() {System.out.println("-----欢迎 "+this.name+" 来到图书管理系统-----");System.out.println("-----普通用户菜单-----");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("-------------------");System.out.println("请输入你的操作->...");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}

那么管理员也是同理,只需要修改需要的功能 

到这里我们的用户类完成

接下来是写一个主类运行

主类

可以看到运行时优先出来的是要求输入姓名和身份

那么可以设置为静态方法

1.login静态方法

按照想要的要求来实现,这里的返回值设置成User方便之后接收返回值

具体实现

 //构造静态方法,一开始执行就会运行这个方法public static User login(){//这里把返回类型设置成User,这样不论是什么类型都可以接收Scanner scanner = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = scanner.nextLine();System.out.println("请输入你的身份:");System.out.println("1. 管理员   2. 普通用户");int choice = scanner.nextInt();if (choice == 1){return new Admin(name);}else {return new Normal(name);}}

先创建一个书架对象,使书架里有

创建一个User对象,接收login方法的传来的值

用User创建的对象调用子类的方法,这样就形成了多态

具体实现

BookList bookList = new BookList();//用User类型来接收就可以形成多态User user = login();
//用一个choice来接收返回的操作值int choice = user.menu();

这里还可以写一个循环让菜单一直出现直到退出系统

接下来是操作方法的实现

操作方法

可以实现一个操作方法的接口,这样所有实现这个接口的类都需要重写它的方法,便于调用

由于操作的是书架所以需要输入书架的值 

//创建接口使实现接口的子类都需要实现方法,注意这里要操作的是书架所以参数是BookList。。。。
public interface IOperation {void work(BookList bookList);
}

 把要创建的方法实现这个接口,重写work方法

例如这种

public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统-----");exit(0);}
}

这样就完成了操作方法

(本文章仅搭建一个框架,不包含功能的实现,功能的实现我会单独放在一篇文章)

如何调用方法

既然通过数字来确定操作方法,不如直接创建一个接口的数组,把操作方法放到数组里

那么首先在User类里创建一个接口的数组ioperations,这样子类会继承

//创建接口的数组,对应接收操作的数字protected IOperation[] iOperations;

而管理员和普通用户的方法不同,数组就需要放入不同的值

形如,放到构造方法中同样创建就会执行

iOperations = new IOperation[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DeleteOperation(),new ShowOperation()};

调用的时候就再在User类中写一个调用的doOperation

参数放入书架BookList booklist 和下标pos

public void doOperation(int choice, BookList bookList){iOperations[choice].work(bookList);}

在主类中调用后就将框架实现了

public class Main {//构造静态方法,一开始执行就会运行这个方法public static User login(){//这里把返回类型设置成User,这样不论是什么类型都可以接收Scanner scanner = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = scanner.nextLine();System.out.println("请输入你的身份:");System.out.println("1. 管理员   2. 普通用户");int choice = scanner.nextInt();if (choice == 1){return new Admin(name);}else {return new Normal(name);}}public static void main(String[] args) {BookList bookList = new BookList();//用User类型来接收就可以形成多态User user = login();//写一个死循环让菜单循环while(true){//用一个choice来接收返回的操作值int choice = user.menu();//利用这个返回的操作值来进行下一步user.doOperation(choice,bookList);}}
}

梳理运行步骤

首先主类的login方法会优先执行,返回一个类型

然后根据返回的类型调用方法

接收操作值之后就找到操作方法类并调用work方法

这里只是实现一个框架,功能的实现会放到下一篇文章

若有不足请及时指正

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

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

相关文章

大数据与java哪个好找工作?这篇文章帮你做选择!

大数据与java哪个好找工作?这篇文章帮你做选择! 还在为选择Java开发还是Java大数据而头疼吗?别担心,本文将从就业前景、学习方向、学习内容以及薪资待遇四个方面,为你揭开Java和Java大数据的神秘面纱,帮你做…

【STM32】时钟树系统

1.时钟树简介 1.1五个时钟源 LSI是低速内部时钟,RC振荡器,频率为32kHz左右。供独立看门狗和自动唤醒单元使用。 LSE是低速外部时钟,接频率为32.768kHz的石英晶体。这个主要是RTC的时钟源。 HSE是高速外部时钟,可接石英*/陶瓷谐振…

Webstorm vue项目@路径不能跳转到对应资源,提示Cannot find declaration to go to

Webstorm vue项目路径不能跳转到对应资源,提示Cannot find declaration to go to 我们 ctrl加鼠标左键点击方法会失效,看了网上很多教程在说需要在此处配置一下webpack.config.js的文件路径,而且指向了node_modules\vue\cli-service\webpack.config.js 我…

外贸SEO工具有哪些推荐?

"我们作为一个专业的Google SEO团队,比较推荐一下几个适合外贸SEO的工具。Ahrefs 是一个非常强大的工具,可以帮助你深入分析竞争对手的表现,找到有潜力的关键词,还可以监控你的网站链接状况。另外,SEMrush 也很不…

Android基础到进阶UI祖父级 ViewGroup介绍+实用

1.创建CustomLayout继承ViewGroup /** 编写自定义ViewGroup的示例。 */ public class CustomLayout extends ViewGroup { // private int childHorizontalSpace 20; // private int childVerticalSpace 20; private int childHorizontalSpace; private int childVert…

Android企业级实战-界面篇-5

3.colors.xml文件内容(此案例可用) #ffb2b2b2 #ff14c4bc color/jimeng_text_tertiary_light color/jimeng_green_light color/jimeng_background_secondary_light color/jimeng_background_secondary_light #7f4eb7ba 4.strings.xml文件内容&…

内容安全复习 5 - 深在线社交网络分析与舆情监测

文章目录 在线社交网络分析什么是在线社交网络什么是在线社交网络分析社交网络信息传播基本模型影响力模型传染模型影响力计算公式 网络舆情监测网络舆情概述网络舆情监测系统 在线社交网络分析 什么是在线社交网络 在线社交网络是一种在信息网络上由社会个体集合及个体之间的…

[19] Opencv_CUDA应用之 基于形状的对象检测与跟踪

Opencv_CUDA应用之 基于形状的对象检测与跟踪 形状可以用作全局特征检测具有不同形状的物体,可以是直线、多边形、圆形或者任何其他不规则形状利用对象边界、边缘和轮廓可以检测具有特定形状的对象本文将使用Canny边缘检测算法和Hough变换来检测两个规则形状&#…

scapy修改TCP标志位

文章目录 TCP标志位scapy修改标志位设置标志位清除标志位示例 TCP标志位 TCP报文段结构如图所示 下面介绍一些重要的标志位: URG (Urgent): 紧急指针(Urgent Pointer)有效。当URG标志位设置为1时,表示TCP报文段中有紧急数据需要处…

你好,复变函数1.0

输入时用后缀&#xff0c;开头空格 #include <easyx.h> #include <stdio.h> #define PI 3.141592653589793 #define E 2.718281828459045 #define K (1.0 / 256.0) #define K_1 256.0 //#define LINE//决定函数是用线画还是用点画 struct C {double i;double r;…

apache activeMq

https://blog.csdn.net/qq_29651203/article/details/108487924 游览器输入地址: http://127.0.0.1:8161/admin/ 访问activemq管理台 账号和密码默认为: admin/admin# yml配置的密码也是如下的密码 activemq:url: failover:(tcp://localhost:61616)username: adminpassword: ad…

手撕排序2--选择排序(直接选择+堆排序

目录&#xff1a; 1.直接选择排序 的实现及分析 2.堆排序 的实现及分析 1.直接选择排序 1.1基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完…

【启明智显产品介绍】Model3C工业级HMI芯片详解专题(三)通信接口

Model3C 是一款基于 RISC-V 的高性能、国产自主、工业级高清显示与智能控制 MCU, 集成了内置以太网控制器&#xff0c;配备2路CAN、4路UART、5组GPIO、2路SPI等多种通信接口&#xff0c;能够轻松与各种显示设备连接&#xff0c;实现快速数据传输和稳定通信&#xff0c;可以与各…

R语言——类与对象

已知2024年4月23日是星期五&#xff0c;编写一个函数day.in.a.week (x, y,z)&#xff0c;参数x和y和z分别代表年月日&#xff0c;判断这一天是否存在&#xff08;例如&#xff0c;2018年没有2月29日&#xff0c;也没有11月31日&#xff09;&#xff0c;如果不存在&#xff0c;返…

Howtrader在服务器上安装后遇到的问题

response:{"code":-1021,"msg":"Timestamp for this request is outside of the recvWindow."} 1.安装 NTP 服务 如果你的系统还没有安装 NTP&#xff0c;可以通过以下命令安装&#xff1a; sudo apt update sudo apt install ntp2.配置 NTP …

ELK+Filebeat+kafka+zookeeper构建海量日志分析平台

ELK是什么&#xff08;What&#xff09;&#xff1f; ELK组件介绍 ELK 是ElasticSearch开源生态中提供的一套完整日志收集、分析以及展示的解决方案&#xff0c;是三个产品的首字母缩写&#xff0c;分别是ElasticSearch、Logstash 和 Kibana。除此之外&#xff0c;FileBeat也是…

【面试干货】抽象类的意义与应用

【面试干货】抽象类的意义与应用 1、为其他子类提供一个公共的类型2、封装子类中重复定义的内容3、定义抽象方法&#xff0c;子类虽然有不同的实现&#xff0c;但是定义时一致的4、示例代码 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在…

kettle从入门到精通 第七十二课 ETL之kettle 三谈http post(含文件上传),彻底掌握参数传递

场景&#xff1a;群里有个小伙伴在使用http post步骤调用接口时遇到问题&#xff0c;postman调用正常&#xff0c;但是kettle中调用异常。 解决方案&#xff1a;既然postman调用接口正常&#xff0c;肯定是http post步骤中某些参数设置的不正确导致的。那就把常用的方式都梳理下…

探索AI前沿:本地部署GPT-4o,打造专属智能助手!

目录 1、获取API_key 2、开始调用 3、openai连接异常 4、解决方法&#xff1a; 5、调用GPT-4o 1、获取API_key 这里就不多赘述了&#xff0c;大家可以参考下面这篇博客 怎么获取OpenAI的api-key【人工智能】https://blog.csdn.net/qq_51625007/article/details/13763274…