1.顾名思义,图书系统可以先从图书入手,图书系统的书肯定不止一本,所以要同时定义多组内容可以用数组

2.思考这么多图书该怎么高效利用,所以这时候书架应运而生


3.初始化的时候记得先标记元素个数,为后面做铺垫,即count = 3
4.图书系统又拥有用户,而用户又分为管理员和普通用户

5.用户有名字,不同用户系统又有系统菜单,这时候可以考虑动态绑定


6.这个时候你就会有个问题,什么时候用管理员菜单,什么时候用普通用户菜单?
答:设置按钮选择

7.return返回不同用户(name)后,用User来接收两个new的新对象,并且给父类User初始化

8.不同用户的操作面板不同,需要分别写出来,同时要给用户去选择功能,用choice去返回选择的值

9.接收到用户选择功能的值之后得实现不同的功能,这么多功能该怎么去整合呢?
答:接口可以作为数组帮我们实现

10.我们需要知道怎么样才能将我们的选择告知给编译器?以及定义功能类的时候操作哪个对象?
答:(1)将不同的选择作为下标,将接口里面的功能类做为数组元素来调用


(2)我们要操作的是书,而书作为数组又存储在书架当中,也要讲书架传给功能类

(3)两个用户对象都要调用这个fac方法,所以将这个方法定义在User中,又因为前面已经return了对应的用户,所以当前调用的也是选择的对象的接口当中的不同功能类

(4)我们要将不同功能定义在两种用户系统的构造方法中,这样当第一次选择身份时,也顺便创建了不同的功能类对象,初始值为null

11.想多次运行可以将选择器放到死循环当中,后期专门设置退出功能

(1)我们可以调用书架的元素个数来查找

(2)要注意,用户输入的是书名查找,而书名又是String字符串类型,又是引用类型, 所以用equal 比较

(3)需要注意书架不是数组,要想获得书当中每个下标的具体值,需要调用一些方法,将i的值作为下标来查找具体书籍


(4)代码
package IO_libarary;
import library.Book;
import library.Booklist;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 16:51
*/
public class FindBook implements IO{
@Override
public void fib (Booklist booklist) {
System.out.println("查找书籍!");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();//输入书名
for (int i = 0; i < booklist.getCount(); i++) {
Book book = booklist.getBooks(i);//用这个方法获取书架上的书,然后放到book里面
if(book.getName().equals(name)) {
System.out.println("成功找到 " + name);
System.out.println(book);
return;
}
}
System.out.println("没有找到这本书!");
}
}(1)遍历书整个这个数组

(2)代码
package IO_libarary;
import library.Book;
import library.Booklist;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 18:07
*/
public class ShowBook implements IO{
@Override
public void fib(Booklist booklist) {
for (int i = 0; i < booklist.getCount(); i++) {
Book book = booklist.getBooks(i);
System.out.println(book);
}
}
}(1)首先用户选择这个功能的时候首先要进行判断书架是否满了,不能用户输完信息才提示

(2)满足条件后要一次按照(书名,坐着,类型,价格)进行赋值,为什么类型和价格要换位置输出呢,为了避免输入价格的时候自动读取回车键,导致类型是空的

(3)进行第二次判断,书架里有不能添加

(4)最后将书放到当前下标后,元素个数要+1,为下一个下标填写留出位置

(5)代码
package IO_libarary;
import library.Book;
import library.Booklist;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 17:03
*/
public class AddBook implements IO{
@Override
public void fib (Booklist booklist) {
//首先判断书架满了没有
if(booklist.getCount() == booklist.getBook().length) {
System.out.println("书架已经满了,不能再放!");
return;
}
System.out.println("添加图书");
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("请输入你要添加书的价格");
int price = scanner.nextInt();
Book newbook = new Book(name,author,price,type);
for (int i = 0; i < booklist.getCount(); i++) {
Book book = booklist.getBooks(i);
//书架有的不能添加,添加过的不能添加
if(book.getName().equals(name) == true) {
System.out.println("抱歉书架已经有此书,不能重复添加!");
return;
}
}
booklist.setBooks(booklist.getCount(), newbook);//将新书放到当前下标位置,然后cout++
booklist.setCount(booklist.getCount()+1);
}
}(1)这里用的删除书的方法是覆盖前面的内容
(2)先找到要删除的书的书的下标

