用Java实现简单的图书管理系统

目录

1.总体框架

2.book包

 Books类

booklist类

3.operation包

IO接口:

addbooks类:

borrowbooks类:

delbooks类:

returnbooks类:

exit类:

4.user包

user类

Adminuser类(难点,有解析)

commonuser类(和上面的一样,不做解析了)

5.Main类

6.操作结果

 7.总结:


 

        此系统主要涉及到了java基础的语法,其中包括类和对象、继承、封装、多态、包、抽象类、接口和数组等,体现了对象之间如何交互。

1.总体框架

简单示意图:

 构成:

 

解释:分为三步操作。

1.书的内容和存取书的书架。

2.用户登录,分为管理员登录和普通用户登录。

3.对书架的相关操作。


2.book包

 Books类

         使用java的封装的特点用私有化的权限定义一些书的属性。这些属性创建后,需要进行初始化,可以使用构造方法,访问这些属性时可以用getter和setter,同时要打印实例化后的对象是,可以重写tostring方法。        

详细见下代码,有详细的注解:

package book;
public class Books {//只是写了一些简单的属性,有想法的还可以添加private String name;    //书名private int price;      //价格private String Author;  //作者private boolean Beborrow;  //判断是否被借出的标志//构造函数,初始化成员,没有Beborrow是因为Beborrow未被初始化是默认值为false,
//表示未借出,所以不用写在构造函数中。public Books(String name, int price, String author) {this.name = name;this.price = price;this. Author = author;}//下面是成员变量的getter和setter函数,后期访问的时候都会使用到public String getName() {return name;}public void setName(String name) {this.name = name;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public String getAuthor() {return Author;}public void setAuthor(String author) {Author = author;}public boolean isBeborrow() {return Beborrow;}public void setBeborrow(boolean beborrow) {Beborrow = beborrow;}//重写过tostring方法@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", price=" + price +", Author='" + Author + '\'' +", Beborrow=" + ((Beborrow==true)?"已被借出":"未被借出")+//用三目运算符表示是否被借出'}';}
}

booklist类

booklist是用来存储书的,相当于一个书架,这一个类包含了 书籍的数量和存储书的数组,该数组的类型是Books类型的,其中使用java的封装的特点,用私有化的权限定义booklist中 booklistsize(书的个数)这个成员。

详细见以下代码,有详细的注解:

package book;public class Booklist {private int booklistsize;  //私有成员,表示书的个数Books[] books = new Books[10];  //用来存储书的数组,类型为Books//构造函数,初始化成员,同时让数组中先存在这三本书public Booklist() {   this.booklistsize = booklistsize;books[0] = new Books("三国演义",14,"罗贯中");books[1] = new Books("西游记",11,"施耐庵");books[2] = new Books("红楼梦",17,"曹雪芹");this.booklistsize =3;}// 该函数的作用是能够得到pose位置的书,且返回类型为Books,
//这个getBooks与编译器生成的 不一样,要改变一下,后期的操作会使用到public Books getBooks(int pose) {  return books[pose];}//该函数的功能是让第pose位置上有上books(意思就是在数组里面的pose位置上添加上books)
//后期会使用到public void setBooks(Books books,int pose) {this.books[pose] = books;}//因为booklistsize是私有的,体现了封装的特点,要想使用他,必须要调用getBooklistsize
//后期会使用到public int getBooklistsize() {return booklistsize;}//给booklistsize设置值,要想访问也是要调用set...public void setBooklistsize(int booklistsize) {this.booklistsize = booklistsize;}
}

总结:写这个包里面的类,先写Books类再写booklist类,难点在于对封装成员的访问(使用getter和setter)以及一些函数的重写(后期在写一些类的时候可以一步一步地完善)。


3.operation包

 这个包包括一些功能操作,其中设置一个接口,通过不同的类来实现接口的操作(体现了java实现多继承的特点)。

详细见下代码,有详细的注释:

IO接口:

package opertion;
import book.Booklist;public interface IO {//不同的类来实现这个接口,其中接收的参数为booklist这个对象,用于后期对这个对象的操作void work(Booklist booklist);
}

addbooks类:

package opertion;import book.Booklist;
import book.Books;import java.awt.print.Book;
import java.util.Scanner;//写这个操作的思路是先判断这个书架是否还可以添加书籍,可以的话就输入书籍的信息,输入后在判断//添加的书籍是否与书架里的书籍重复,
//不重复的话就用booklist.setBooks()函数来添加书籍
//然后booklistsize加一public class addbooks implements IO{@Overridepublic void work(Booklist booklist) {int szie = booklist.getBooklistsize();System.out.println("添加书籍");//判断是否满if(szie==9){                               System.out.println("书架已满,无法添加!!");return;}System.out.println("请输入书名:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();System.out.println("请输入作者:");String Author = scanner.nextLine();System.out.println("请输入价格:");int price = scanner.nextInt();Books book = new Books(name,price,Author);//判断是否重复for(int i = 0;i<szie;i++){//先用getBooks获取这本书,然后用getname获取这本书的名字if(book.getName().equals(booklist.getBooks(i).getName())){System.out.println("存在这本书,无法重复添加!!");return;}booklist.setBooks(book,szie);booklist.setBooklistsize(szie+1);}System.out.println("添加成功!!");}
}

