用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,一经查实,立即删除!

相关文章

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

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

如何生成狗血短剧

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

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

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

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

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

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

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

神经网络算法原理

目录 得分函数 数学表示 计算方法 损失函数 ​编辑 前向传播 反向传播 ​编辑 整体架构 正则化的作用 数据预处理 ​过拟合解决方法 得分函数 得分函数是在机器学习和自然语言处理中常用的一种函数&#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;龙年除夕夜的团圆饭市终于重迎来了…

腾讯云4核8G服务器能支持多少人访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

挑战杯 Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; Yolov安全帽佩戴检测 危险区域进入检测 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&am…

Quantitative Analysis: PIM Chip Demands for LLAMA-7B inference

1 Architecture 如果将LLAMA-7B模型参数量化为4bit&#xff0c;则存储模型参数需要3.3GB。那么&#xff0c;至少PIM chip 的存储至少要4GB。 AiM单个bank为32MB&#xff0c;单个die 512MB&#xff0c;至少需要8个die的芯片。8个die集成在一个芯片上。 提供816bank级别的访存带…

C++入门学习(二十九)goto语句

在C中&#xff0c;goto语句是一种控制流语句&#xff0c;用于无条件地转移到程序中指定的行。goto语句的使用通常是不推荐的&#xff0c;因为它可能导致代码结构变得混乱、不易理解和维护。然而&#xff0c;在某些特殊情况下&#xff0c;goto语句可能是一种有效的解决方法。 示…

php switch、for、foreach、while、do...while

php switch 1. switch2. for循环3. foreach4. while、do...while 1. switch <?php$height 190;switch ($height) {case 160:echo 太矮了;break; //跳出本次循环case 170:echo 还行吧;break; //跳出本次循环case 180:echo 帅哥;break; //跳出本次循环default:echo 迷; }2.…

机器学习面试:请你谈谈生成模型和判别模型的区别?

生成模型:由数据学习联合概率密度分布P(XY)&#xff0c;然后求出条件概率分布P(YIX)作为预测的模型&#xff0c;即生成模型:P(Y|X) P(X,Y)/ P(X)(贝叶斯概率)。基本思想是首先建立样本的联合概率概率密度模型P(X,Y)然后再得到后验概率P(Y|X)&#xff0c;再利用它进行分类。典型…

智胜未来,新时代IT技术人风口攻略-第四版(弃稿)

文章目录 前言鸿蒙生态科普调研人员画像高校助力鸿蒙高校鸿蒙课程开设占比教研力量并非唯一原因 企业布局规划全盘接纳仍需一段时间企业对鸿蒙的一些诉求 机构入场红利机构鸿蒙课程开设占比机构对鸿蒙的一些诉求 鸿蒙实际体验高校用户群体高度认同与影响体验企业用户群体未来可…

[高并发] - 1.高并发综述

1. 必备条件 高并发&#xff0c;高性能分布式ID 高并发过滤组件 Bloom FIlter 2. 数据库 &#xff08;1&#xff09;不要让mysql干不擅长的工作&#xff0c;例如全文搜索&#xff0c;而是采用对应的nosql来处理&#xff1b;对于擅长的存取数据则能很好胜任&#xff1b; &am…