文章目录

  • 前言
  • 图书管理应实现的功能
  • 准备工作
  • 开始操作
    • 先在book包,创建一个Book类,用来存储一本书的信息
    • 小技巧:
    • 根据小技巧来创造我们的 构造方法,公开的输入输出的接口,,还要重写的toString方法
      • 代码如下(轻轻松松70行代码):
    • 在Book包里,再创建一个 BookList 用顺序表实现书架,
      • 初步实现
      • 接下来就是先那些功能,但是我不想 像 顺序表那样,把所有的操作都写在一起。我把这些操作过程都面向对象,
        • 首先创建一个包用来 存储 操作类
      • 现在我们就来初步实现它们
    • 再来看 user 包,我们需要写什么
      • 管理员菜单 && 普通用户菜单
      • 菜单已建立好了,接下来。就需要调用一下,看下效果,
        • 效果图
    • 进入下一个阶段,既然现在已经能够打印出菜单。接下来就是 选择菜单中的功能,并将其使用。
      • 效果图
    • 显示图书功能(完善操作功能)
      • 需做的一些修改
      • 效果图
    • 添加图书功能
      • 附图
    • 前面有一个小瑕疵
    • 查找图书功能
      • 效果图
    • 退出功能
    • 删除功能
      • 效果图
    • 借阅图书
      • 效果图
    • 归还图书功能
      • 附图
  • 至此,图书管理的全部功能已经全部实现。
    • 最后附上 各类程序总图,本文结束。
      • 包和类的分布图
      • Main(程序入口)
      • User (用户,父类)
      • AdminUser (用户 - 管理员-子类)
      • NormalUser (用户 - 普通用户 - 子类)
      • 接口 IOperation
    • AddOperation(添加图书)
      • BorrowOperation (借阅图书)
      • DelOperation(删除图书)
      • DisplayOperation (显示书籍)
      • ExitOperation (退出系统)
      • FindOperation(查找图书)
      • ReturnOperation (归还书籍)

前言

本文主要目的: 将前面的博客内容,做一个整合,
实现图书管理涉及的知识点:类,对象,抽象类,接口,封装,继承,多态,顺序表


图书管理应实现的功能

1. 输入用户名
2.是以什么身份登录(普通用户还是管理员)
3.普通用户选项菜单 && 管理员选项菜单
4.功能实现(普通用户和管理员菜单可操作的功能有所不同)
 4.1查找图书(普通用户 和 管理员)
 4.2新增图书(管理员)
 4.3删除图书(管理员)
 4.4显示图书(普通用户 和 管理员)
 4.5退出系统(普通用户 和 管理员)
 4.6借阅图书 (普通用户 )
 4.7归还图书(普通用户 )
5.隐藏功能(就是背地里完成的功能)
 5.1 存储数的信息
 5.2 书不止一本,所以该怎么存储.
 5.3 业务功能,就是说别人还书,借书的指引,或者提示什么的。


准备工作

开始操作

先在book包,创建一个Book类,用来存储一本书的信息


小技巧:


根据小技巧来创造我们的 构造方法,公开的输入输出的接口,,还要重写的toString方法

代码如下(轻轻松松70行代码):

public class Book {// 做项目的时候,成员变量几乎都是private修饰的,确保数据的安全性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/*Boolean isBorrowed*/) {// 构造方法this.name = name;this.author = author;this.price = price;this.type = type;
//        this.isBorrowed = isBorrowed; 这个没必要写,因为布尔类型的属性,默认值为false,意为没有被借出}
// 由于成员变量都是private修饰的,所以要提供公开的输入输出接口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 getBorrowed() {return isBorrowed;}public void setBorrowed(Boolean borrowed) {isBorrowed = borrowed;}
// 再来重写 toString 方法,让它按照我们想要额方式来输出@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", isBorrowed=" + isBorrowed +'}';}
}

在Book包里,再创建一个 BookList 用顺序表实现书架,


初步实现

