Java SE - 图书管理系统模拟实现

目录

1.设计框架

图书管理系统的对象有普通用户和管理员,可以通过登录系统进行选择,对于普通用户可以操作的对象是书架上的图书,可以查询,展示,借阅,归还,退出等操作,而管理员操作对象也是书架上的图书,可以对图书进行查找,展示,增加,删除,退出图书系统的操作,以上就是简单设计框架。

2. 实现用户类

管理员和普通用户都是Person,可以将共性部分进行归纳,然后继承给子类普通用户和管理员,将这几个类存放于Demo1的包中。

1.Person类:成员属性包括名字和年龄,并实现构造方法。

java 复制代码
package Demo1;

public abstract class Person {
    //成员属性
    public String name;//名字
    public int age;

    //构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

2.实现AdminUser类继承于Person类,完成构造方法。

java 复制代码
package Demo1;

public class AdminUser extends Person{
    //构造方法
    public AdminUser(String name, int age) {
        super(name, age);
    }
}

3.实现NormalUser类继承于Person类,完成构造方法。

java 复制代码
package Demo1;

public class NormalUser extends Person{

    //构造方法
    public NormalUser(String name, int age) {
        super(name, age);
    }
}

3.实现书和书架类

将这两个类存放于Demo2的包中,并实现类的定义。

1.实现一个书籍类,成员变量有书名,作者,类型,价格,书籍的情况(是否借出),这一些成员变量除了书籍的情况,其它都用private修饰,完成封装,使用set或get方法完成初始化或获取,重写toString方法,可根据需求修改。

java 复制代码
package Demo2;

public class Book {
    //成员变量
    private String name;//书名
    private String auther;//作者
    private String type;//类型
    private double cost;//价格
    public boolean borrowed;//是否借出

    //四个参数的构造方法
    public Book(String name, String auther, String type, double cost) {
        this.name = name;
        this.auther = auther;
        this.type = type;
        this.cost = cost;
    }
    
    //set方法
    public void setName(String name) {this.name = name;}//设置书名

    public void setAuther(String auther) {this.auther = auther;}//编辑作者名

    public void setType(String type) {this.type = type;}//设置类型

    public void setCost(double cost) {this.cost = cost;}//价格
    
    //get方法

    public String getName() {return name;}//获取书名

    public String getAuther() {return auther;}//获取作者名字

    public String getType() {return type;}//获取书籍类型

    public double getCost() {return cost;}//获取书籍价格

    //重写toString方法:系统默认生成后根据需要修改,以下修改了borrowed的表达
    //使用三目操作符,表达式结果是:"已借出"和"未借出"两种结果
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", auther='" + auther + '\'' +
                ", type='" + type + '\'' +
                ", cost=" + cost +
                ", borrowed=" + ((this.borrowed == true) ? "已借出" : "未借出")  +
                '}';
    }
}

2.实现一个书架可以存放书籍,书架的容量为10,定义一个变量记录当前存放的书籍数目,存放一些书籍,例如四大名著,完成set和get方法。

java 复制代码
package Demo2;
//书架
public class Booklist {
    //实例化Book类型的数组
    Book[] book = new Book[10];//书架容量,10

    //创建一个记录当前书籍数的变量
    private int count;
    //在构造方法中先存放一些书籍,例如四大名著
    public Booklist(){
        book[0] = new Book("西游记","吴承恩","长篇小说",832.50);
        book[1] = new Book("红楼梦","曹雪芹","长篇小说",51.90);
        book[2] = new Book("三国演义","罗贯中","长篇小说",43.80);
        book[3] = new Book("水浒传","施耐庵","长篇小说",496.00);
        this.count = 4;
    }
    //set方法
     //将新的引用赋给当前下标的引用
    public void setBook(int pos,Book book) {
        this.book[pos] = book;
    }
    //设置count的值
    public void setCount(int count) {
        this.count = count;
    };
    //将后面的引用赋给前面的引用,在删除功能中使用
    public void setBook(Book[] book,int pos) {
        this.book[pos] = book[pos+1];
    }

