图书管理系统在C、C++、Java学习中我们都会进行练习来串联我们学习的一些知识以及使用场景,这里跟着我我带大家敲Java版本!

结果展示:

这是我们最终实现的图书管理系统,下面我们慢慢来

思路:

Java是面向对象的语言特点是:封装、继承、多态。我们在实现每一个功能的时候需要注意这些才能体现出Java语言的风格。

我们先把需要的操作先罗列出来然后再一点点实现这个图书管理系统,一个图书管理一定要有书的属性、书架、需要的一些操作、用户界面以及串联其他们的操作

我给大家列出来了:

我们把这三个大方向做包,分别在三个包下做这些内容

我们先了解下toString方法:

这里的book是一个类的对象

如果我们用System.out.println(book)会得到什么呢?会不会想的是对应的地址哈希地址但是为什么呢?其实每一个类都会有对应的toString方法在Object这个父类当中如果传入的是空内容返回的是null否则返回
Main$Student@1b6d3586一类的东西,如果我们重写这个方法就可以直System.out.println(book)来得出书籍的所有属性!

1.1 Book (book包)

在这个类里我们参加实例成员书名,作者,价格,类型,借阅情况。(这里的成员我们用private修饰体现封装)然后留出对应的访问方法来访问这些内容

成员

private String name;private String author;private int price;private boolean isBorrowed;private String type;

 对应的访问方法

并且在构造方法中就加入这些属性来构架出这个书。

重写toString方法访书籍的属性

这样我们写完Book这个类

public class Book {private String name;private String author;private int price;private boolean isBorrowed;private String type;@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", isBorrowed=" +((isBorrowed==true)?"已被借阅":"未被借阅" )+", type='" + type + '\'' +'}';}public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}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 boolean isBorrowed() {return isBorrowed;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}public String getType() {return type;}public void setType(String type) {this.type = type;}
}

1.2 BookList(book包)

暑假中我们放一个Book类型的数组存放书籍,用usedSize来记录书籍的本数也都是用private修表现封装,留出对应的访问方法。这里我们先初始化三本书

 books[0]=new Book("西游记", "吴承恩", 111, "名著");books[1]=new Book("三国演义", "罗贯中", 222, "名著");books[2]=new Book("红楼梦", "曹雪芹", 333, "名著");

这样我们的BookList类也写完了,这里还是很容易实现的

public class BookList {Book books[]=new Book[10];private int usedSize;public BookList() {books[0]=new Book("西游记", "吴承恩", 111, "名著");books[1]=new Book("三国演义", "罗贯中", 222, "名著");books[2]=new Book("红楼梦", "曹雪芹", 333, "名著");usedSize=3;}public Book getBooks(int pos) {return books[pos];}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public void setBooks(int pos,Book book) {this.books[pos] = book;}
}

2.1  opperation包下的类

因为每一个操作都需要访问书架BookList所以我们留一个IOperation的接口里面留一个

work(BookList bookList);方法让下面的操作访问书架

2.1.1  AddOperation(添加操作)

这里新增图书并放在书架的顶部位置

getUsedSize在BookList类中得到书的本数并在对应的位置放上添加的数再让书的本书+1

public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("添加图书");Scanner scanner=new Scanner(System.in);System.out.println("请输入添加书籍的名称》");String name=scanner.nextLine();System.out.println("请输入作者的姓名》");String auther=scanner.nextLine();System.out.println("请输入书籍的价格》");int price=scanner.nextInt();System.out.println("请输入书籍的类型》");scanner.nextLine();String type=scanner.nextLine();Book book=new Book(name,auther,price,type);bookList.setBooks(bookList.getUsedSize(),book);System.out.println("添加成功!");bookList.setUsedSize(bookList.getUsedSize()+1);}
}

2.1.2  DeltOperation(删除操作)

遍历寻找要找的书籍并把每一个书籍向前移动,到了链表就可以更加快捷

需要注意的是名字的比较要用equals方法 A.equals(B)如果使用A==B比较的是它们对应的地址

public class DeltOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("删除图书");System.out.println("请输入你想要删除书籍的名称》");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int size=bookList.getUsedSize();boolean key=false;for (int i = 0; i < size-1; i++) {if (bookList.getBooks(i).getName().equals(name)||key==true) {Book book=bookList.getBooks(i+1);bookList.setBooks(i,book);}}bookList.setUsedSize(bookList.getUsedSize()-1);System.out.println("删除成功!");}
}

