(OOP)图书管理系统(1.0)
技术要求:使用封装、继承、多态、接口、异常判断等内容,一个具有增删改查的图书管理系统,系统使用者分为普通用户和管理员
- 个人思路:
- 图书方面,因为要定义接口,所以将图书分为一个包,里面有接口类(Books),封装类(Book)、图书列表类(BookList)
- 有两个菜单、普通用户(OrdinaryMenu)、管理员用户(RootMenu),也生成一个包
- 使用者,普通用户(Ordinary)、管理员用户(Root),这里本来向用一个父类Person继承,然后使用多态,但是只有两个人,而且父类Person感觉什么东西可写,所以暂时就没有使用继承、多态
- 最后是一个测试类
- 展示代码
- 有打包好的,感兴趣的小伙伴可以下载参考 下载地址 提取码:9tfh
book包
//Book封装类
package bookSystem.book;
public class Book {
// 图书馆
private String name; //书名
private String author;//作者
private String type;//风格
private double price;//价格
private boolean isBorrowed;//是否借阅
// 定义图书数组
Book [] booksArr = new Book[100];
// 重写toString方法
@Override
public String toString() {
return "Book{" +
"name='" + name + ''' +
", author='" + author + ''' +
", type='" + type + ''' +
", price=" + price +
", isBorrowed=" + isBorrowed +
'}';
}
//无参构造
public Book() {}
//构造函数
public Book(String name, String author, String type, double price, boolean isBorrowed) {
this.name = name;
this.author = author;
this.type = type;
this.price = price;
this.isBorrowed = isBorrowed;
}
// get/set 方法
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 String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
}
//Books接口类
package bookSystem.book;
public interface Books {
// 书架的规范,各种图书功能,借书、还书、找书、增书、删出、显示书(实现接口)
void lookForBook(); //查书
void borrowBook(); //借书
void returnBook(); //还书
void addBook(); //增书
void deleteBook(); //删书
void showBook(); //显示书
}
//BookList图书类
package bookSystem.book;
import java.util.InputMismatchException;
import java.util.Scanner;
public class BookList extends Book implements Books {
// 书架继承图书的基本信息,重写接口方法
Scanner scanner = new Scanner(System.in);
private boolean flag = true;
{
// 初始化四本书
Book b1 = new Book("西游记", "吴承恩", "小说", 12, false);
Book b2 = new Book("水浒传", "施耐庵", "小说", 12, false);
Book b3 = new Book("红楼梦", "曹雪芹", "小说", 12, false);
Book b4 = new Book("三国演义", "罗贯中", "小说", 12, false);
booksArr[0] = b1;
booksArr[1] = b2;
booksArr[2] = b3;
booksArr[3] = b4;
}
public BookList() {
}
public BookList(String name, String author, String type, double price, boolean isBorrowed) {
super(name, author, type, price, isBorrowed);
}
@Override
public void lookForBook() {//找书
System.out.println("请输入你要查找的书名:");
String name = scanner.next();
for (int i = 0; i < booksArr.length; i++) {
if (name.equals(booksArr[i].getName())) {
System.out.println("你要找的书如下:");
System.out.println(booksArr[i]);
flag = false;
break;
}
}
if (flag) {
System.out.println("查无此书!");
}
}
@Override
public void borrowBook() {//借书
System.out.println("请输入你要借的书名:");
String name = scanner.next();
for (int i = 0; i < booksArr.length; i++) {
if (name.equals(booksArr[i].getName())) {
System.out.println("借书成功!");
booksArr[i].setBorrowed(true);
flag = false;
break; //循环的作用
}
}
if (flag) {
System.out.println("查无此书!");
}
}
@Override
public void returnBook() { //还书
System.out.println("请输入你要还的书名:");
String name = scanner.next();
for (int i = 0; i < booksArr.length; i++) {
if (name.equals(booksArr[i].getName())) {
System.out.println("还书成功!");
booksArr[i].setBorrowed(false);
flag = false;
break; //循环的作用
}
}
if (flag) {
System.out.println("查无此书!");
}
}
@Override
public void addBook() { //增加书
System.out.println("请输入你要新增的图书的书名:");
String name = scanner.next();
System.out.println("请输入你要新增的图书的作者:");
String author = scanner.next();
System.out.println("请输入你要新增的图书的类型:");
String type = scanner.next();
System.out.println("请输入你要新增的图书的价格:");
int price = 0;
try {
int p = scanner.nextInt();
price = p;
} catch (InputMismatchException e) {
System.out.println("添加图书失败,请按要求输入价格为:数字!");
return;
}
// int price = scanner.nextInt();
for (int i = 0; i < booksArr.length; i++) {
if (booksArr[i] == null) {
Book b = new Book(name, author, type, price, false);
booksArr[i] = b;
System.out.println("新增图书成功!");
break;
// booksArr[i].setName(name);
// booksArr[i].setAuthor(author);
// booksArr[i].setType(type);
// booksArr[i].setPrice(price);
// booksArr[i].setBorrowed(false);
}
}
}
@Override
public void deleteBook() {//删除书
System.out.println("请输入你要删除的书名:");
String name = scanner.next();
for (int i = 0; i < booksArr.length; i++) {
if (name.equals(booksArr[i].getName())) {
// booksArr[i].setName(null);
// booksArr[i].setAuthor(null);
// booksArr[i].setType(null);
// booksArr[i].setPrice(0.0);
booksArr[i] = null;
break; //循环的作用
}
}
}
@Override
public void showBook() {
for (int i = 0; i < booksArr.length; i++) {
if (booksArr[i] != null) {
System.out.println(booksArr[i]);
}
}
}
}
menu菜单包
//普通用户菜单 OrdinaryMenu
package bookSystem.menu;
import bookSystem.book.BookList;
import java.util.Scanner;
public class OrdinaryMenu {
// 普通用户菜单
public void menu() {
Scanner scanner = new Scanner(System.in);
BookList bookList = new BookList();
boolean flag = true;
do {
System.out.println("=======普通用户菜单=======");
System.out.println("=======0.退出系统========");
System.out.println("=======1.查找图书========");
System.out.println("=======2.借阅图书========");
System.out.println("=======3.归还图书========");
System.out.println("请选择你的业务:");
int n= scanner.nextInt();
switch (n) {
case 0:
System.out.println("欢迎再次光临");
flag = false;
break;
case 1:
bookList.lookForBook();
break;
case 2:
bookList.borrowBook();
break;
case 3:
bookList.returnBook();
break;
default:
System.out.println("请输入正确指令!");
break;
}
}while(flag);
}
}
//管理员用户菜单 RootMenu
package bookSystem.menu;
import bookSystem.book.BookList;
import java.util.Scanner;
public class RootMenu {
// 管理员菜单
public void menu() {
Scanner scanner = new Scanner(System.in);
BookList bookList = new BookList();
boolean flag = true;
do {
System.out.println("========管理员菜单=======");
System.out.println("=======0.退出系统========");
System.out.println("=======1.查找图书========");
System.out.println("=======2.新增图书========");
System.out.println("=======3.删除图书========");
System.out.println("=======4.显示图书========");
System.out.println("请选择你的业务:");
int n= scanner.nextInt();
switch (n) {
case 0:
System.out.println("欢迎再次光临");
flag = false;
break;
case 1:
bookList.lookForBook();
break;
case 2:
bookList.addBook();
break;
case 3:
bookList.deleteBook();
break;
case 4:
bookList.showBook();
break;
default:
System.out.println("请输入正确指令!");
break;
}
}while(flag);
}
}
用户包
//普通用户
package bookSystem.person;
import bookSystem.menu.OrdinaryMenu;
public class Ordinary {
public void showInfo() {
OrdinaryMenu ordinaryMenu = new OrdinaryMenu();
ordinaryMenu.menu();
}
}
//管理员
package bookSystem.person;
import bookSystem.menu.RootMenu;
public class Root {
public void showInfo() {
RootMenu rootMenu = new RootMenu();
rootMenu.menu();
}
}
测试类
package bookSystem;
import bookSystem.person.Ordinary;
import bookSystem.person.Root;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Text {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name = scanner.next();
System.out.println("请选择你的身份:0-->管理员,1-->普通用户");
// 进行一个异常判断!
try {
int b = scanner.nextInt();
if (b == 0) {
System.out.println("\t\t管理员菜单");
System.out.println("hello " + name + "欢迎来到图书馆!");
Root p = new Root();
p.showInfo();
}
if (b == 1) {
System.out.println("\t\t普通员工菜单");
System.out.println("hello " + name + "欢迎来到图书馆!");
Ordinary p = new Ordinary();
p.showInfo();
}
} catch (InputMismatchException e) {
System.out.println("输入异常,请按要求输入数字!");
}
}
}
运行截图
总结
- 第一天,刚上完接口,开始写(OOP)图书管理系统,脑壳子都懵懵的,不知道如何下手,不太清楚接口到底是怎么使用,睡一觉起来,发现,哦豁,接口好像有那个意思了,规范继承的非抽象类的行为,是一个标准,什么东西需要标准呢! 大众使用的东西,普遍的东西都需要一个标准,接口类(interface)就是很好的东西,它规定凡是使用了接口类的子类,都需要重写接口类的方法,这可以弥补类继承的不足,一个类可以继承一个类,还可以使用多个接口,这个在book包里面有体现
- 遇到的问题:第一天下午写的时候主要是没有啥思路,感觉遇到个接口就无从下手,后面发现理解之后,接口还是很好的工具!问题在图书列表里面的删除图书功能
for (int i = 0; i < booksArr.length; i++) {
if (booksArr[i] == null) {
Book b = new Book(name, author, type, price, false);
booksArr[i] = b;
System.out.println("新增图书成功!");
break;
// booksArr[i].setName(name);
// booksArr[i].setAuthor(author);
// booksArr[i].setType(type);
// booksArr[i].setPrice(price);
// booksArr[i].setBorrowed(false);
}
}
错误思路:用户输入书名、作者等信息,然后判断书本数组,后面只要为null的数组,就直接将用户输入的信息赋值过去,错误原因是,我用数组里面空的地址去赋值用户输入的信息,理所当然的报错(NULLPointException)空指针异常,后来发现,自己定义一个新的图书,然后将用户输入的信息放进去,在用开辟新的图书空间去指向为null的图书数组,问题就解决了!
- 代码量还是太少了,遇到的题型和问题也太少了,继续加油!