    //get方法
//得到当前书籍的引用
    public Book[] getBook() {
        return book;
    }
//获取当前书架上的书籍数
    public int getCount() {
        return count;
    }
}

4.登录界面的实现

实现一个login方法实现用户的选择功能,返回类型为Person。

java 复制代码
import Demo1.AdminUser;
import Demo1.NormalUser;
import Demo1.Person;
import Demo2.Booklist;

import java.util.Scanner;

public class Main{

    public static Person login(){
        //选择身份
        System.out.println("请选择你的身份:> 1.管理员  2.普通用户");
        System.out.print("请输入:> ");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        
        //返回类型
        if(choice == 1) return new AdminUser("zansang",22);
        else return new NormalUser("lisi",33);
        
    }
    public static void main(String[] args) {
        //1.加载用户选择,通过返回值确定用户类型
        Person person =  login();//接收返回值
    }
}

5.实现menu方法

在Person类中定义一个抽象的menu方法,在子类AdminUser和NormalUser中重写。

java 复制代码
package Demo1;

public abstract class Person {
    //成员属性
    public String name;//名字
    public int age;

    //构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //菜单menu
    public abstract void menu();
}
java 复制代码
//管理员选择的菜单
    @Override
    public int  menu(){
        //打印菜单
        System.out.println(this.name + "欢迎你来到图书管理系统!");
        System.out.println("****************************");
        System.out.println("*****     0.Exit       *****");
        System.out.println("*****     1.AddBook    *****");
        System.out.println("*****     2.DelBook    *****");
        System.out.println("*****     3.Search     *****");
        System.out.println("*****     4.ShowBook   *****");
        System.out.println("****************************");
        //选择功能
        Scanner scanner = new Scanner(System.in);
        System.out.print("请选择:>");
        int choice = scanner.nextInt();
        //返回选择选项
        return choice;
}
java 复制代码
//普通用户选择的菜单
@Override
    public int  menu(){
        //打印菜单
        System.out.println(this.name + "欢迎你来到图书管理系统!");
        System.out.println("****************************");
        System.out.println("*****     0.Exit       *****");
        System.out.println("*****     1.Borrow    *****");
        System.out.println("*****     2.Return    *****");
        System.out.println("*****     3.Search     *****");
        System.out.println("*****     4.ShowBook   *****");
        System.out.println("****************************");
        //选择功能
        Scanner scanner = new Scanner(System.in);
        System.out.print("请选择:>");
        int choice = scanner.nextInt();
        //返回选择选项
        return choice;
    }

6.测试菜单选择

java 复制代码
import Demo1.AdminUser;
import Demo1.NormalUser;
import Demo1.Person;
import Demo2.Booklist;
import java.util.Scanner;

public class Main{
    public static Person login(){
        //选择身份
        System.out.println("请选择你的身份:> 1.管理员  2.普通用户");
        System.out.print("请输入:> ");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();

        //返回类型
        if(choice == 1) return new AdminUser("zansang",22);
        else return new NormalUser("lisi",33);

    }
    public static void main(String[] args) {
        //1. //加载书架:有书架和书籍才可以操作,先实例一个书架
        Booklist booklist = new Booklist();

        while(true) {
            //2.加载用户选择,通过返回值确定用户类型
            Person person =  login();//接收返回值
            //3.实现选择功能,不同用户有不同的选择,根据login返回类型确定
            int choice = person.menu();
            if(choice == 0) break;
        }
    }
}

通过测试程序当前可以根据选择的身份调用不同的菜单,下一步可以具体实现功能的使用。

7.实现一个IFun接口

创建一个新的Demo3包实现一个IFuntion接口,接口中定义一个抽象的work方法。

java 复制代码
package Demo3;

public interface IFuntion {
    //抽象方法:功能
    public abstract void work(Booklist booklist);
}

7.1 查找功能的实现

查找功能可以遍历数组,通过书名匹配,使用IFuntion接口,重写抽象方法。

java 复制代码
package Demo3;
import Demo2.Booklist;
import java.util.Scanner;