public class BookList {private Book[] books = new Book[10];//初始书架空间为10本书private int usedSize;// 默认初始存储为 0// 假设默认存放四本书,通过调用构造方法来实现,public BookList(){books[0] = new Book("三国演义","罗贯中",40,"小说");books[1] = new Book("西游记","吴承恩",45,"小说");books[2] = new Book("水浒传","施耐庵",47,"小说");books[3] = new Book("红楼梦","曹雪芹",50,"小说");this.usedSize = 3;}// 获取当前书架上有几本书public int getUsedSize() {return usedSize;}// 在增删的时候,需要用到public void setUsedSize(int usedSize) {this.usedSize = usedSize;}// 一般图书馆的书,都是有编号的,假设书的编号 为 我们元素的下标// 输入编号,返回书籍信息public Book getPos(int pos){//考虑pos位置的合法性if (pos<0&&pos>usedSize){System.out.println("没有书籍的编号符合你的需求。");return null;}return  this.books[pos];}}

接下来就是先那些功能,但是我不想 像 顺序表那样,把所有的操作都写在一起。我把这些操作过程都面向对象,

首先创建一个包用来 存储 操作类


现在我们就来初步实现它们

仔细想想,后面的所有操作都是对顺序表数据,进行操作的。
那么我们就把提取出来,作为接口。

这么做的目的,就是为了方便导入 普通用户,和 管理员的功能,我可以通过这个接口引用全部功能。
因为 管理员 和 普通用户所使用的功能是有所不同的,有了这个接口,我们可以自主选择,那些是 管理员的功能,那些是普通用户的功能


再来看 user 包,我们需要写什么

user 用户的意思,无论是管理员,还是普通用户,都是用户。
那么就意味着两者具有共性,我们将其提取出来。

再建立两个类,分别是普通用户类 和 管理员类


管理员菜单 && 普通用户菜单


菜单已建立好了,接下来。就需要调用一下,看下效果,



效果图



进入下一个阶段,既然现在已经能够打印出菜单。接下来就是 选择菜单中的功能,并将其使用。

那么就意味着我们需要回过头,再去看看 AdminUser 和 NormalUser 这两个用户类,补充其功能。
第一步: 修改用户包中的三个类的menu方法


先别着急,虽然改好菜单,但是如何将管理员 和 普通用户 的 菜单功能实现 是一个问题,
接下来看着我的操作,现在 User 父类中创建一个 IOperation 数组

然后重点来了,我们先拿 AdminUser 起手

再来看普通用户就简单了

接下来就是至关重要的一步,细品。
简单来说:我们在 Uesr类中 创建一个doWork方法,来调用 其他功能类的方法,

通过 menu菜单的返回值(也就是用户选择的功能),

即IOperation 数组的元素下标,来选择相对应的功能对象,

根据 对象的引用,来调用其中方法,这也是为什么我们前面说 数组的元素,要对应菜单的顺序,是为了方便我们去调用它,

有些朋友可能基础不扎实,说,你都没有接收引用,你是怎么调用work方法的?
这里使用的是一次性对象(匿名对象)去访问的,课参考ClassAndObject -类与对象这篇博客,匿名对象的解释在导航最后,你可以通过点击导航,跳到那个位置去看,

而 User 中的 doWork 就是通过 匿名对象,去访问对象中的 work方法。,而work的工作形式,是由我们选择的对象所决定的,(多态)
多态不熟悉的朋友 可以参考 ObjectOrientedProgramming - 面向对象的编程(包、继承、多态的一部分:向下/向下转型,重写) 和 ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口) 这两篇博客,这两篇博客只要认真看,肯定收获颇丰。


效果图


由图发现虽然结果是我们想要的,但是 程序的结束,不是我们想要的,
比如说, 管理员 使用查找书籍功能,是为了观察书架上的数的情况,好对其增删查改。
我们这程序,使用一次功能就退出系统,想进行其它操作,还得重登,重新选择,多麻烦。是不是?
所以我们要在 加一个循环 。
效果如下:


循环的退出,交给我们的退出系统功能。
这也是我们下一步需要做的,完善操作功能。


显示图书功能(完善操作功能)

// 显示操作
public class DisplayOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("显示图书");for (int i = 0; i < bookList.getUsedSize(); i++) {Book book = bookList.getPos(i);// 换取书的信息System.out.println(book);}}
}

需做的一些修改

BookList


效果图


添加图书功能