(3)每次删除后要进行元素下标减1

(4)没找到也要进行提示

(5)代码
package IO_libarary;
import library.Book;
import library.Booklist;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 18:38
*/
public class DeleBook implements IO{
@Override
public void fib(Booklist booklist) {
//删除图书,是覆盖前面位置的书
System.out.println("请输入你要删除的图书名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int i = 0;
for ( i = 0; i < booklist.getCount(); i++) {
Book book = booklist.getBooks(i);
//找到该图书的下标
if(book.getName().equals(name)) {
for (int j = i; j < booklist.getCount() - 1; j++) {
Book book1 = booklist.getBooks(j+1);
booklist.setBooks(j,book1);
}
//每次成功删除后就元素count减一
System.out.println("恭喜你删除 "+ name +" 成功");
booklist.setCount(booklist.getCount()-1);
return;
}
}
//if(i == booklist.getCount()) {
System.out.println("抱歉,没有你要删除的书");
//return;
//}
}
}(1)判断完要借的名字相同时,要判断当前书是否被借出去了,防止重复借阅

(2)当状态时false时可以被借阅,同时将状态改为true

(3)同时要记得没找到书的是由有提示

(4)代码
package IO_libarary;
import library.Book;
import library.Booklist;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 18:13
*/
public class BrowedBook implements IO{
@Override
public void fib (Booklist booklist) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要借阅的图书名称");
String name = scanner.nextLine();
int i = 0;
for ( i = 0; i < booklist.getCount(); i++) {
Book book = booklist.getBooks(i);
//先判断名字是否相等
if(book.getName().equals(name)) {
if (book.getLook() == true) {
//当显示true被借阅,不能重复借阅
System.out.println("对不起,该图书已经被借出去了!");
System.out.println(book);
return;
}else {
//当显示false没有被借阅,可以借阅
book.setLook(true);
System.out.println("成功借阅 '" + name + "' ,该书状态已被更改");
System.out.println(book);
return;
}
}
}
if (i == booklist.getCount()) {
System.out.println("抱歉书架上没有你要借阅的书!");
}
}
}(1)归还时和借阅恰恰相反,状态是true就可以归还,同时状态改为false

(2)当状态为false时,说明没有被借出去

(3)同时循环走完时判断书架上有没有你要归还的书

(4)代码
package IO_libarary;
import library.Book;
import library.Booklist;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 18:23
*/
public class ReturnBook implements IO{
@Override
public void fib (Booklist booklist) {
System.out.println("请输入你要归还的图书");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for (int i = 0; i < booklist.getCount(); i++) {
Book book = booklist.getBooks(i);
if(book.getName().equals(name)) {
//当显示true被借阅,可以归还
if(book.getLook() == true) {
book.setLook(false);
System.out.println("成功归还 '" + name + "' ,该书状态已被更改");
System.out.println(book);
return;
}else {
//当显示false没有被借阅,不可以归还
System.out.println("不能归还没有被借阅的书!");
return;
}
}
}
System.out.println("书架上没有你要归还的书");
}
}7.退出系统的功能
(1)上面我们将图书系统选择界面放到了死循环当中,所以要设置一个可以退出的功能
(2)直接运用编译器自带的工具包来进行退出