public class Search implements IFuntion{
    @Override
    public void work(Booklist booklist) {
    //输入查找的书名
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入书名:>");
        String bookName = scanner.nextLine();
        //遍历数组
        int sz = booklist.getCount();
        int i = 0;
        for (; i < sz; i++) {
            if(booklist.getBook(i).getName().equals(bookName)){
                break;//找到了
            }
        }
        //找不到
        if(i == sz) System.out.println(bookName + "此书不存在!");
        //找到了,输出展示
        else{
        System.out.print("找到了,书籍信息: ");
        System.out.println(booklist.getBook(i));
        }
    }
}

7.2 展示功能的实现

展示的功能是通过数组遍历将书籍信息输出打印,使用IFuntion这个接口,重写work方法。

java 复制代码
package Demo3;
import Demo2.Booklist;

public class ShowBook implements IFuntion{
    @Override
    public void work(Booklist booklist) {

        System.out.println("************************************");
        int sz = booklist.getCount();//获取当前书籍数
        //遍历数组输出
        for (int i = 0; i < sz; i++) {
            System.out.println(booklist.getBook(i));
        }
        System.out.println("************************************");
    }
}

7.3 增加功能的实现

增加可能使用IFuntion这个接口,重写work方法,需要先判断容量是否已满,如果已满就不能增加,如果未满就可以添加在count下标的位置,添加后调用setCount方法使count++。

java 复制代码
package Demo3;
import Demo2.Book;
import Demo2.Booklist;
import java.util.Scanner;

public class AddBook implements IFuntion{
    @Override
    public void work(Booklist booklist) {
        //获取当前容量
        int sz = booklist.getCount();
        //获取总的容量
        int capacity = booklist.getBook().length;
        //判断
        if(sz == capacity){//说明已满,不可添加
            System.out.println("书架存放位置已满,不可添加!");
            return;
        }
        //未满,可以添加
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入书名:>");
        String bookName = scanner.nextLine();
        System.out.print("请输入作者名称: >");
        String auther = scanner.nextLine();
        System.out.print("请输入书籍类型: >");
        String type  = scanner.nextLine();
        System.out.print("请输入书籍价格: >");
        double cost = scanner.nextDouble();

        //将输入好的数据存放于一个临时的引用中
        Book tem = new Book(bookName,auther,type,cost);
        //通过set方法方法
        booklist.setBook(sz,tem);
        //将count+1
        booklist.setCount(sz + 1);//sz表示当前的count
        //提示一下
        System.out.println("增加成功!");
    }
}

7.4 删除功能的实现

删除功能使用IFuntion这个接口,重写work方法,先遍历数组查寻是否存在需要删除的书籍,如果存在在找到的下标位置从后往前替换,最后一个引用设置为null。

java 复制代码
package Demo3;
import Demo2.Booklist;
import java.util.Scanner;

public class DelBook implements IFuntion{
    
    @Override
    public void work(Booklist booklist) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入删除的书籍名称:>");
        String bookName = scanner.nextLine();
        //遍历数组
        int sz = booklist.getCount();
        int i = 0 ;
        for (; i < sz; i++) {
            if(booklist.getBook(i).getName().equals(bookName)){
                break;//找到了
            }
        } 
        //找不到
        if(sz == i) System.out.println("输入的书籍名称不存在!");
        //找到了
        else{ 
        for (; i < sz - 1; i++) {
            //使用set方法:将i+1下标的引用赋值给下标为i的引用
            booklist.setBook(booklist.getBook(),i);
        }
        //将数组count - 1
        booklist.setCount(sz - 1);
        //提示一下
        System.out.println("输入的书籍已经删除!");
        }
    }
}

7.5 退出功能的实现

退出功能使用IFuntion这个接口,重写抽象方法work,使用System类的Exit方法。

java 复制代码
package Demo3;

import Demo2.Booklist;

public class Exit implements IFuntion{
    @Override
    public void work(Booklist booklist) {
        //提示一下
        System.out.println("程序正在退出中......");
        System.exit(0);//参数一般默认为0
    }
}

