Menu
CoddyTech

图书和用户类

本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 78 课,共 87 课。

challenge icon

挑战

简单

让我们继续构建图书管理系统,扩展上一课中的 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 在线编译器