答案:系统包含图书、读者和借阅管理,通过控制台实现添加图书、注册读者、借还书及查询功能,使用ArrayList存储数据,核心逻辑在Library类中处理业务流程。

做一个简易的Java图书馆借阅系统,核心是管理图书、读者和借阅行为。系统不需要复杂界面,用控制台(Console)实现即可,适合初学者练手。重点在于理清数据结构与业务逻辑关系,下面从整体结构到代码实现一步步说明。
一、系统功能需求分析
一个基础的图书馆借阅系统应具备以下功能:
- 图书管理:添加、删除、查询图书
- 读者管理:注册、注销、查询读者
- 借书功能:读者借阅图书,记录借阅信息
- 还书功能:归还图书,更新状态
- 查询功能:查看当前借阅情况
不考虑用户登录、数据库持久化(可用集合类临时存储),简化为内存操作。
二、核心类设计与数据结构
系统围绕三个主要实体建模:图书、读者、借阅记录。每个类职责明确。
立即学习“Java免费学习笔记(深入)”;
1. Book 图书类
代表一本图书,包含基本信息:
- 书号(id)
- 书名(title)
- 作者(author)
- 是否可借(available)
2. Reader 读者类
表示一个注册读者:
- 读者编号(id)
- 姓名(name)
- 已借图书列表(List
)
3. BorrowRecord 借阅记录类(可选)
如果想记录借还时间,可以单独建类。但本系统简化处理,只在Reader中维护借阅列表,Book中维护状态。
4. Library 图书馆主控类
作为系统入口,管理所有图书和读者,并提供操作方法:
- 维护图书集合(List
) - 维护读者集合(List
) - 提供借书、还书等公共方法
三、关键业务逻辑实现思路
每个功能模块的判断条件要清晰,避免重复借阅或还不存在的书。
1. 添加图书
创建Book对象,加入图书馆的图书列表。可通过书名+作者去重,或仅按ID区分。
2. 注册读者
创建Reader对象,分配唯一ID,加入读者列表。
3. 借书流程
输入读者ID和图书ID,执行以下检查:
- 读者是否存在
- 图书是否存在
- 图书是否可借(available == true)
全部通过后,修改图书状态为不可借,加入该读者的借书列表。
4. 还书流程
输入读者ID和图书ID:
- 验证读者和图书存在
- 检查该读者是否真的借了这本书
确认后从读者借书列表中移除,图书状态改为可借。
5. 查询功能
支持查看所有图书(含状态)、所有读者及其借书情况。
四、代码实现示例(精简版)
以下是核心代码片段,可在main方法中调用测试。
import java.util.*;
// 图书类
class Book {
private String id;
private String title;
private String author;
private boolean available;
public Book(String id, String title, String author) {
this.id = id;
this.title = title;
this.author = author;
this.available = true;
}
// getter 和 setter 方法
public String getId() { return id; }
public String getTitle() { return title; }
public String getAuthor() { return author; }
public boolean isAvailable() { return available; }
public void setAvailable(boolean available) { this.available = available; }
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", title='" + title + '\'' +
", author='" + author + '\'' +
", available=" + (available ? "可借" : "已借出") +
'}';
}
}
// 读者类
class Reader {
private String id;
private String name;
private List borrowedBooks;
public Reader(String id, String name) {
this.id = id;
this.name = name;
this.borrowedBooks = new ArrayList<>();
}
public String getId() { return id; }
public String getName() { return name; }
public List getBorrowedBooks() { return borrowedBooks; }
// 借书
public void borrowBook(Book book) {
borrowedBooks.add(book);
}
// 还书
public boolean returnBook(String bookId) {
Book toRemove = null;
for (Book b : borrowedBooks) {
if (b.getId().equals(bookId)) {
toRemove = b;
break;
}
}
if (toRemove != null) {
borrowedBooks.remove(toRemove);
return true;
}
return false;
}
@Override
public String toString() {
return "Reader{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", borrowedBooksCount=" + borrowedBooks.size() +
'}';
}
}
// 图书馆管理类
public class Library {
private List books;
private List readers;
public Library() {
this.books = new ArrayList<>();
this.readers = new ArrayList<>();
}
// 添加图书
public void addBook(Book book) {
books.add(book);
System.out.println("图书已添加:" + book.getTitle());
}
// 注册读者
public void registerReader(Reader reader) {
readers.add(reader);
System.out.println("读者已注册:" + reader.getName());
}
// 借书
public void borrowBook(String readerId, String bookId) {
Reader reader = findReaderById(readerId);
Book book = findBookById(bookId);
if (reader == null) {
System.out.println("错误:读者不存在!");
return;
}
if (book == null) {
System.out.println("错误:图书不存在!");
return;
}
if (!book.isAvailable()) {
System.out.println("抱歉,《" + book.getTitle() + "》已被借出。");
return;
}
book.setAvailable(false);
reader.borrowBook(book);
System.out.println("借阅成功:" + reader.getName() + " 借了《" + book.getTitle() + "》");
}
// 还书
public void returnBook(String readerId, String bookId) {
Reader reader = findReaderById(readerId);
Book book = findBookById(bookId);
if (reader == null || book == null) {
System.out.println("读者或图书信息错误!");
return;
}
boolean success = reader.returnBook(bookId);
if (success) {
book.setAvailable(true);
System.out.println("还书成功:" + reader.getName() + " 归还了《" + book.getTitle() + "》");
} else {
System.out.println("该读者未借阅此书!");
}
}
// 查询所有图书
public void listAllBooks() {
System.out.println("\n=== 所有图书 ===");
for (Book book : books) {
System.out.println(book);
}
}
// 查询所有读者及借书情况
public void listAllReaders() {
System.out.println("\n=== 所有读者 ===");
for (Reader reader : readers) {
System.out.println(reader);
if (!reader.getBorrowedBooks().isEmpty()) {
System.out.println(" 已借图书:");
for (Book b : reader.getBorrowedBooks()) {
System.out.println(" - " + b.getTitle());
}
}
}
}
// 辅助方法:根据ID查找图书
private Book findBookById(String id) {
for (Book b : books) {
if (b.getId().equals(id)) {
return b;
}
}
return null;
}
// 辅助方法:根据ID查找读者
private Reader findReaderById(String id) {
for (Reader r : readers) {
if (r.getId().equals(id)) {
return r;
}
}
return null;
}
// 主方法演示
public static void main(String[] args) {
Library lib = new Library();
Scanner sc = new Scanner(System.in);
// 初始化几本书和读者
Book b1 = new Book("B001", "Java编程思想", "Bruce Eckel");
Book b2 = new Book("B002", "算法导论", "Cormen");
lib.addBook(b1);
lib.addBook(b2);
Reader r1 = new Reader("R001", "张三");
Reader r2 = new Reader("R002", "李四");
lib.registerReader(r1);
lib.registerReader(r2);
while (true) {
System.out.println("\n--- 图书馆系统 ---");
System.out.println("1. 借书");
System.out.println("2. 还书");
System.out.println("3. 查看所有图书");
System.out.println("4. 查看所有读者");
System.out.println("5. 退出");
System.out.print("请选择操作:");
int choice = sc.nextInt();
sc.nextLine(); // 消费换行
switch (choice) {
case 1:
System.out.print("输入读者ID: ");
String rid = sc.nextLine();
System.out.print("输入图书ID: ");
String bid = sc.nextLine();
lib.borrowBook(rid, bid);
break;
case 2:
System.out.print("输入读者ID: ");
rid = sc.nextLine();
System.out.print("输入图书ID: ");
bid = sc.nextLine();
lib.returnBook(rid, bid);
break;
case 3:
lib.listAllBooks();
break;
case 4:
lib.listAllReaders();
break;
case 5:
System.out.println("再见!");
sc.close();
return;
default:
System.out.println("无效选择!");
}
}
}
} 五、扩展建议
当前版本是控制台基础版,后续可增强:
- 使用Map优化查找效率(如Map
) - 加入文件读写,实现数据持久化(如保存到txt或JSON)
- 升级为图形界面(Swing或JavaFX)
- 增加借阅期限、逾期提醒等功能
- 引入异常处理机制,提升健壮性
基本上就这些。掌握这个结构后,再复杂的功能也能一步步拆解实现。