7.6 借阅功能的实现

借阅可能使用IFuntion这个接口,重写抽象方法work,遍历数组抽象对应的书籍是否存在,如果存在查询是否借阅,如果未借出,可以借阅后修改状态。

java 复制代码
package Demo3;

import Demo2.Booklist;

import java.util.Scanner;

public class Borrow implements IFuntion{
    @Override
    public void work(Booklist booklist) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入需要借阅的书籍名称:>");
        String bookName = scanner.nextLine();
        //遍历数组
        int sz = booklist.getCount();
        int i = 0 ;
        for (; i < sz; i++) {
            if(booklist.getBook(i).equals(bookName)){
                break;//找到了
            }
        }
         if(sz == i) System.out.println("需要借阅的书籍不存在!");
        //已经借阅
        else {
            if (booklist.getBook(i).borrowed == true) {
                System.out.println("此书籍已经借阅!");
            } else {
                System.out.println("此书籍可以借阅!");
            }
            booklist.getBook(i).borrowed = true;
            System.out.println("已登记,可以借出!");
        }
    }
}

7.7 归还功能的实现

归还功能使用IFtunion这个接口,重写work方法,首先遍历数组匹配归还的书籍名称,如果匹配上,将书籍状态设置未借出后提示归还成功,如果未匹配上,就提示归还的书籍不存在。

java 复制代码
package Demo3;

import Demo2.Booklist;

import java.util.Scanner;

public class Return implements IFuntion{
    @Override
    public void work(Booklist booklist) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入需要归还的书籍名称:>");
        String bookName = scanner.nextLine();
        //遍历数组
        int sz = booklist.getCount();
        int i = 0;
        for (; i < sz; i++) {
            if (booklist.getBook(i).getName().equals(bookName)) {
                break;//找到了
            }
        }
        //找不到
        if(sz == i) System.out.println("输入的归还书籍不存在");
        //找到了,将书籍状态设置为未借出后提示归还
        else{
        booklist.getBook(i).borrowed = false;
        System.out.println("书籍归还成功!");
        }
    }
}

8.实现IFuntion类型的数组

在Person类中定义一个IFuntion类型的数组引用,具体实现方式子类完成。

java 复制代码
//使用接口数组
    public IFuntion[] iFuntions;

AdminUser类中,数组的内容与管理员菜单匹配,在构造方法中完成赋值。

java 复制代码
   //构造方法
    public AdminUser(String name, int age) {
        super(name, age);
        this.iFuntions = new IFuntion[]{
                new Exit(),
                new AddBook(),
                new DelBook(),
                new Search(),
                new ShowBook()
        };
    }

NormalUser类中,数组的内容与普通用户菜单匹配,在构造方法中完成赋值。

java 复制代码
  //构造方法
    public NormalUser(String name, int age) {
        super(name, age);
        this.iFuntions = new IFuntion[]{
                new Exit(),
                new Borrow(),
                new Return(),
                new Search(),
                new ShowBook()
        };
    }

9. 在main方法中使用IFuntion类型的数组