2.1.3  DisPlayOperation(书籍展示)

这里的就用到了Book类中对Objecrt的toString方法重写

这里肯定会有人疑问为什么不直接用Systeam.out.println(books[i])来输出书籍的信息呢?

这里的books是private修饰的我们做了封装处理,

public class DisPlayOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("显示图书");int size=bookList.getUsedSize();for (int i = 0; i < size; i++) {System.out.println(bookList.getBooks(i));}}
}

2.1.4  FindOperation(查找操作)

这里的寻找对应名字也要用equals方法

public class FindOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("查找图书");System.out.println("请输入想要查找的图书》");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int size= bookList.getUsedSize();for (int i = 0; i < size; i++) {if (bookList.getBooks(i).getName().equals(name)) {System.out.println(bookList.getBooks(i));return;}}System.out.println("未找到你想要寻找的书");}
}

2.1.5  BorrowOperation(借阅操作)

这里遍历一遍再将对应位置的借阅情况更改下就好了

public class BorrowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("借阅图书");System.out.println("请输入你要借阅书籍的名称》");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int size=bookList.getUsedSize();for (int i = 0; i < size; i++) {if(bookList.getBooks(i).getName().equals(name)) {bookList.getBooks(i).setBorrowed(true);System.out.println("借阅成功!");return;}}System.out.println("未找到相关书籍!");}
}

2.1.6 ReturnOperation (归还操作)

public class ReturnOperaion implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("归还图书");System.out.println("请输入你要归还图书的名称》");Scanner scanner=new Scanner(System.in);String name= scanner.nextLine();for (int i = 0; i < bookList.getUsedSize(); i++) {if(bookList.getBooks(i).getName().equals(name)) {bookList.getBooks(i).setBorrowed(true);System.out.println("归还成功!期待下次借阅!");return;}}System.out.println("未找到此书籍!归还失败!请到前台咨询此服务!");}
}

2.1.7 ReturnOperation (退出系统)

public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出程序");exit(1);}
}

users包的操作实现用户和管理者的界面与操作逻辑

3.1.1 User类

这个类是用户和管理者的父类需要被继承,这样设计的一方面原因是面向对象语言的特点,还有一方面是这样实现可以简略代码的重复便于理解

这个类中我们要定义name来存放用户和管理者的名字,menu菜单功能在这个里面不需要实现就使用抽象类abstract修饰再对应的子类实现对应的菜单,操作需要按照菜单进行操作所以我们需要一个IOperation这个类的操作数组有人会异或为什么是IOpernation类型呢?这只是一个接口为什么要用它,这里其实发生了向上转型,这个数组将存放各种书架操作,而这些操作是需要IOpernation接口,全部展开就是IOpernation iOpernation=new AddOpernation......这些操作,可以理解成父类继承的向上转型然后再运行时发生动态绑定将对应的menu方法和操作方法替换

里面写一个doOperation实现功能方法

this.iOperations[choice].work(bookList)里this就是本类的iOpernations操作数组的第choice个操作对应的work实现方法。

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

3.1.2  AdminUser管理员

重写对应的menu和对应的操作数组

public class AdminUser extends User{public AdminUser(String name) {super(name);this.iOperations=new IOperation[] {new ExitOperation(),new DisPlayOperation(),new FindOperation(),new AddOperation(),new DeltOperation()};}@Overridepublic int menu() {System.out.println("hello "+name);System.out.println("1.显示图书");System.out.println("2.查找图书");System.out.println("3.添加图书");System.out.println("4.删除图书");System.out.println("0.退出系统");System.out.println("请输入你的操作》");Scanner scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}

3.1.3 NormalUser用户

也是重写对应的menu以及操作方法数组

public class NormalUser extends User{public NormalUser(String name) {super(name);this.iOperations=new IOperation[] {new ExitOperation(),new DisPlayOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperaion()};}@Overridepublic int menu() {System.out.println("hello "+name);System.out.println("1.显示图书");System.out.println("2.查找图书");System.out.println("3.借阅图书");System.out.println("4.归还图书");System.out.println("0.退出系统");System.out.println("请输入你的操作》");Scanner scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}

下面是实现这些所有功能的类

这里我们需要先写一个login里面写登录的基本语言以及选择管理员登录还是用户登录

public static User login() {System.out.println("欢迎来到图书系统!");System.out.println("请输入你的昵称》");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();System.out.println("1.用户登录    2.管理员登录");int user=scanner.nextInt();if(user==1){return new NormalUser(name);}else {return new AdminUser(name);}}

再使用main来串联起这些所有功能,使对应的用户功能实现在对应的内部实现

以上就是图书管理系统的内容了,完整代码放在22_5_18_book/src · 404NOt/Java - 码云 - 开源中国 (gitee.com)

我的总结可能不是十分到位,也可能会有专业上的疏忽欢迎在评论区留言!

Java图书管理系统(代码及详解)相关推荐

