目录
BorrowFunction(借阅图书) 和 ReturnFunction(归还图书)
前言
图书管理系统结合 java 类和对象、面向对象的三大特性,封装、继承、多态,以及抽象类和接口来写的,文章有错误的地方麻烦大佬指出。
程序主体思想
基本框架的实现
包:book
Book(书籍的内容)
public class Book {
private String name;//姓名
private String author;//作者
private int price;//价格
private String type;//类型
boolean flag;//是否被借出
//重写 toString 使 println 将当前对象下成员变量打印出来
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price='" + price + '\'' +
", type='" + type + '\'' +
(flag == false? "未借出":"已借出")+//三目操作符,如 果flag 是 false 返回未借出,不是 false 就返回已借出
'}';
}
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}//注意构造方法不需要初始化 flag,因为布偶类型的值默认初始化就是false
//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 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 isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
BookShelf(书架,存放多本书籍)
public class BookShelf {
private final int num = 10;//书架课存放书本的数量
public int bookSize = 0;//记录当前书架有几本书
private Book[] books = new Book[num];//创建Book 类型数组来存放 book
public BookShelf(){//创建构造方法来初始化我们的书架,在书架中放三本书
this.books[0] = new Book("红楼梦","曹雪芹",88,"小说");
this.books[1] = new Book("西游记","吴承恩",78,"小说");
this.books[2] = new Book("三国演义","罗贯中",65,"小说");
this.bookSize = 3;//放置完三本书后将 bookSize 修改为3来记录当前书本数量
}
public int getBookSize() {
return bookSize;
}
public void setBookSize(int bookSize) {
this.bookSize = bookSize;
}
}
Main
public class Main {
public static User menu(){
System.out.println("欢迎来到图书管理系统,请输入你的姓名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("请选择你的身份:1.管理员 2.普通用户");
int userChoice = scanner.nextInt();
if(userChoice == 1) {
return new AdministratorUser(name);//这里发生向上转型
}else{
return new OrdinaryUsers(name);
}
}
public static void main(String[] args) {
User user = menu();//向上转型后,这个user 根据 menu() 方法的返回值来指向哪个对象(管理员/普通用户)
BookShelf bookShelf = new BookShelf();//将书架实例化
while(true){
int functionChoice = user.menu();//接下里调用当前对象的菜单,创建一个变量来接收返回值来确定实现当前对象的哪个功能。
user.doWork(functionChoice,bookShelf);//根据上方 menu() 的返回值,传给 doWork() 来确定实现的功能是哪一个
}
}
}
首先,程序思路的开端应该写一个菜单 menu() 出来,记录你的名字,并且选择你的身份是用户还是管理员(userChoice接收).
关键点 向上转型,在选择身份后,创建 if 判断来新建 管理员/普通用户 对象,然后返回他,注意了,menu() 方法的返回值是 User父类,if 语句中返回的值是子类对象,此时发生向上转型,我们在 main 方法内部创建 user 对象来接收他,此时 user 接收返回值来指向俩个子类中任意一个对象(管理员/普通用户)。
当我们选择的普通用户时,user 指向OrdinaryUsers
接下来实例化书架,在后续存放书籍中用到 ,然后写一个循环去重复使用我们需要实现的功能。
看循环内部代码需要去看 user 内部的代码,接着往下走。
包:user
父类:User
public abstract class User {
String name;
public User(String name) {//父类构造方法初始化姓名
this.name = name;
}
public abstract int menu();
protected Function[] function;//创建接口数组,里面存放对图书操作的功能
public void doWork(int functionChoice , BookShelf bookShelf) {
this.function[functionChoice ].work(bookShelf);//choice 选择当前对象下接口数组哪个下标的功能
}
}
首先父类创建姓名,然后构造方法初始化姓名,然后创建菜单,父类不需要实现菜单功能,用 abstract 修饰它为抽象方法,在子类中重写。
创建接口数组和 doWork() 方法到下面那里介绍,继续往下走
子类:AdministratorUser(管理员)
public class AdministratorUser extends User{
public AdministratorUser(String name) {
super(name);
this.function = new Function[] {//初始化接口数组,在里面存放相应的功能
new ExitFunction(),//退出功能放在0下标位置
new FindFunction(),
new AddFunction(),
new DeleteFunction(),
new ShowFunction()
};
}
@Override
public int menu() {
System.out.println("************************");
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("************************");
System.out.println("请输入你的操作");
Scanner scanner = new Scanner(System.in);
int functionChoice= scanner.nextInt();
return functionChoice;
}
}
首先子类需要创建子类构造方法去帮助我们的父类构造方法去初始化父类构造方法需要初始化的成员变量,父类构造方法内初始化了 name ,我们的子类构造方法应该去帮助他去初始化name。
然后因为父类中我们创建了一个接口数组,接口数组内 存放的是七个不同的功能,管理员对应5个功能,当我们选择管理员时,我们需要初始化他,将他内部存放好我们管理员可以实现的5个功能
然后就是重写我们的 menu() 方法 ,先将菜单打印出来,创建一个整型变量 functionChoice 来接收你的选择并返回他。
接下来就可以来看我们上方 Main 中所讲的while 循环
functionChoice 已经接收你选择的功能,此时我们传给 doWork() 这个方法,当我们将 functionChoice 传给他时,这个方法可以使用functionChoice 来去调用你需要实现的功能,例如你选择的 1.新增图书,functionChoice 此时为1,doWork 接收到 functionChoice 后会去调用增加图书这个功能。