java 复制代码
public static void main(String[] args) {
        //1. //加载书架:有书架和书籍才可以操作,先实例一个书架
        Booklist booklist = new Booklist();
        //2.加载用户选择,通过返回值确定用户类型
        Person person =  login();//接收返回值
        while(true) {
            //3.实现选择功能,不同用户有不同的选择,根据login返回类型确定
            int choice = person.menu();
            if(choice < 0 || choice >= booklist.getBook().length){
                System.out.println("非法输入,请重新输入!!!");
            }else {
                //通过person引用使用iFuntions这个引用数组下标为choice的类
                //调用其中的work方法
                person.iFuntions[choice].work(booklist);
            }
        }

10.测试当前的功能是否能实现

1.测试管理员功能,展示,搜索,增加,删除,退出。





2.测试普通用户的功能:展示,搜索,借阅,归还,退出。




11.程序代码

11.1 Demo1包

java 复制代码
package Demo1;
import Demo2.Booklist;
import Demo3.IFuntion;

public abstract class Person {
    //成员属性
    public String name;//名字
    public int age;

    //构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //菜单menu
    public abstract int menu();
    //使用接口数组
    public IFuntion[] iFuntions;
}
java 复制代码
package Demo1;

import Demo2.Booklist;
import Demo3.*;

import java.util.Scanner;

public class AdminUser extends Person{
    //构造方法
    public AdminUser(String name, int age) {
        super(name, age);
        this.iFuntions = new IFuntion[]{
                new Exit(),
                new AddBook(),
                new DelBook(),
                new Search(),
                new ShowBook()
        };
    }


    @Override
    public int  menu(){
        //打印菜单
        System.out.println(this.name + "欢迎你来到图书管理系统!");
        System.out.println("****************************");
        System.out.println("*****     0.Exit       *****");
        System.out.println("*****     1.AddBook    *****");
        System.out.println("*****     2.DelBook    *****");
        System.out.println("*****     3.Search     *****");
        System.out.println("*****     4.ShowBook   *****");
        System.out.println("****************************");
        //选择功能
        Scanner scanner = new Scanner(System.in);
        System.out.print("请选择:>");
        int choice = scanner.nextInt();
        //返回选择选项
        return choice;
   }
}
java 复制代码
package Demo1;

import Demo3.*;

import java.util.Scanner;

public class NormalUser extends Person{

    //构造方法
    public NormalUser(String name, int age) {
        super(name, age);
        this.iFuntions = new IFuntion[]{
                new Exit(),
                new Borrow(),
                new Return(),
                new Search(),
                new ShowBook()
        };
    }

    @Override
    public int  menu(){
        //打印菜单
        System.out.println(this.name + "欢迎你来到图书管理系统!");
        System.out.println("****************************");
        System.out.println("*****     0.Exit       *****");
        System.out.println("*****     1.Borrow    *****");
        System.out.println("*****     2.Return    *****");
        System.out.println("*****     3.Search     *****");
        System.out.println("*****     4.ShowBook   *****");
        System.out.println("****************************");
        //选择功能
        Scanner scanner = new Scanner(System.in);
        System.out.print("请选择:>");
        int choice = scanner.nextInt();
        //返回选择选项
        return choice;
    }
}

11.2 Demo2包

java 复制代码
package Demo2;

public class Book {
    //成员变量
    private String name;//书名
    private String auther;//作者
    private String type;//类型
    private double cost;//价格
    public boolean borrowed;//是否借出

    //四个参数的构造方法
    public Book(String name, String auther, String type, double cost) {
        this.name = name;
        this.auther = auther;
        this.type = type;
        this.cost = cost;
    }

    //set方法
    public void setName(String name) {this.name = name;}//设置书名

    public void setAuther(String auther) {this.auther = auther;}//编辑作者名

    public void setType(String type) {this.type = type;}//设置类型

    public void setCost(int cost) {this.cost = cost;}//价格

    //get方法

    public String getName() {return name;}

    public String getAuther() {return auther;}

    public String getType() {return type;}

    public double getCost() {return cost;}

    //重写toString方法:系统默认生成后根据需要修改,以下修改了borrowed的表达
    //使用三目操作符,表达式结果是:"已借出"和"未借出"两种结果
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", auther='" + auther + '\'' +
                ", type='" + type + '\'' +
                ", cost=" + cost +
                ", borrowed=" + ((this.borrowed == true) ? "已借出" : "未借出")  +
                '}';
    }
}
java 复制代码
package Demo2;

public class Booklist {
    //实例化Book类型的数组
    Book[] book = new Book[10];//书架容量,10

    //创建一个记录当前书籍数的变量
    private int count;
    //在构造方法中先存放一些书籍,例如四大名著
    public Booklist(){
        book[0] = new Book("西游记","吴承恩","长篇小说",832.50);
        book[1] = new Book("红楼梦","曹雪芹","长篇小说",51.90);
        book[2] = new Book("三国演义","罗贯中","长篇小说",43.80);
        book[3] = new Book("水浒传","施耐庵","长篇小说",496.00);
        this.count = 4;
    }
    //set方法
    //将新的引用赋给当前下标的引用
    public void setBook(int pos,Book book) {
        this.book[pos] = book;
    }
    public void setCount(int count) {
        this.count = count;
    };
    //将后面的引用赋给前面的引用,在删除功能中使用
    public void setBook(Book[] book,int pos) {
        this.book[pos] = book[pos+1];
    }