(3)代码
package IO_libarary;
import library.Booklist;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 18:10
*/
public class Exitbook implements IO{
@Override
public void fib(Booklist booklist) {
System.out.println("退出图书馆系统成功!");
System.exit(0);
}
}
package Main;
import Users.ConcolUser;
import Users.NomolUser;
import Users.User;
import library.Booklist;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 16:23
*/
public class Main {
public static User fanc() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的姓名");
String name = scanner.nextLine();
System.out.println("请选择你的身份,1 :管理员 2 :普通用户");
int choice = scanner.nextInt();
if(choice == 1) {
return new ConcolUser(name);
}else {
return new NomolUser(name);
}
}
public static void main(String[] args) {
User user = fanc();// 用User接受fanc方法
Booklist booklist = new Booklist();//new一个新对象,调用构造方法初始化书籍
while (true)
{
int choice = user.menu();//运用动态绑定,调用不同菜单}
user.fac(choice, booklist);
}
}
}package Users;
import IO_libarary.IO;
import library.Booklist;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 16:28
*/
public abstract class User {
protected String name;
IO[] io;
public User(String name) {
this.name = name;
}
public abstract int menu();//创建抽象菜单
public void fac(int choice, Booklist booklist) {
io[choice].fib(booklist);
}
}package Users;
import IO_libarary.*;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 16:28
*/
public class NomolUser extends User{
public NomolUser(String name) {
super(name);
io = new IO[] {
new Exitbook(),
new FindBook(),
new BrowedBook(),
new ReturnBook()
};
}
public int menu() {
//普通用户菜单
System.out.println("欢迎用户 " + name + " 来到图书馆");
System.out.println("********普通用户菜单********");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
System.out.println("**************************");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的选择");
int choice = scanner.nextInt();
return choice;
}
}package Users;
import IO_libarary.*;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 16:28
*/
public class ConcolUser extends User{
public ConcolUser(String name) {
super(name);//给父类的name初始化
io = new IO[] {
new Exitbook(),
new FindBook(),
new AddBook(),
new DeleBook(),
new ShowBook(),
new BrowedBook(),
new ReturnBook()
};
}
public int menu() { //管理员菜单
System.out.println("欢迎管理员 " + name + " 来到图书馆");
System.out.println("********管理员菜单********");
System.out.println("1.查找图书");
System.out.println("2.新增图书");
System.out.println("3.删除图书");
System.out.println("4.显示图书");
System.out.println("5.借阅图书");
System.out.println("6.归还图书");
System.out.println("0.退出系统");
System.out.println("************************");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的选择");
int choice = scanner.nextInt();
return choice;
}
}package library;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 16:06
*/
public class Book {
private String name;//书名
private String author;//坐着
private int price;//价格
private String type;//类型
private boolean isLook;//状态
public Book(String name, String author, int 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 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 getLook() {
return isLook;
}
public void setLook(boolean look) {
isLook = look;
}
@Override
public String toString() { //重写toString方法,便于利用引用直接打印
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
// ", isLook=" + isLook +
",状态= " + //运用三目操作符来快速判定状态
((isLook == false) ? "未借出" : "已借出") +
'}';
}
}package library;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 16:16
*/
public class Booklist {
Book[] books = new Book[10];
private int count;
public Booklist(){ //书架里面放书,定义一些书
books[0] = new Book("三国演义","罗贯中",19,"小说");
books[1] = new Book("查理九世","雷欧.幻像",20,"探险");
books[2] = new Book("哈利波特.死亡圣器","罗琳",33,"奇幻");
count = 3;
}
public Book getBooks(int pos) {//获取下标pos的书的信息
//返回值是Book,代表返回的是下标为pos的书的信息
return books[pos];
}
public void setBooks(int pos,Book book) {//将添加的新书放到下标pos里
//同样你要的是将新new的书放入数组指定下标pos里,所以这里是Book,而前面new的的书不是数组,不能用Book[]
this.books[pos] = book;
}
public int getCount() {//获取当前元素个数
return count;
}
public void setCount(int count) {//设置当前元素个数
this.count = count;
}
public Book[] getBook() {//为获取数组长度做准备,添加图书的时候用
return books;
}
}package IO_libarary;
import library.Booklist;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 16:49
*/
public interface IO {
void fib (Booklist booklist);
}package IO_libarary;
import library.Book;
import library.Booklist;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 17:03
*/
public class AddBook implements IO{
@Override
public void fib (Booklist booklist) {
//首先判断书架满了没有
if(booklist.getCount() == booklist.getBook().length) {
System.out.println("书架已经满了,不能再放!");
return;
}
System.out.println("添加图书");
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("请输入你要添加书的价格");
int price = scanner.nextInt();
Book newbook = new Book(name,author,price,type);
for (int i = 0; i < booklist.getCount(); i++) {
Book book = booklist.getBooks(i);
//书架有的不能添加,添加过的不能添加
if(book.getName().equals(name) == true) {
System.out.println("抱歉书架已经有此书,不能重复添加!");
return;
}
}
booklist.setBooks(booklist.getCount(), newbook);//将新书放到当前下标位置,然后cout++
booklist.setCount(booklist.getCount()+1);
}
}package IO_libarary;
import library.Book;
import library.Booklist;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 18:13
*/
public class BrowedBook implements IO{
@Override
public void fib (Booklist booklist) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要借阅的图书名称");
String name = scanner.nextLine();
int i = 0;
for ( i = 0; i < booklist.getCount(); i++) {
Book book = booklist.getBooks(i);
//先判断名字是否相等
if(book.getName().equals(name)) {
if (book.getLook() == true) {
//当显示true被借阅,不能重复借阅
System.out.println("对不起,该图书已经被借出去了!");
System.out.println(book);
return;
}else {
//当显示false没有被借阅,可以借阅
book.setLook(true);
System.out.println("成功借阅 '" + name + "' ,该书状态已被更改");
System.out.println(book);
return;
}
}
}
if (i == booklist.getCount()) {
System.out.println("抱歉书架上没有你要借阅的书!");
}
}
}package IO_libarary;
import library.Book;
import library.Booklist;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 18:38
*/
public class DeleBook implements IO{
@Override
public void fib(Booklist booklist) {
//删除图书,是覆盖前面位置的书
System.out.println("请输入你要删除的图书名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int i = 0;
for ( i = 0; i < booklist.getCount(); i++) {
Book book = booklist.getBooks(i);
//找到该图书的下标
if(book.getName().equals(name)) {
for (int j = i; j < booklist.getCount() - 1; j++) {
Book book1 = booklist.getBooks(j+1);
booklist.setBooks(j,book1);
}
//每次成功删除后就元素count减一
System.out.println("恭喜你删除 "+ name +" 成功");
booklist.setCount(booklist.getCount()-1);
return;
}
}
if(i == booklist.getCount()) {
System.out.println("抱歉,没有你要删除的书");
return;
}
}
}package IO_libarary;
import library.Booklist;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 18:10
*/
public class Exitbook implements IO{
@Override
public void fib(Booklist booklist) {
System.out.println("退出图书馆系统成功!");
System.exit(0);
}
}package IO_libarary;
import library.Book;
import library.Booklist;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 16:51
*/
public class FindBook implements IO{
@Override
public void fib (Booklist booklist) {
System.out.println("查找书籍!");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();//输入书名
for (int i = 0; i < booklist.getCount(); i++) {
Book book = booklist.getBooks(i);//用这个方法获取书架上的书,然后放到book里面
if(book.getName().equals(name)) {
System.out.println("成功找到 " + name);
System.out.println(book);
return;
}
}
System.out.println("没有找到这本书!");
}
}package IO_libarary;
import library.Book;
import library.Booklist;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 18:23
*/
public class ReturnBook implements IO{
@Override
public void fib (Booklist booklist) {
System.out.println("请输入你要归还的图书");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for (int i = 0; i < booklist.getCount(); i++) {
Book book = booklist.getBooks(i);
if(book.getName().equals(name)) {
//当显示true被借阅,可以归还
if(book.getLook() == true) {
book.setLook(false);
System.out.println("成功归还 '" + name + "' ,该书状态已被更改");
System.out.println(book);
return;
}else {
//当显示false没有被借阅,不可以归还
System.out.println("不能归还没有被借阅的书!");
return;
}
}
}
System.out.println("书架上没有你要归还的书");
}
}package IO_libarary;
import library.Book;
import library.Booklist;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 32309
* Date: 2025-05-10
* Time: 18:07
*/
public class ShowBook implements IO{
@Override
public void fib(Booklist booklist) {
for (int i = 0; i < booklist.getCount(); i++) {
Book book = booklist.getBooks(i);
System.out.println(book);
}
}
}(1)大多有Book book = booklist.getBooks(i);这个功能,目的是为调用方法来查找数组下标书的信息
(2)大多有book.getName().equals(name),为了判断你查找的的这个书是否和你输入的书名是否一致,用来作为限制条件
(3)大多有if(i == booklist.getCount()),用这个作为你循环结束后仍没有满足条件的尾巴,也是至关重要
(1)建议先滤清思路,建议看完两边再尝试
(2)第一次我们大部分人写不出来,卡壳卡半天,十分难受,可我们要的就是就是这种感觉,你翻来覆去想不出来时,更增加你的记忆力,一个地方卡壳你可以尝试写其他部分,比如功能部分,能写多少是多少
(3)写不出来的地方要记住因为什么写不出来,然后去看视频回顾