基于这个小程序是要运用到类和对象,继承,多态,接口,抽象类,封装,数组这些所有学过的知识点来实现的,所以这次的文章篇幅可能比较长,写的比较细,也便于日后拿来复习。

首先先让大家感受一下这个小程序运行起来是怎么样的,程序员虽然专心管后端开发,但是在开发之前我们也要了解这个小程序是有哪些功能,怎么实现的~

运行程序,输入姓名字符串之后,会让用户确认身份,假设我们现在选择管理员选项,那么现在呈现在我们面前的就是一个管理员菜单,此时我们再选4,显示图书:

当书籍显示之后,我们再运行另一个功能上试试:

选择查找书籍之后:

新增图书:

此时新增过后再显示一次图书让大家看看:

删除图书:

可以看到此时已经删除成功了,0退出系统即可,现在再来展示一下普通用户操作入口,接下来的操作与上面管理员较相似,只是功能不同,所以下面就贴图不码字演示了:

查找:

借阅:

此时再借阅同一本书就会提示我们已借出:

归还:

还书之后再次变为未借出状态:

这就是完整的一个小程序功能实现,接下来我们程序员就要只关注设计本身了,不关注业务本身,也就是接下来要用代码实现了。

我们创建一个book包,在这个包底下新建一个类Book:

将来这个类就是我们书籍这个对象,那么现在来定义这个类:

既然这里的成员变量都被封装好了,那么以后类外想获取的话就要调用getter和setter方法了,所以这里右键Generate让编译器帮我们写这些方法:

然后getter 和 setter方法创建好之后,我们就要写构造方法了,因为我们每一次往书架上放一本书都要构造一个对象出来,所以这里也同样是右键Generate再Constructor,

这里不选最后一行的原因是我们包默认就是布尔类型的,如果不初始化的话,默认就是未借出书籍,因为我们如果真的有一本书实例化好变成一个对象了,那么这本书其实默认就是未借出的,所以这里可以不选最后一行, 这样一来带4个参数的构造方法就写好了,最后再重写一下toString()方便待会打印使用。

现在一下子70行代码就写完了:

public class Book {private String name;//书名private String author;//作者private int age;//价格private String type;//类型private boolean isBorrowed;//是否被接借出public Book(String name, String author, int age, String type) {this.name = name;this.author = author;this.age = age;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 getAge() {return age;}public void setAge(int age) {this.age = age;}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;}
}

现在相当于我们已经抽象出书籍这样的一个类,通过这个类可以产生无数个书对象,每一个对象所对应自己的属性都不一样,也就是书名、作者等等。

那现在我们就要抽象出一个书架出来,因为待会的项目肯定是不止一本书的。

我们可以把书架抽象为一个数组,那么这个数组的类型就是Book :

现在再在book包里新建一个类,作为书架:

设定书架的最大容量,现在比如程序运行起来,存在3本书,实例化Book类的时候, 代码如下:

public class BookList {private Book[] books = new Book[10];//这个书架的大小private int usedSize;//数组中放了几本书public BookList() {books[0] = new Book("三国演义","罗贯中",90,"小说");books[1] = new Book("西游记","吴承恩",78,"小说");books[2] = new Book("红楼梦","曹雪芹",89,"小说");this.usedSize = 3;}
}

然后现在也给usedSize创建一下getter 和 setter,事实获取一下这个数组里面有多少个元素

然后底下可以写所有对数组的操作,结束、还书等等,但是我们不选择在这里面写, 待会会说到,到现在这样一个书架类就搞定了。

现在要实现归还,借书等等功能,我们可以把这些所有的功能操作都写在一个类里面,新建一个包operation,然后在这个包内分多个类分别实现对应的功能,那么现在就先来说说增加功能:

这里把增加功能写成了AddOperation,以此类推新建类对应其他功能:

最后再新建一个类写退出系统操作的功能,下图:

查找图书和归还图书功能:

框架写到现在我们不难发现,这些所有的操作都是针对booklist,都是对这个接口的重新实现,规范是一样的,实现方式不一样。

就拿新增图书这个框架来说,我们可以把这个方法直接抽象到接口当中,对于这个标准进行规范,现在定义一个IOPeration接口:

现在就规范好了,具体实现待会会写到,既然我们所有的功能操作都是针对work这个方法,那么回到AddOperation来看,我们是不是就可以让这个类实现 IOPeration 这个接口,如下图所示:

这里只要我们重写接口的方法,那么调用的时候就会实现对应的这个新增功能,其实这里也可以不实现接口,但是如果用了接口的话,后续我们进行向上转型的时候会非常方便。

要注意的退出系统这里,我们可以认为,有这个可能:系统退出的时候需要销毁,或者使用到这个books数组当中的所有的数据,所以暂时退出系统这里的work方法也传参进去:

这样一来,现在是每一个功能都实现了一个接口,每个接口都独立了出来,具体里面的内容如何去实现,暂时我们还未揭晓,好了接下来继续把整体的框架,大纲先给大家梳理好。

功能写好之后,我们再抽象出一个用户类user,跟用户相关的,一开始演示过了,有管理员和普通用户,那么这两个都可以归类为用户。

新建一个包user,然后:

在User父类里面写下管理员和普通用户的共性,也就是相同的成员变量,然后让AdminUser和NormalUser继承即可:

这样的话,我们就可以在User底下罗列更多的属性。

AdminUser 和 NormalUser都可以继承下来这些共性。

这里写protected修饰的成员变量的原因就是上图注释的原因,然后我们就可以写构造方法了,可以看到这里报错了,还有两个用户也报错了:

这里就涉及到知识点:当子类继承父类之后,要先帮父类构造,那现在父类里面有一个带1个参数的构造方法,那么子类这里就要提供构造方法,也是一个参数的,如图:

在new 子类对象的时候,先传给父类构造方法,同理NormalUser那边也是一样这么调用。

那么接下来,我们看过演示,不管是管理员还是普通用户,都有他们对应的菜单,那么代码如下:

package user;public class NormalUser extends User{public NormalUser(String name) {super(name);}public void menu(){System.out.println("hello "+this.name+"欢迎来到图书小练习");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");}
}

上述就是一个普通用户的菜单,管理员的菜单如下:

package user;public class AdminUser extends User{public AdminUser(String name) {super(name);}public void menu(){System.out.println("hello "+this.name+"欢迎来到图书小练习");System.out.println("1.查找图书");System.out.println("2.新增图书");System.out.println("3.删除图书");System.out.println("4.显示图书");System.out.println("0.退出系统");}
}

目前为止我们有了用户,操作功能,书架,现在我们就要把零散的节点给柔和起来了。

来到主函数我们先实现一下逻辑,我们还记得上面演示小程序的第一步是请输入姓名,那么我们肯定就要先登录,所以在主函数前先实现一个登录函数,代码如下:

import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User login(){System.out.println("请输入姓名:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();System.out.println("请输入你的身份: 1->管理员, 0->普通用户");int choice = scanner.nextInt();if(choice == 1){return new AdminUser(name);}else{return new NormalUser(name);}}public static void main(String[] args) {User user = login();//user到底引用哪个对象,需要看user.menu();}
}

调用login函数后,提示用户输入姓名还有选项什么的,然后判断用户输入的是数字1对应的管理员还是0对应的普通用户,然后把函数的返回值设置成User类型,所以登录之后,程序就能根据用户的选择,知道当前是实例化了哪一个对象。

重点就是这里的方法里面到底返回了是谁,这里的user就引用谁,那么这里是一个向上转型,父类引用引用子类对象,根据返回值的不同,打印不同用户所对应的菜单,这里还要给User父类里面加上菜单,不然User引用不到子类这个menu菜单。

package user;public class User {protected String name;//共性写在这//防止在其他包也要继承到,所以用protectpublic User(String name){this.name = name;}public void menu(){}
}

现在程序运行一下就可以看到:

然后现在肯定就发生了动态绑定了,因为刚才父类已经写了menu方法,然后主函数:

不难看到主函数这里的user接收不同的返回值,也就是对应不同用户,此时父类再去调用menu方法肯定会发生动态绑定,编译时调用的是自己的menu,但是运行时显示出来的就是对应子类的menu方法了。

既然父类User的menu也没有具体实现,那么我们可以把这个方法变成抽象方法,对应也就父类变成抽象类,代码如下:

package user;public abstract class User {protected String name;//共性写在这//防止在其他包也要继承到,所以用protectpublic User(String name){this.name = name;}public abstract void menu();
}

那么既然菜单都已经打印出来显示给用户看了,此时用户就要选择功能1234了,所以这里代码如下:

这里就要注意要返回用户输入的数字,因此返回类型改成int,父类的menu方法这里:

这里同样也要改成 int 返回值的方法,同理,AdminUser的菜单也要有一样的返回值和返回类型。

主函数也要有返回值接收:

这里要写一个死循环,因为比如你查找完图书,你还得打印一次菜单让用户选择借书、还书等功能,不然每次只能执行一个功能。

Java 实现图书管理系统相关推荐

  1. Java Web图书管理系统(MVC框架)-包含源码

    Java Web图书管理系统 一.前言 这是大二写的系统,因此这个系统并没有用到很多框架,只是使用了MVC框架,前端使用的是Layui框架.bootstrap框架.JSP技术.JSTL表达式和EL表达 ...

  2. Java Swing图书管理系统桌面软件附源码

    Java Swing图书管理系统桌面软件附源码,亲测可运行. 功能界面如下: 登录界面,默认账号admin密码admin 主功能界面: 添加图书功能界面: 部分源码: 完整源码下载地址: JavaSw ...

  3. Java web 图书管理系统

    本系统由java+sevlet+mysql+eclipse实现的Java web图书管理系统,具有增删改查以及导出Excel表格的功能,需要源码或者需要定制类似的Java /Java web/ ssm ...

  4. Java窗体图书管理系统Java图书借阅管理系统(图书借阅系统)

    Java窗体图书管理系统Java图书借阅管理系统(图书借阅系统)

  5. 大二小学期java:图书管理系统

    大二小学期java:图书管理系统 import java.util.*;import java.text.*;public class library {public static long char ...

  6. 计算机毕设(附源码)JAVA-SSM基于java的图书管理系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  7. java毕业设计图书管理系统源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计图书管理系统源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计图书管理系统源码+lw文档+mybatis+系统+mysql数据库+调试 本源码技术栈: 项目 ...

  8. java毕业设计图书管理系统演示录像源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计图书管理系统演示录像源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计图书管理系统演示录像源码+lw文档+mybatis+系统+mysql数据库+调试 本源 ...

  9. java+Mysql 图书管理系统(idea)

    目录 前言 部分界面截图 登录界面 注册界面 图书管理界面 关于我们界面 部分代码 登录界面 数据库工具类 前言 jdk 版本:openjdk version "11.0.12" ...

  10. java web 图书管理系统_图书管理系统,源代码 Java初级小项目

    今天再给大家分享一个小项目:MiNi图书管理系统.用的是Java语言开发的,代码不多,大概260行左右吧,系统是实现图书的新增图书.删除图书.借阅图书.归还图书.查看图书等简单的功能(后附源代码)! ...

最新文章

  1. 使用Toast进行用户提醒(转)
  2. PL/SQL 使用文档——表注释、显示乱码
  3. 8.2-指令周期(学习笔记)
  4. 并发模型之——共享内存模型(线程与锁)理论篇
  5. php培训出生做微电影网站的,微电影分享网站织梦整站源码
  6. 有了数据湖,距离数据仓库消失还有几年?
  7. mybatis两个内置参数
  8. android gsm编程,Android新手入门 FAQ
  9. mysql源代码多少行_数据库是一个庞大的工程,本来想读读mysql的开源代码,可看到代码行数.doc...
  10. 通过虚拟机安装Ubuntu系统到移动硬盘
  11. emule服务器有响应,eMule刚连上服务器就断请教为什么
  12. 科技复原,3000多前年的木乃伊「发声」了
  13. css 动画 抖动,css3动画之上下抖动
  14. 解决win7 下面 利用docker搭建jitsi-meet测试环境局域网无法访问的问题
  15. The application's PagerAdapter changed the adapter's contents without calling PagerAdapter
  16. ThingsBoard-Windows安装(包括zip方式和源码方式)
  17. 错误:The ‘pycocotools>=2.0‘ distribution was not found and is required by the application
  18. 《Python核心技术第二版》笔记
  19. 计算机EI检索论文,三大检索SCIEEICPCI收录论文.docx
  20. 四次挥手过程以及为什么要等两个时间周期?

热门文章

  1. 关于计算机网络安全实验报告总结,信息安全实验总结报告
  2. 数字证书及CA的详细理解
  3. 重SQL开发和重 Java开发比较
  4. python 串口实例_串口编程(python串口通信实例)
  5. Windows下的 Redis 安装教程
  6. Linux期末考试题库(超全)
  7. bzero 和 memset 函数对比
  8. 压缩包加密破解常见方法总结 CTF中Misc必备
  9. 疫情下的思考:全球疫情带来的危机与机遇
  10. 移动互联应用技术和计算机网络技术,移动互联应用技术团队介绍