    //get方法
//得到当前书籍的引用
    public Book[] getBook() {
        return book;
    }
//获取当前下标数的引用
public Book getBook(int pos){
        return book[pos];
}
//获取当前书架上的书籍数
    public int getCount() {
        return count;
    }
}

11.3 Demo3包

java 复制代码
package Demo3;
import Demo2.Book;
import Demo2.Booklist;
import java.util.Scanner;

public class AddBook implements IFuntion{
    @Override
    public void work(Booklist booklist) {
        //获取当前容量
        int sz = booklist.getCount();
        //获取总的容量
        int capacity = booklist.getBook().length;
        //判断
        if(sz == capacity){//说明已满,不可添加
            System.out.println("书架存放位置已满,不可添加!");
            return;
        }
        //未满,可以添加
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入书名:>");
        String bookName = scanner.nextLine();
        System.out.print("请输入作者名称: >");
        String auther = scanner.nextLine();
        System.out.print("请输入书籍类型: >");
        String type  = scanner.nextLine();
        System.out.print("请输入书籍价格: >");
        double cost = scanner.nextDouble();

        //将输入好的数据存放于一个临时的引用中
        Book tem = new Book(bookName,auther,type,cost);
        //通过set方法方法
        booklist.setBook(sz,tem);
        //将count+1
        booklist.setCount(sz + 1);//sz表示当前的count
        //提示一下
        System.out.println("增加成功!");
    }
}
java 复制代码
package Demo3;

import Demo2.Booklist;

import java.util.Scanner;

public class Borrow implements IFuntion{
    @Override
    public void work(Booklist booklist) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入需要借阅的书籍名称:>");
        String bookName = scanner.nextLine();
        //遍历数组
        int sz = booklist.getCount();
        int i = 0 ;
        for (; i < sz; i++) {
            if(booklist.getBook(i).getName().equals(bookName)){
                break;//找到了
            }
        }
        if(sz == i) System.out.println("需要借阅的书籍不存在!");
        //已经借阅
        else {
            if (booklist.getBook(i).borrowed == true) {
                System.out.println("此书籍已经借阅!");
            } else {
                System.out.println("此书籍可以借阅!");
            }
            booklist.getBook(i).borrowed = true;
            System.out.println("已登记,可以借出!");
        }
    }
}
java 复制代码
package Demo3;
import Demo2.Booklist;
import java.util.Scanner;

public class DelBook implements IFuntion{

    @Override
    public void work(Booklist booklist) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入删除的书籍名称:>");
        String bookName = scanner.nextLine();
        //遍历数组
        int sz = booklist.getCount();
        int i = 0 ;
        for (; i < sz; i++) {
            if(booklist.getBook(i).getName().equals(bookName)){
                break;//找到了
            }
        }
        //找不到
        if(sz == i) System.out.println("输入的书籍名称不存在!");
        //找到了
        else{
        for (; i < sz - 1; i++) {
            //使用set方法:将i+1下标的引用赋值给下标为i的引用
            booklist.setBook(booklist.getBook(),i);
        }
        //将数组count - 1
        booklist.setCount(sz - 1);
        //提示一下
        System.out.println("输入的书籍已经删除!");
        }
    }
}
java 复制代码
package Demo3;

import Demo2.Booklist;

public class Exit implements IFuntion{
    @Override
    public void work(Booklist booklist) {
        //提示一下
        System.out.println("程序正在退出中......");
        System.exit(0);//参数一般默认为0
    }
}
java 复制代码
package Demo3;

import Demo2.Booklist;

public interface IFuntion {
    //抽象方法:功能
    public abstract void work(Booklist booklist);
}
java 复制代码
package Demo3;