borrowbooks类:


package opertion;import book.Booklist;import java.util.Scanner;//对于借书,先执行要借书书的名字,判断是否被借阅了以及有没有这本书,如未被借阅,
//使用setBeborrow来改变Beborrow的值public class borrowbooks implements IO{@Overridepublic void work(Booklist booklist) {System.out.println("借阅书籍!!");for (int i = 0; i < booklist.getBooklistsize(); i++) {System.out.println(booklist.getBooks(i));}System.out.println("请输入要借阅书籍的名称:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();int i = 0;for(;i<booklist.getBooklistsize();i++){if(name.equals(booklist.getBooks(i).getName())){if(booklist.getBooks(i).isBeborrow()) {System.out.println("该书籍已经被借阅了!!");}else {System.out.println("借阅成功!!");//用setBeborrow来改变Beborrow的值booklist.getBooks(i).setBeborrow(true);}}if(i ==booklist.getBooklistsize()){System.out.println("没有该本书!!");}}}
}

delbooks类:

package opertion;import book.Booklist;
import book.Books;import java.util.Scanner;//删除书的主要思路是自己所输入的书是否在书架上有,如果没有就删除该书,同时size减一public class delbooks implements IO{@Overridepublic void work(Booklist booklist) {System.out.println("删除书籍!!");System.out.println("请输入要删除的书籍:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();int index = 0;int size = booklist.getBooklistsize();int i = 0;//先找到要删掉的书籍的位置,记下要该书的位置for(;i<size-1;i++){if(name.equals(booklist.getBooks(i).getName())){i = index;break;}}if(i == size-1){System.out.println("找不到该书籍,无法删除!!");return;}//删除的步骤,后面的往前面覆盖for(i = index;i<size-1;i++){Books books = booklist.getBooks(i+1);booklist.setBooks(books,i);}//书的个数减一booklist.setBooklistsize(size-1);System.out.println("删除成功!!");}
}

returnbooks类:

package opertion;import book.Booklist;import java.util.Scanner;//主要思路和借书一样,代码跟借书的代码差不多,还书判断有没有该本书public class returnbooks implements IO{@Overridepublic void work(Booklist booklist) {System.out.println("返还书籍!!");System.out.println("请输入要归还书籍的名称:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();int i = 0;for(;i<booklist.getBooklistsize();i++){if(name.equals(booklist.getBooks(i).getName())){System.out.println("归还成功!!");booklist.getBooks(i).setBeborrow(false);}if(i ==booklist.getBooklistsize()){System.out.println("没有该本书!!");}}}
}

exit类:

package opertion;import book.Booklist;//代码很简单,关键是能会运用System.exit(0)这个操作
public class exit implements IO{@Overridepublic void work(Booklist booklist) {System.out.println("退出系统!!");System.exit(0);}
}

4.user包

user包主要包含了Adminuser,commonuser和User这几个类,其中User为抽象类,Adminuser和commonuser这两个类通过继承来实现menu(菜单)这个抽象方法,以此来展示不同的界面。

详细见下代码,有注释:

user类

package user;import book.Booklist;//抽象方法
abstract public class User {//包含了私有的成员变量,用户名private String name;//构造函数public User(String name){this.name = name;}//获取名字public String getName() {return name;}//抽象方法abstract public void menu(Booklist booklist);}

Adminuser类(难点,有解析)

package user;import book.Booklist;
import opertion.*;import java.util.Scanner;//继承User类public class Adminuser extends User{//难点:接口为引用类型,定义和初始化一个接口类型的数组,// 且成员为实现接口的类的实例,此处发生了向上转型,下面使用会用到    //利用接口类型的数组,巧妙的的解决了实现不同功能的问题IO[] io = new IO[]{new exit(),new delbooks(),new addbooks()};//构造函数,先初始化父类的,用superpublic Adminuser(String name){super(name);}public void menu(Booklist booklist) {int i;//用getname来获取封装后的name,可以用super也可以不用    System.out.println(super.getName()+" "+"你好!!"+"欢迎来到管理员界面**********");System.out.println("1.删除书籍");System.out.println("2.添加书籍");System.out.println("0.退出系统");System.out.println("请选择:");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();for (i = 0;  i< io.length ; i++) {if(i == choice){//接上面的难点 ,向上转型,一个对象面对不同对象会有不同的作用io[i].work(booklist);}}}
}