添加图书默认放到最后一个位置
暂不考虑 书架满不满等其他业务实现,这里只是一个初步框架,有兴趣完善业务能力的,可以自行修改
import java.util.Scanner;
public class AddOperation implements IOperation{public void work(BookList bookList){System.out.println("新增图书");Scanner sc = new Scanner(System.in);System.out.println("请输入图书名称:");String name = sc.nextLine();System.out.println("请输入图书的作者:");String author = sc.nextLine();System.out.println("请输入图书的类型:");String type = sc.nextLine();System.out.println("请输入图书的价格:");int price = sc.nextInt();// 得到了 书的属性,就可以new Book 传参了Book book = new Book(name,author,price,type);// 得到目前书的数量,数组你知道的,下标从0开始,最后一本的的下标是usedSize-1.// 那么我们只需 下标 为usedSize,增加就可以了int size = bookList.getUsedSize();bookList.setBook(size,book);// 添加完一本书,书的数量加一bookList.setUsedSize(size+1);System.out.println("添加成功");}
}

附图


前面有一个小瑕疵

这里应该是 false ,因为 布尔类型的默认值是 false。
但由于作者 前面写 String 类型,写顺手了,把 boolean 写成了封装类型 Boolean了。


当然这不是最主要的,我们的 isBoolean 使用用来表示书的 借出/归还 的状态。
解决也简单:修改 Book 重写的 toString 方法


查找图书功能

import java.util.Scanner;// 查找图书
public class FindOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("查找图书");Scanner sc = new Scanner(System.in);System.out.println("输入你要找的书籍名称:");String name = sc.nextLine();BookList bookList1 = new BookList();for (int i = 0; i < bookList1.getUsedSize(); i++) {Book book = bookList1.getPos(i);// 获取书籍信息if (name.equals(book.getName())){// 比较书名System.out.println("找到了,信息如下:");System.out.println(book);return;}}System.out.println("没有你所搜索的书籍");}
}

效果图


退出功能


删除功能

import java.util.Scanner;// 删除图书
public class DelOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("删除图书");System.out.println("输入你要删除书籍的名字:");Scanner sc = new Scanner(System.in);String name  = sc.nextLine();// 寻找删除书籍int index = 0;// 用来存储删除元素的下标int i = 0;for (; i < bookList.getUsedSize(); i++) {Book book = bookList.getPos(i);if (name.equals(book.getName())){index = i;break;}}// 进行删除if (i< bookList.getUsedSize()){for (int j = index; j < bookList.getUsedSize()-1; j++) {//                bookList[j] = bookList[j+1] error 错误写法,现在的 bookList 是一个变量,不是数组Book book = bookList.getPos(j+1);bookList.setBook(j,book);}bookList.setBook(bookList.getUsedSize(), null);// 将最后一个重复的元素(引用),置为null.bookList.setUsedSize(bookList.getUsedSize()-1);// 删除了一个元素,元素个数减一。System.out.println("删除成功");return;}System.out.println("没有你要删除的书");}
}

效果图


借阅图书