import Demo2.Booklist;

import java.util.Scanner;

public class Return implements IFuntion{
    @Override
    public void work(Booklist booklist) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入需要归还的书籍名称:>");
        String bookName = scanner.nextLine();
        //遍历数组
        int sz = booklist.getCount();
        int i = 0;
        for (; i < sz; i++) {
            if (booklist.getBook(i).getName().equals(bookName)) {
                break;//找到了
            }
        }
        //找不到
        if(sz == i) System.out.println("输入的归还书籍不存在");
        //找到了,将书籍状态设置为未借出后提示归还
        else {
            booklist.getBook(i).borrowed = false;
            System.out.println("书籍归还成功!");
        }
    }
}
java 复制代码
package Demo3;
import Demo2.Booklist;
import java.util.Scanner;

public class Search implements IFuntion{
    @Override
    public void work(Booklist booklist) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入书名:>");
        String bookName = scanner.nextLine();
        //遍历数组
        int sz = booklist.getCount();
        int i = 0;
        for (; i < sz; i++) {
            if(booklist.getBook(i).getName().equals(bookName)){
                break;//找到了
            }
        }
        //找不到
        if(i == sz) System.out.println(bookName + "此书不存在!");
        //找到了,输出展示
        else {
            System.out.print("找到了,书籍信息: ");
            System.out.println(booklist.getBook(i));
        }
    }
}
java 复制代码
package Demo3;
import Demo2.Booklist;

public class ShowBook implements IFuntion{
    @Override
    public void work(Booklist booklist) {

        System.out.println("*******************************************************************************");
        int sz = booklist.getCount();//获取当前书籍数
        //遍历数组输出
        for (int i = 0; i < sz; i++) {
            System.out.println(booklist.getBook(i));
        }
        System.out.println("*******************************************************************************");
    }
}

11.4 Main类

java 复制代码
import Demo1.AdminUser;
import Demo1.NormalUser;
import Demo1.Person;
import Demo2.Booklist;
import java.util.Scanner;

public class Main{
    public static Person login(){
        //选择身份
        System.out.println("请选择你的身份:> 1.管理员  2.普通用户");
        System.out.print("请输入:> ");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();

        //返回类型
        if(choice == 1) return new AdminUser("zansang",22);
        else return new NormalUser("lisi",33);

    }
    public static void main(String[] args) {
        //1. //加载书架:有书架和书籍才可以操作,先实例一个书架
        Booklist booklist = new Booklist();
        //2.加载用户选择,通过返回值确定用户类型
        Person person =  login();//接收返回值
        while(true) {
            //3.实现选择功能,不同用户有不同的选择,根据login返回类型确定
            int choice = person.menu();
            if(choice < 0 || choice > booklist.getBook().length){
                System.out.println("非法输入,请重新输入!!!");
            }else {
                //通过person引用使用iFuntions这个引用数组下标为choice的类
                //调用其中的work方法
                person.iFuntions[choice].work(booklist);
            }
        }
    }
}
相关推荐
belldeep4 分钟前
java:如何用 JDBC 连接 TDSQL 数据库
java·数据库·jdbc·tdsql
2301_1472583691 小时前
7月2日作业
java·linux·服务器
香饽饽~、1 小时前
【第十一篇】SpringBoot缓存技术
java·开发语言·spring boot·后端·缓存·intellij-idea
小莫分享1 小时前
移除 Java 列表中的所有空值
java
Devil枫2 小时前
Kotlin扩展函数与属性
开发语言·python·kotlin
菠萝加点糖2 小时前
Kotlin Data包含ByteArray类型
android·开发语言·kotlin
2301_803554523 小时前
c++中类的前置声明
java·开发语言·c++
不想写bug呀6 小时前
多线程案例——单例模式
java·开发语言·单例模式
心平愈三千疾6 小时前
通俗理解JVM细节-面试篇
java·jvm·数据库·面试
我不会写代码njdjnssj6 小时前
网络编程 TCP UDP
java·开发语言·jvm