commonuser类(和上面的一样,不做解析了)

package user;import book.Booklist;
import opertion.*;import java.util.Scanner;public class commonuser extends User{IO[] io = new IO[]{new exit(),new borrowbooks(),new findbooks(),new returnbooks()};public commonuser(String name){super(name);}@Overridepublic void menu(Booklist booklist) {int i;System.out.println(super.getName()+" "+"你好!!"+"欢迎来到普通用户界面*********");System.out.println("1.借阅书籍");System.out.println("2.查询书籍");System.out.println("3.返还书籍");System.out.println("0.退出系统");System.out.println("请选择:");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();for (i = 0;  i< io.length; i++) {if(i == choice){io[i].work(booklist);}}}
}

5.Main类

Main类用于写主函数用来执行执行登录的操作。

详细代码见下,有解析:

import book.Booklist;
import book.Books;
import user.Adminuser;
import user.User;
import user.commonuser;
import java.util.Scanner;public class Main {//使用静态函数,登录操作,不用实例化直接调用//User为返回值类型,public static User login(){System.out.println("请输入你的姓名:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();System.out.print("请输入你的身份:1.管理员  2.普通用户 --》");int num = scanner.nextInt();if(num == 1){//注意,发生向上转型,因为User为返回值类型且为父类return new Adminuser(name);}else {return new commonuser(name);}}public static void main(String[] args) {//实例化对象booklist,后面的传参都会用到Booklist booklist = new Booklist();User user = login();while(true){//体现了多态的特点,面对不同对象会发生不同的状态user.menu(booklist);}}
}

6.操作结果

 

 7.总结:

写这个系统首先要有一个框架,要知道有哪个对象、对象在那个包、怎么合理的利用接口,抽象类等知识。这个系统的难点主要在利用接口类型的数组来实现不同功能以及利用向上转型实现来实现一个对象面向另一个对象所产生的不同的功能;此外还有封装,如怎样访问私有的成员等。详细请看每个代码的注释。

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

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

相关文章

Pytorch的安装教程,解决jupyter不能使用pytorch的问题

一.Pytorch的安装教程&#xff1a;PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】_哔哩哔哩_bilibili 在anaconda prompt 提示符输入以下语句&#xff1a; 激活pytorch环境&#xff1a;conda activate pytorch查看pytorch环境下安装了…

嵌入式linux驱动开发篇之设备树

什么是设备树&#xff1f; 设备树&#xff08;Device Tree&#xff09;是一种用于描述嵌入式系统硬件组件及其连接关系的数据结构。它被广泛用于嵌入式 Linux 系统&#xff0c;尤其是针对使用多种不同架构和平台的嵌入式系统。它是一种与硬件描述相关的中间表示形式&#xff0c…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第五天-ARM Linux编程之设备节点 (物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1hOBKyRom-4EZMBpFn1H9kQ?pwd1688 提取码&#xff1a;1688 Linux设备节点 设备管理是linux中比较基础的东西&#xff0c;但是由于Linux智能程度的越来越高&#xff0c;Udev的使用越来越广泛&#xff0c;使得越来越多的Linux新用户对…

vivado Convergent Rounding (LSB CorrectionTechnique)

DSP块基元利用模式检测电路来计算收敛舍入&#xff08;要么为偶数&#xff0c;要么为奇数&#xff09;。以下是收敛舍入推理的示例&#xff0c;它在块满时进行推理并且还推断出2输入and门&#xff08;1 LUT&#xff09;以实现LSB校正。 Rounding to Even (Verilog) Filename: …

如何生成狗血短剧

如何生成狗血短剧 狗血短剧剧本将上述剧本转成对话 狗血短剧剧本 标题&#xff1a;《爱的轮回》 类型&#xff1a;现代都市爱情短剧 角色&#xff1a; 1. 林晓雪 - 女&#xff0c;25岁&#xff0c;职场小白&#xff0c;善良单纯 2. 陆子轩 - 男&#xff0c;28岁&#xff0c;公…

WINCC如何新增下单菜单,切换显示页面

杭州工控赖工 首先我们先看一下&#xff0c;显示的效果&#xff0c;通过下拉菜单&#xff0c;切换主显示页面。如图一&#xff1a; 图1 显示效果 第一步&#xff1a; 通过元件新增一个组合框&#xff0c;见图2&#xff1b; 组合框的设置&#xff0c;设置下拉框的长宽及组合数…

GPT4的平替llama2本地部署教程,打造自己的专属大模型