import java.util.Scanner;// 借阅图书
public class BorrowOperation implements IOperation{public void work(BookList bookList){System.out.println("借阅图书");System.out.println("请输入你想借阅的书籍名称:");Scanner sc = new Scanner(System.in);String name = sc.nextLine();for (int i = 0; i < bookList.getUsedSize(); i++) {Book book = bookList.getPos(i);// 获取此时下标为i的书籍if (name.equals(book.getName())){// 通过书名寻找要删除的书籍if(book.getBorrowed() ==  true){// true 代表书籍被借出System.out.println("你要借阅的书籍,已被借走。无法借阅。");System.out.println("信息如下:");System.out.println(book);return;}// false 表示未借出,借出时,将 isBorrowed 置为true。表示借出成功book.setBorrowed(true);System.out.println("借阅成功!");System.out.println(book);return;}}System.out.println("没有你要借阅的书籍");}
}

效果图


归还图书功能

import java.util.Scanner;// 归还图书
public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("归还图书");System.out.println("请输入你想借阅的书籍名称:");Scanner sc = new Scanner(System.in);String name = sc.nextLine();for (int i = 0; i < bookList.getUsedSize(); i++) {Book book = bookList.getPos(i);if (name.equals(book.getName())){if(book.getBorrowed() ==  false){System.out.println("你要归还的书籍,已归还。无法重复此操作。");System.out.println("信息如下:");System.out.println(book);return;}// true 表示已借出,归还时,将 isBorrowed 置为false。表示归还成功book.setBorrowed(false);System.out.println("归还成功!");System.out.println(book);return;}}System.out.println("你要归还的书籍,不属于本图书馆。");}
}

附图




至此,图书管理的全部功能已经全部实现。

最后附上 各类程序总图,本文结束。

包和类的分布图

Main(程序入口)


User (用户,父类)


AdminUser (用户 - 管理员-子类)


NormalUser (用户 - 普通用户 - 子类)


接口 IOperation


AddOperation(添加图书)


BorrowOperation (借阅图书)


DelOperation(删除图书)


DisplayOperation (显示书籍)


ExitOperation (退出系统)


FindOperation(查找图书)


ReturnOperation (归还书籍)

BookCollectionSoftware - 图书管理(知识点糅合::类,对象,抽象类,接口,封装,继承,多态,顺序表)- java - 细节狂魔相关推荐

  1. python根据一个基类生成派生类_python中的封装继承多态

    1.封装 类的封装可以隐藏类的实现细节,迫使用户只能通过方法去访问数据,这样就可以增强程序的安全性.接下来演示未使用封装可能出现的问题,如例所示. 在例中,运行结果输出的成绩为-68,在程序中不会有任 ...

  2. 【Kotlin】Kotlin 面向对象 ( 类 | 成员变量 | 成员方法 | 封装 | 继承 | 多态 )

    文章目录 I . 创建简单类 ( 整型字段 ) II . 创建简单类 ( 整型字段 + 字符串字段 ) III . 类方法定义 IV . 封装 V . 继承 VI . 多态 与 抽象类 I . 创建简 ...

  3. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  4. python--编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音------使用类的封装继承多态的问题/使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息

    编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音 ------使用类的封装继承多态的问题 class Instrumnet():#乐器类def make_sound(self):pa ...

  5. 用Java实现 图书管理系统 使用类,抽象类,封装,继承,多态,接口等知识点

    目录 图书管理系统 简单的示意图: 分析: 各个类的实现 1.Book类 2.BookList类 3.因为Operation包中各个操作都需要用到book,所以创建一个接口IOperation 4.U ...

  6. Java常用知识点汇总(基础:数组,类与对象,接口与继承)

    目录 数组 1.引用 2.增强型for循环 3.复制数组 arraycopy() 4.针对数组的工具类 Arrays 5.选择法排序 6.冒泡排序 7.练习-二维数组中的查找(剑指offer) 类与对 ...

  7. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  8. 【Python】类与对象:封装/继承/多态

    在python中如何将一些功能借鉴及实现? python模块的迁移调用?感觉还是没有形成系统化的构建? 在学习C++的时候,来了一丝灵感,python的重点不是也是类和对象吗? 本人实践python项 ...

  9. php对象的三大特征,关于php中面向对象的三大特征(封装/继承/多态)

    最近在学习php的过程中发现它其实比java的语言要松散很多,而且很多人说上手比较容易,但是智言我个人并不是很认同这样的观点,因为其实java的整个语法规则都非常的有条有理,虽然函数很多,但是至少经常 ...

最新文章

  1. 厉害了,用Python实现自动扫雷!
  2. centos 安装指定版本gc_CentOS 环境安装所需命令
  3. java 文件夹删除_java创建删除文件及文件夹大全
  4. GCJ 2009 Round1C C Bribe the Prisoners
  5. linux c mysql 封装_本人对MYSQL C API做的一个封装,希望对linux C++程序员有点帮助,同时欢迎拍砖!...
  6. 在路上(on the road)
  7. JDK5--Annotation学习:基础(二)
  8. Storm 02_Storm 计算模型
  9. 奇怪的匿名函数之争EventHandler
  10. c++获取当前时间戳_python开发:python时间模块的使用
  11. ARM 指令集版本和ARM 版本z
  12. 数据结构 /ord ;集合;dict()
  13. 17年,寻找出路的一年
  14. 计算机组成原理在线实验,计算机组成原理编程实验
  15. 如何自动化入侵海康设备
  16. 充电器input与output_变频器input和output的区别?
  17. u盘文件看得见却打不开_u盘可以显示但是打不开怎么办
  18. 足球战术训练的几种方法
  19. ADAMS三维路面重构
  20. 向工程腐化开炮 | 治理思路全解

热门文章

  1. python羊车门问题_python羊车门问题的正确解答
  2. nRF24L01+ 数据手册
  3. bind dlz mysql ptr_Bind+DLZ+MySQL智能DNS的正向解析和反向解析实现方法
  4. 通信工程/电子信息工程 保研夏令营/预推免流程分析
  5. html图片如何和输入框并排,闪亮的4个小文本输入框并排
  6. 托福高频真词List05 // 附托福TPO阅读真题
  7. 用Go建千亿级微服务 分析详细,适合新手理解概念
  8. 服务器安装docker和docker-compose,并开放2375端口
  9. 华为什么时候能升android10,华为手机什么时候升级安卓Q 华为首批适配Android10机型列表...
  10. 投影仪如何选择?怎样选购家用投影仪