  1. java中静态代码块详解

    参考博客:https://blog.csdn.net/qq_36792191/article/details/103988565 1.静态代码块基本知识 **(1)静态代码块:**执行优先级高于非静态 ...

  2. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

  3. java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...

    本文详细介绍组成非阻塞通信的几大类:Buffer.Channel.Selector.SelectionKey 非阻塞通信的流程ServerSocketChannel通过open方法获取ServerSo ...

  4. java学习 类变量 类方法_这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下类变量(...

    这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类变量(static) 类变量是该类的所有对象共 ...

  5. Java 代码块详解

    文章目录 Java 代码块详解 基本介绍 基本语法 代码块示例 代码块使用细节 Java 代码块详解 基本介绍 代码块又称 初始化块, 是类的一部分,属于类中的成员,类似于方法,将逻辑语句封装在方法体 ...

  6. Java 泛型(generics)详解及代码示例、Java 类型通配符详解及代码示例

    Java 泛型(generics)详解及代码示例.Java 类型通配符详解及代码示例 - 概念 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制 ...

  7. Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3

    Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3 总览 问题 详解 String.intern()的作用 link LeetCode的Two Sum题 ...

  8. 40000+字超强总结?阿里P8把Java全栈知识体系详解整理成这份PDF

    40000 +字长文总结,已将此文整理成PDF文档了,需要的见文后下载获取方式. 全栈知识体系总览 Java入门与进阶面向对象与Java基础 Java 基础 - 面向对象 Java 基础 - 知识点 ...

  9. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

  10. java中的进制输出转换_Java I/O : Java中的进制详解

    作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...

最新文章

  1. LeetCode简单题之下载插件
  2. LeetCode 850. Rectangle Area II
  3. 电脑经典的小技巧48条
  4. open3d 0.13版本 vs2019编译
  5. Hinton向量学院推出神经ODE:超越ResNet 4大性能优势
  6. mfc 多窗口之间互相切换
  7. vue日期格式化实例
  8. python3 x和python2 x区别_Python知识:Python 3.x和2.x版本的使用区别
  9. SpaceX提交星链项目修订申请,计划用星际飞船发射3万颗卫星
  10. 嵌入式linux的tftp配置[ZT]
  11. java 线程句柄_关于多个的线程操作文件 文件句柄(java中得文件流)
  12. 记一次反制追踪溯本求源
  13. pvr转png工具_pngtosvg 一个神奇的在线工具
  14. [Hive]Hive合并小文件
  15. Delegate如何进行类型转换?
  16. React后台管理系统-订单管理
  17. 数据库mysql项目实战 一
  18. 关于computer vision的会议及vision guys-机器学习与视觉大牛族谱深度挖掘
  19. 数据结构1800试题(第四章)
  20. unknown mutation type SET_SINGER

热门文章

  1. java怎么反编译_java如何进行反编译
  2. 《圈圈教你玩USB》 第三章 USB鼠标的实现——看书笔记( 3 )
  3. winform倒计时
  4. 高德地图android离线包下载,高德地图(车机版)离线包下载与安装
  5. 详解超网技术(路由聚合技术)
  6. 20个最强的基于浏览器的在线代码编辑器
  7. php的登陆代码,PHP登陆页面完整代码
  8. 黑马程序员——三天快速入门python机器学习(总结篇)
  9. Windows传统取证的一些笔记
  10. C语言学生课程管理系统