llama2 是Meta公司发布的大预言模型&#xff0c;而且是一款开源免费的AI模型。光开源这个格局就吊打了GPT。从性能上来说更是号称是GPT4的平替。 今天这篇文章会从以下几个方面介绍下llama2&#xff1a; 1 基本介绍 2 本地mac环境部署llama2 llama2官方网址 https://llama…

Rust 数据结构与算法:1算法分析之乱序字符串检查

Rust 数据结构与算法 一、算法分析 算法是通用的旨在解决某种问题的指令列表。 算法分析是基于算法使用的资源量来进行比较的。之所以说一个算法比另一个算法好,原因就在于前者在使用资源方面更有效率,或者说前者使用了更少的资源。 ●算法使用的空间指的是内存消耗。算法…

JAVA语言程序设计 第12版 5.14题

求两个数之间的最大公约数 public class exer14 {public static void main(String[] args) {//方法 1Scanner inputnew Scanner(System.in);System.out.println("Enter first integer : ");int n1input.nextInt();System.out.println("Enter second integer: &…

JDK 17 新特性 (一)

既然 Springboot 3.0 强制使用 JDK 17 那就看看 JDK17 有哪些新特性吧 参考链接 介绍一下 新特性的历史渊源 JDK 17是Java Development Kit&#xff08;JDK&#xff09;的一个版本&#xff0c;它是Java编程语言的一种实现。JDK 17于2021年9月14日发布&#xff0c;并作为Java …

基于springboot智慧外贸平台源码和论文

网络的广泛应用给生活带来了十分的便利。所以把智慧外贸管理与现在网络相结合&#xff0c;利用java技术建设智慧外贸平台&#xff0c;实现智慧外贸的信息化。则对于进一步提高智慧外贸管理发展&#xff0c;丰富智慧外贸管理经验能起到不少的促进作用。 智慧外贸平台能够通过互…

js脚本的 defer 和 async 的区别

defer 和 async 都是用于控制 HTML 中 <script> 标签加载和执行 JavaScript 的属性&#xff0c;它们的作用有所不同&#xff1a; defer&#xff1a; 当浏览器遇到带有 defer 属性的 <script> 标签时&#xff0c;它会继续解析 HTML 页面&#xff0c;同时并行下载 de…

ddp是什么意思

DDP通常代表"Distributed Data Parallelism"&#xff0c;即分布式数据并行。它是一种用于训练深度学习模型的并行计算策略。在深度学习中&#xff0c;模型训练通常需要处理大量的数据和复杂的计算任务。DDP的目标是通过将数据和计算任务分布到多个计算设备&#xff0…

神经网络算法原理

目录 得分函数 数学表示 计算方法 损失函数 ​编辑 前向传播 反向传播 ​编辑 整体架构 正则化的作用 数据预处理 ​过拟合解决方法 得分函数 得分函数是在机器学习和自然语言处理中常用的一种函数&#xff0c;用于评估模型对输入数据的预测结果的准确性或匹配程度。…

【Python---六大数据结构】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python---六大数据结构 往期内容前言概述一下可变与不可变 Number四种不同的数值类型Number类型的创建i…

2024年【天津市安全员B证】新版试题及天津市安全员B证复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员B证新版试题参考答案及天津市安全员B证考试试题解析是安全生产模拟考试一点通题库老师及天津市安全员B证操作证已考过的学员汇总&#xff0c;相对有效帮助天津市安全员B证复审考试学员顺利通过考试。 1、…

人工智能学习与实训笔记(七):神经网络之模型压缩与知识蒸馏

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 七、模型压缩与知识蒸馏 7.1 模型压缩 7.2 知识蒸馏 7.2.1 知识蒸馏的原理 7.2.2 知识蒸馏的种类 7.2.3 知识蒸馏的作用 七、模型压缩与知识蒸馏 出于对响应速度&#xff0c;存储大小和能…

(07)Hive——窗口函数详解

一、 窗口函数知识点 1.1 窗户函数的定义 窗口函数可以拆分为【窗口函数】。窗口函数官网指路&#xff1a; LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundationhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual%20Windowing…

【Redis实战】有MQ为啥不用?用Redis作消息队列!?Redis作消息队列使用方法及底层原理高级进阶

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Redis实战与进阶》 本专栏纯属为爱发电永久免费&#xff01;&a…

致敬新春“不回家”的厨师,李锦记让厨师的年味更有滋味

“新春饭市万家团圆&#xff0c;致敬千万坚守岗位的厨师” 新春团圆饭向来是餐饮行业最为关注的节点&#xff0c;但过去几年&#xff0c;在疫情与后疫情时期&#xff0c;新年团圆饭市不免冷清。而今年餐饮行业真正迎来“龙抬头”&#xff0c;龙年除夕夜的团圆饭市终于重迎来了…