图书和用户类
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 78 课,共 87 课。
挑战
简单让我们继续构建图书管理系统,扩展上一课中的 Book 和 User 类。现在,你将添加用户借书的功能,让这两个实体建立真正的联系。
你将把代码分成 3 个文件:
Book.java:完善上一项挑战中的 Book 类。保留所有现有功能(isbn、title、author、带有 getter/setter 的 isAvailable,以及getDetails())。现在,添加一个类型为String的私有字段borrowedBy,用于保存借书用户的 ID(如果书没有借出,则为null)。添加一个用于获取borrowedBy的 getter,以及一个 setter,用来同时更新isAvailable:借出图书时(borrowedBy 被设置为非 null 值),图书变为不可借阅;归还图书时(设置为 null),图书重新变为可借阅。User.java:扩展 User 类,以便跟踪借出的图书。保留现有的 id、name、构造函数、getter 和toString()。添加一个名为borrowedBooks的私有ArrayList<Book>字段(在构造函数中初始化)。创建一个borrowBook(Book book)方法,将图书添加到用户的列表中,并将图书的borrowedBy设置为该用户的 ID。创建一个returnBook(Book book)方法,从列表中移除图书,并将borrowedBy设置为 null。添加一个getBorrowedCount()方法,返回用户当前借了多少本书。Main.java:演示借书系统的运行过程。你会收到 5 个输入:一本书的 ISBN、书名和作者,然后是用户 ID 和姓名。使用这些输入创建一个 Book 和一个 User。输出图书的详细信息和可借阅状态。然后让用户借这本书。再次输出图书的可借阅状态,接着按
Borrowed by: [userId]的格式输出借书用户。按[name] has [count] book(s)的格式输出用户当前借了多少本书。最后,让用户归还图书,再输出一次图书的可借阅状态。
你将按顺序收到 5 个输入:ISBN(String)、书名(String)、作者(String)、用户 ID(String)和用户姓名(String)。
例如,输入为 978-0-13-468599-1、Effective Java、Joshua Bloch、U001 和 Alice 时,输出如下:
[978-0-13-468599-1] Effective Java by Joshua Bloch
Available: true
Available: false
Borrowed by: U001
Alice has 1 book(s)
Available: true这个挑战直接基于你之前的练习,添加了图书和用户之间的重要关系,让图书管理系统能够正常运作。你将使用组合(User “拥有” Books),并了解设计良好的方法如何让一个对象的变化影响另一个对象!
亲手试试
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取图书信息
String isbn = scanner.nextLine();
String title = scanner.nextLine();
String author = scanner.nextLine();
// 读取用户信息
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// 使用 isbn、title 和 author 创建 Book 对象
Book book = new Book(isbn, title, author);
// 使用 userId 和 userName 创建 User 对象
User user = new User(userId, userName);
// 使用 getDetails() 输出图书详情
System.out.println(book.getDetails());
// 输出图书是否可借(格式:"Available: true" 或 "Available: false")
System.out.println("Available: " + book.isAvailable());
// 让用户借阅这本书
user.borrowBook(book);
// 再次输出图书是否可借
System.out.println("Available: " + book.isAvailable());
// 输出借阅者是谁
System.out.println("Borrowed by: " + book.getBorrowedBy());
// 输出用户借了多少本书
System.out.println(user.getName() + " has " + user.getBorrowedCount() + " book(s)");
// 让用户归还这本书
user.returnBook(book);
// 再次输出图书是否可借
System.out.println("Available: " + book.isAvailable());
}
}面向对象编程中的所有课
自己练习: Java 在线编译器