目录
1.(背景)java语法知识
这个小项目用到了数组,类和对象,继承,多态,接口,抽象类,封装等知识,是一个综合的小项目。
2.涉及的包和类分类
Booklist类:放书本的书架
Book类:书本,其中定义了书的一些属性,包括书名,作者,价格,类型,是否被借出等。
operation包内放的类都是一些对Booklist类的操作,比如添加书本,删除书本,借阅书本等。
user包内放的是用户,其中管理员用户和普通用户继承了用户,有公共属性名字,年龄等。
Main类是项目的总入口
3.每个类的具体实现细节
1.Books类
package book;
public class Books {
private String name;
private String author;
private double price;
private boolean isBorrowed;
private String type;
public Books(String name, String author, double 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 boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "book.Books{" +
"书名='" + name + '\'' +
", 作者='" + author + '\'' +
", 价格=" + price +
", " + ((isBorrowed)?("已借出"):("未借出")) +
", 书的类型='" + type + '\'' +
'}';
}
}
这个书类包括了基本的书的属性,构造方法,get和set方法,其中为了实现封装,将书的属性设为private,并提供get,set方法供外界调用,其中构造方法不包括是否被借出的构造,因为默认是不被借出,所以不用构造,这里还重写了toString方法,是为了之后打印书本可以直接打印出书本的所有属性。isBorrowed?“已借出”:“未借出”是三元运算符,当isBorrowed为假就是未借出,为真就是已借出。
2.Booklist类
package book;
public class Booklist {
private Books books[] = new Books[10];
private int countBook;//书的数量
public Booklist() {
books[0]=new Books("三国演义","罗贯中",20,"小说");
books[1]=new Books("西游记","吴承恩",50,"小说");
books[2]=new Books("红楼梦","曹雪芹",20,"小说");
this.countBook=3;
}
public Books getBooks(int pos) {
return this.books[pos];
}
public void setBooks(int pos,Books book) {
this.books[pos]=book;
}
public int getCountBook() {
return countBook;
}
public void setCountBook(int countBook) {
this.countBook = countBook;
}
}
此类需要说明的就是已经在书架上放了三本书了,构造方法中已经new了三本书。getBooks是获得指定下标的书,setBooks是为指定下标放一本书。
3.IOperation接口
package operation;
import book.Booklist;
public interface IOperation {
void work(Booklist booklist);
}
这个接口是之后的操作的一个规范,每个操作都可以实现这个接口,重写work方法,在里面实现操作。这也为后面使用的接口数组作了一个铺垫。
4.User类
package user;
import book.Booklist;
import operation.IOperation;
public abstract class User {
protected String name;
public 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);
}
}
user类里面是使用者的公共属性,其中有名字,接口数组,数组里面放的是操作,还有menu菜单,因为无论是管理员还是普通用户都有操作和菜单,其中doOperation是选择具体操作。
5.AdminUser用户
package user;
import operation.*;
import java.util.Scanner;
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
iOperations=new IOperation[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new DisplayOperation()};
}
@Override
public int menu() {
System.out.println("*****************欢迎来到管理员菜单****************");
System.out.println(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);
return scanner.nextInt();
}
}
此类中重写了menu方法,为接口数组和名字进行了构造,子类构造之前需要先对父类进行构造,以至于选择使用什么功能就会调用指定的功能,数字与下标进行了对应。十分的巧妙。
6.NormalUser类
package user;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
iOperations=new IOperation[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation()};
}
@Override
public int menu() {
System.out.println("*****************欢迎来到普通用户菜单****************");
System.out.println(name+"欢迎来到图书管理系统!");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
System.out.println("************************************************");
System.out.println("请选择你要使用的功能");
Scanner scanner=new Scanner(System.in);
return scanner.nextInt();
}
}
7.Main类
import book.Booklist;
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) {
Booklist booklist = new Booklist();
User user = login();
while(true) {
int choice = user.menu();
user.doOperation(choice, booklist);
}
}
}
此类先输入名字,然后选择身份,以选择的身份来实例化相应的对象,经过向上转型进行动态绑定,调用相应的menu方法,并且返回相应的选择操作的数字,用doOperation来实现具体某一身份的对应操作。十分的巧妙。因为当你实例化了某一身份,就会在接口数组里面存放对应身份的操作,然后就可以选择对应操作。
8.AddOperation类
package operation;
import book.Booklist;
import book.Books;
import java.util.Scanner;
public class AddOperation implements IOperation{
@Override
public void work(Booklist booklist) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入新增图书的名字");
String name = scanner.nextLine();
System.out.println("请输入新增图书的作者名字");
String author = scanner.nextLine();
System.out.println("请输入新增图书的类型");
String type = scanner.nextLine();
System.out.println("请输入新增图书的价格");
double price = scanner.nextDouble();
booklist.setBooks(booklist.getCountBook(),new Books(name,author,price,type));
booklist.setCountBook(booklist.getCountBook()+1);
System.out.println("新增成功");
}
}
新增图书的操作
9.BorrowOperation类
package operation;
import book.Booklist;
import java.util.Scanner;
public class BorrowOperation implements IOperation {
@Override
public void work(Booklist booklist) {
System.out.println("请输入你要借阅的图书的名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for (int i = 0; i < booklist.getCountBook(); i++) {
if (name.equals(booklist.getBooks(i).getName())&&(booklist.getBooks(i).isBorrowed()==false)) {
booklist.getBooks(i).setBorrowed(true);
System.out.println("借阅成功");
return;
}
}
System.out.println("没有你要借阅的图书");
}
}
借阅图书的操作
10.DelOperation类
package operation;
import book.Booklist;
import java.util.Scanner;
public class DelOperation implements IOperation{
@Override
public void work(Booklist booklist) {
System.out.println("请输入你要删除的图书的名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for (int i = 0; i <booklist.getCountBook() ; i++) {
if(name.equals(booklist.getBooks(i).getName())){
for (int j = i; j <booklist.getCountBook()-1 ; j++) {
booklist.setBooks(j,booklist.getBooks(j+1));
}
booklist.setCountBook(booklist.getCountBook()-1);
booklist.setBooks(booklist.getCountBook(),null);
System.out.println("删除成功");
return;
}
}
System.out.println("找不到这本书");
}
}
删除书本的操作,不要忘记覆盖后把最后一个元素置为null,防止内存泄漏
11.DisplayOperation类
package operation;
import book.Booklist;
public class DisplayOperation implements IOperation{
@Override
public void work(Booklist booklist) {
for (int i = 0; i < booklist.getCountBook() ; i++) {
System.out.println(booklist.getBooks(i));
}
}
}
显示图书的操作
12.ExitOperation
package operation;
import book.Booklist;
public class ExitOperation implements IOperation{
@Override
public void work(Booklist booklist) {
for (int i = 0; i <booklist.getCountBook() ; i++) {
booklist.setBooks(i,null);
}
System.exit(0);//0表示正常退出
}
}
退出的操作,退出之前要先将所有的书本置为null,防止内存泄漏
13.FindOperation类
package operation;
import book.Booklist;
import java.util.Scanner;
public class FindOperation implements IOperation{
@Override
public void work(Booklist booklist) {
System.out.println("请输入你想要查找的书的名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for (int i = 0; i <booklist.getCountBook() ; i++) {
if(name.equals(booklist.getBooks(i).getName())){
System.out.println("找到了这本书");
System.out.println(booklist.getBooks(i));
return;
}
}
System.out.println("找不到这本书");
}
}
查找书本的操作
14.ReturnOperation类
package operation;
import book.Booklist;
import java.util.Scanner;
public class ReturnOperation implements IOperation{
@Override
public void work(Booklist booklist) {
System.out.println("请输入你要归还的图书的名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for (int i = 0; i < booklist.getCountBook(); i++) {
if (name.equals(booklist.getBooks(i).getName())&&booklist.getBooks(i).isBorrowed()) {
booklist.getBooks(i).setBorrowed(false);
System.out.println("归还成功");
return;
}
}
System.out.println("没有你要归还的图书");
}
}
归还书本的操作