<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>《Java 编程入门》 · 全书目录与章节索引（61 篇） on PlumePHP</title><link>https://plumephp.com/posts/books/java%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/</link><description>Recent content in 《Java 编程入门》 · 全书目录与章节索引（61 篇） on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 16 Oct 2026 12:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/books/java%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>《Java 编程入门》附录 D 常见编译与运行错误</title><link>https://plumephp.com/java-intro-appendix-d-troubleshooting/</link><pubDate>Fri, 16 Oct 2026 12:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-appendix-d-troubleshooting/</guid><description>按报错关键词整理 Java 入门阶段最常见的编译与运行问题：找不到符号、类型不兼容、找不到主类、类版本不匹配、NoSuchMethodError、空指针、数组越界、并发修改、编码乱码、Maven 依赖冲突、jar 无法运行、端口占用等，每条给出典型报错、原因、排查步骤与修复示例。</description></item><item><title>《Java 编程入门》附录 C 21→25 版本差异</title><link>https://plumephp.com/java-intro-appendix-c-version-differences/</link><pubDate>Fri, 16 Oct 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-appendix-c-version-differences/</guid><description>把 JDK 21 到 25 的正式特性与预览特性分开列清楚：21 的虚拟线程、记录模式、switch 模式匹配，22 的 FFM API 与未命名变量，23 的 Markdown 文档注释与分代 ZGC 默认，24 的 Class-File API 与 Stream Gatherers，25 的 Scoped Values、模块导入声明、紧凑源文件、灵活构造器与紧凑对象头，并给出迁移建议。</description></item><item><title>《Java 编程入门》附录 B 标准库地图</title><link>https://plumephp.com/java-intro-appendix-b-stdlib-map/</link><pubDate>Fri, 16 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-appendix-b-stdlib-map/</guid><description>按包梳理 java.base 与常用 JDK 模块：java.lang、java.util、java.io、java.nio.file、java.time、java.net.http、java.util.concurrent、java.util.regex 等各自负责什么、关键类有哪些、什么时候该用，并给出按任务选包的速查表。</description></item><item><title>《Java 编程入门》附录 A 语法速查</title><link>https://plumephp.com/java-intro-appendix-a-syntax-cheatsheet/</link><pubDate>Fri, 16 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-appendix-a-syntax-cheatsheet/</guid><description>把《Java 编程入门》涉及的语法压缩成一页可查的速查表：基本类型、变量、运算符、控制流、方法、类与接口、record/enum/sealed、泛型、集合、Stream、异常、NIO、java.time、正则，以及常用的 javac/java/mvn 命令，每项都配最小示例。</description></item><item><title>《Java 编程入门》18.3 用 com.sun.net.httpserver 暴露 REST 接口</title><link>https://plumephp.com/java-intro-18-3-http-service/</link><pubDate>Thu, 15 Oct 2026 16:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-18-3-http-service/</guid><description>不引入任何 Web 框架，用 JDK 自带的 com.sun.net.httpserver 把 LibraryService 暴露成 REST：手写扁平 JSON、实现 GET /books、POST /books、POST /loans、POST /returns，并用 curl 验证 201、409 等真实响应。</description></item><item><title>《Java 编程入门》18.2 内存仓储与 CLI 交互</title><link>https://plumephp.com/java-intro-18-2-cli-and-repository/</link><pubDate>Thu, 15 Oct 2026 15:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-18-2-cli-and-repository/</guid><description>给 library 接上存储和交互：用 LibraryRepository 接口隔离存储，用 TreeMap 与活动借阅表实现内存仓储，再让 CommandParser 解析 add、list、borrow、return、search、quit 六个命令，最后用真实终端会话跑通借阅与归还。</description></item><item><title>《Java 编程入门》18.1 需求与领域模型：借阅、归还、查询</title><link>https://plumephp.com/java-intro-18-1-domain-model/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-18-1-domain-model/</guid><description>把前 17 章的能力收束成一个完整项目：先划清 library 的需求边界，再用 Book、Member、Loan 三个 record 和 LibraryService 的借阅、归还方法，把「一本书同时只能借给一个人、借期 14 天、逾期按天计费」写成可执行的领域规则。</description></item><item><title>《Java 编程入门》17.3 版本、发布与可复现构建</title><link>https://plumephp.com/java-intro-17-3-reproducible-build/</link><pubDate>Thu, 15 Oct 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-17-3-reproducible-build/</guid><description>把 library 的构建从「我这儿能打包」推进到「谁都能复现」：用 outputTimestamp 固定 jar 条目时间，用固定依赖、BOM 和 enforcer 禁止动态版本，再用 sha256、dependency:tree 与离线构建验证发布产物。</description></item><item><title>《Java 编程入门》17.2 可执行 jar 与模块化 jar</title><link>https://plumephp.com/java-intro-17-2-packaging-jar/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-17-2-packaging-jar/</guid><description>把 library 的 class 文件打成可直接运行的 jar：读懂 jar 与 MANIFEST.MF，用 maven-jar-plugin 写 Main-Class，比较依赖复制与 maven-shade-plugin 的取舍，再补上 module-info、jar --describe-module、jdeps 与 jlink 的完整命令和真实输出。</description></item><item><title>《Java 编程入门》17.1 Maven 依赖、作用域与冲突</title><link>https://plumephp.com/java-intro-17-1-maven-dependencies/</link><pubDate>Thu, 15 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-17-1-maven-dependencies/</guid><description>从 library 的 JUnit 测试依赖出发，讲清 Maven 坐标、传递依赖与 compile、test、provided、runtime 四种作用域的实际影响；再用真实的依赖树、冲突裁决记录和 NoClassDefFoundError，说明最近优先、dependencyManagement 与 BOM 的用法。</description></item><item><title>《Java 编程入门》16.3 可测试性设计</title><link>https://plumephp.com/java-intro-16-3-testable-design/</link><pubDate>Wed, 14 Oct 2026 22:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-16-3-testable-design/</guid><description>测试写得吃力，往往不是测试技巧问题，而是设计没有留缝。本节从 library 的 Clock、Supplier、仓储接口出发，讲清构造器注入、纯函数、窄接口与确定性输入四个杠杆，并给出可复用的测试分层、真实 mvn test 输出与反模式清单。</description></item><item><title>《Java 编程入门》16.2 测试替身：Stub、Fake 与 Mock</title><link>https://plumephp.com/java-intro-16-2-test-doubles/</link><pubDate>Wed, 14 Oct 2026 21:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-16-2-test-doubles/</guid><description>把 Dummy、Stub、Fake、Spy、Mock 五种替身放回 library 的仓储接口上：用 Stub 制造「书不存在」，用 Fake 验证借还流程，用记录型 Mock 检查 save 调用次数，并说明什么时候不该验证交互、如何避免测试变脆。</description></item><item><title>《Java 编程入门》16.1 JUnit 5：断言、生命周期与参数化</title><link>https://plumephp.com/java-intro-16-1-junit5/</link><pubDate>Wed, 14 Oct 2026 20:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-16-1-junit5/</guid><description>从手工跑 main 验证借阅规则的痛点出发，给出 Maven 引入 JUnit 5 的最小 pom、断言与异常断言、测试生命周期、嵌套与参数化测试；再用 library 的 LoanPolicyTest 和真实 mvn test 输出，说明一条测试应该验证什么。</description></item><item><title>《Java 编程入门》15.3 正则表达式与 Pattern/Matcher</title><link>https://plumephp.com/java-intro-15-3-regex/</link><pubDate>Wed, 14 Oct 2026 16:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-15-3-regex/</guid><description>从 ISBN 的连字符、空格和校验位讲起，区分 matches 与 find、分组与命名分组、replaceAll 的替换陷阱；再用 library 的 ISBN 校验和检索语法解析，配真实输出说明正则能做什么、不能做什么，以及灾难性回溯的边界。</description></item><item><title>《Java 编程入门》15.2 String、StringBuilder 与文本块</title><link>https://plumephp.com/java-intro-15-2-string-and-text-blocks/</link><pubDate>Wed, 14 Oct 2026 15:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-15-2-string-and-text-blocks/</guid><description>从借阅凭证和馆藏报表出发，讲清 String 不可变与字符串池、字符串拼接的真正代价、StringBuilder 的使用边界，以及文本块的缩进规则和 formatted；最后用 library 的凭证与报表代码展示什么时候该拼接、什么时候该换模板。</description></item><item><title>《Java 编程入门》15.1 java.time：日期、时刻与时区</title><link>https://plumephp.com/java-intro-15-1-java-time/</link><pubDate>Wed, 14 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-15-1-java-time/</guid><description>把 java.time 拆成日期、时刻、时区三层，用 library 的借期 14 天、续借、逾期罚金串起 LocalDate、Instant、ZonedDateTime、Duration、Period 与 DateTimeFormatter，并解释夏令时缺口、重叠时刻和 YYYY 与 yyyy 的真实差别。</description></item><item><title>《Java 编程入门》14.3 目录遍历与 WatchService</title><link>https://plumephp.com/java-intro-14-3-walk-and-watch/</link><pubDate>Wed, 14 Oct 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-14-3-walk-and-watch/</guid><description>从按年月归档的 CSV 目录出发，讲清 Files.walk 的 maxDepth 语义、Files.find 的属性过滤、walkFileTree 的访问者模式与 glob 匹配；再用 WatchService 监听 inbox，给出去抖、过滤临时文件、幂等导入和 key.reset 的完整做法。</description></item><item><title>《Java 编程入门》14.2 字节流、字符流与编码</title><link>https://plumephp.com/java-intro-14-2-streams-and-charset/</link><pubDate>Wed, 14 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-14-2-streams-and-charset/</guid><description>把 InputStream、Reader 与 Charset 的关系拆成三层：字节、字符、编码；用 library 的 CSV 读写演示显式 UTF-8、BOM 处理、严格解码与缓冲包装，并说明 PrintWriter 吞异常、默认字符集和二进制文本混用这三类常见故障。</description></item><item><title>《Java 编程入门》14.1 Path 与 Files：比 File 更完整的文件 API</title><link>https://plumephp.com/java-intro-14-1-path-and-files/</link><pubDate>Wed, 14 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-14-1-path-and-files/</guid><description>从 File 的布尔返回值讲起，说明 Path 如何表达路径、Files 如何完成读写与属性查询；用 library 的 CSV 落盘串起 resolve、relativize、createDirectories、临时文件与 ATOMIC_MOVE，并给出多进程下避免半个文件的写法与常见边界。</description></item><item><title>《Java 编程入门》13.3 异常转换与用户可见错误</title><link>https://plumephp.com/java-intro-13-3-exception-translation/</link><pubDate>Tue, 13 Oct 2026 22:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-13-3-exception-translation/</guid><description>从 CommandParser 解析失败和 exportLoans 的 IOException 出发，讲清技术异常、领域异常与用户可见错误的三层分工；再把 NumberFormatException 包装成 InvalidCommandException、在 CLI 边界统一映射 ErrorCode 与退出码，给出真实输出，并列出丢失 cause、重复记日志、吞异常等边界。</description></item><item><title>《Java 编程入门》13.2 try-with-resources 与关闭顺序</title><link>https://plumephp.com/java-intro-13-2-try-with-resources/</link><pubDate>Tue, 13 Oct 2026 21:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-13-2-try-with-resources/</guid><description>从手工 finally 关闭两个资源时异常互相覆盖的问题出发，讲清 AutoCloseable 的契约、try-with-resources 的逆序关闭和异常抑制机制；再把 AuditLog 与 LoanBatch 接到 library 的借阅审计和报表导出上，并给出资源未实现 AutoCloseable、close 抛异常、所有权误用等真实输出与边界。</description></item><item><title>《Java 编程入门》13.1 受检与非受检异常</title><link>https://plumephp.com/java-intro-13-1-checked-unchecked/</link><pubDate>Tue, 13 Oct 2026 20:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-13-1-checked-unchecked/</guid><description>从 borrow 可能失败的四种情况和 Thread.sleep 的编译错误出发，拆开 Throwable 家族里 Error、受检异常与 RuntimeException 的边界；再建立 LibraryException、ErrorCode 与四个领域异常，接到借阅规则上，并给出漏声明、捕获顺序、finally 吞异常的真实报错。</description></item><item><title>《Java 编程入门》12.3 Optional 与惰性求值</title><link>https://plumephp.com/java-intro-12-3-optional-lazy/</link><pubDate>Tue, 13 Oct 2026 16:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-12-3-optional-lazy/</guid><description>从 findById 返回 Optional 却总被 get() 的写法出发，讲清 Optional 的创建、map、flatMap、filter 与三种兜底方式，用计数器证明 orElse 会提前求值而 orElseGet 不会；再把 findBook、borrowerOf 和 CLI 查找落到 library，并演示 Stream.iterate 与 anyMatch 的短路。</description></item><item><title>《Java 编程入门》12.2 Stream 管道</title><link>https://plumephp.com/java-intro-12-2-stream-pipeline/</link><pubDate>Tue, 13 Oct 2026 15:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-12-2-stream-pipeline/</guid><description>从循环加临时列表的搜索、排序、统计代码出发，讲清 Stream 管道的源、中间操作与终止操作，说明惰性求值何时真正执行；再用 filter、map、sorted、groupingBy、summarizingInt 改造 library 的查询与统计，并给出流复用、不可变 toList、toMap 重复键的真实报错。</description></item><item><title>《Java 编程入门》12.1 Lambda 与函数式接口</title><link>https://plumephp.com/java-intro-12-1-lambda-functional-interface/</link><pubDate>Tue, 13 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-12-1-lambda-functional-interface/</guid><description>从匿名内部类写搜索条件的冗长代码出发，讲清函数式接口的唯一抽象方法、Lambda 的目标类型与方法引用四种写法，再说明变量捕获与 this 的差异；最后把 Predicate、BookFormatter、Supplier 用到 library 的搜索、格式化与异常延迟创建上，并给出编译错误与真实输出。</description></item><item><title>《Java 编程入门》11.3 类型擦除与运行时真相</title><link>https://plumephp.com/java-intro-11-3-type-erasure/</link><pubDate>Tue, 13 Oct 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-11-3-type-erasure/</guid><description>用 javap 和真实运行结果拆开类型擦除：List&lt;String&gt; 与 List&lt;Integer&gt; 为什么是同一个类、桥方法从哪来、new T() 和 instanceof List&lt;String&gt; 为什么被禁止；再讲 Class&lt;T&gt;、Supplier&lt;T&gt; 与匿名 TypeRef 三种在运行时恢复类型信息的办法，并落回 library 的泛型仓储。</description></item><item><title>《Java 编程入门》11.2 通配符与 PECS</title><link>https://plumephp.com/java-intro-11-2-wildcards-pecs/</link><pubDate>Tue, 13 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-11-2-wildcards-pecs/</guid><description>从 List&lt;Book&gt; 不能传给 List&lt;Object&gt; 的编译错误出发，解释泛型不变性与数组协变的区别，拆开 ? extends、? super 与 ? 的读写能力，再用 PECS 规则改造 library 的 maxBy、copyInto 和查询接口，最后给出通配符捕获与常见误用的真实报错。</description></item><item><title>《Java 编程入门》11.1 泛型类与方法</title><link>https://plumephp.com/java-intro-11-1-generic-classes-methods/</link><pubDate>Tue, 13 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-11-1-generic-classes-methods/</guid><description>从仓储接口重复实现和强制类型转换的真实问题出发，讲清泛型类、泛型方法与有界类型参数如何把类型检查前移到编译期；再把 Repository&lt;T, ID&gt; 与 Result&lt;T&gt; 落到 library 项目，给出可运行的注册图书代码，并列出原始类型、基本类型参数等常见错误的真实报错。</description></item><item><title>《Java 编程入门》10.3 遍历、排序与比较器</title><link>https://plumephp.com/java-intro-10-3-iteration-sorting/</link><pubDate>Mon, 12 Oct 2026 22:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-10-3-iteration-sorting/</guid><description>把 library 的图书列表按标题、年份、作者排序：讲清 for-each 背后的 Iterator、遍历中删除的正确写法、Comparable 与 Comparator 的分工、中文 Collator 排序，以及比较器溢出和不一致导致的 TreeSet 丢元素，并给出可复现的真实输出。</description></item><item><title>《Java 编程入门》10.2 复杂度与内存</title><link>https://plumephp.com/java-intro-10-2-complexity-and-memory/</link><pubDate>Mon, 12 Oct 2026 21:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-10-2-complexity-and-memory/</guid><description>用 2 万本书、5 千次查询的真实对比，解释 ArrayList 线性扫描与 HashMap 查找为什么差三个数量级；再讲扩容、负载因子、初始容量、作者索引的维护成本，以及装箱、对象头和集合视图带来的内存开销，给出 library 仓储的容量规划做法。</description></item><item><title>《Java 编程入门》10.1 List、Set、Map：三种容器的选择</title><link>https://plumephp.com/java-intro-10-1-collections-overview/</link><pubDate>Mon, 12 Oct 2026 20:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-10-1-collections-overview/</guid><description>从 library 仓储的三条查询出发，讲清 List、Set、Map 的契约差异、常见实现类的取舍，以及 equals/hashCode 为什么是放进 Set 和 Map 的门票；再把第 8 章的 ArrayList 仓储改成 Map 版，让 ISBN 查找、借阅状态和会员借阅列表各归其位。</description></item><item><title>《Java 编程入门》9.3 sealed 与模式匹配</title><link>https://plumephp.com/java-intro-09-3-sealed-and-patterns/</link><pubDate>Mon, 12 Oct 2026 16:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-09-3-sealed-and-patterns/</guid><description>把 library 的 CLI 从字符串命令和 if/else 改成 sealed Command 接口加记录子类型，再用 switch 模式匹配一次性解构、守卫和分发；讲清 permits 的限制、穷尽性检查、模式顺序与 null 分支，并给出非穷尽 switch 与未授权实现的真实编译错误。</description></item><item><title>《Java 编程入门》9.2 enum：把常量写成类型</title><link>https://plumephp.com/java-intro-09-2-enums/</link><pubDate>Mon, 12 Oct 2026 15:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-09-2-enums/</guid><description>把「BORROWED」「RETURNED」这类字符串常量换成 LoanStatus 枚举：用字段和方法承载展示名与开放状态，用 switch 表达式把状态迁移写穷尽，把续借、归还规则放进 Loan record，并用 ordinal、valueOf 与持久化的真实边界说明枚举该怎么用、不该怎么用。</description></item><item><title>《Java 编程入门》9.1 record：数据载体的最短写法</title><link>https://plumephp.com/java-intro-09-1-records/</link><pubDate>Mon, 12 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-09-1-records/</guid><description>把第 7 章手写的 Book、Member 换成 record：看编译器自动生成访问器、equals、hashCode 与 toString，用紧凑构造器保留校验，处理 record 不能被继承后 StaffMember 的迁移，并用可变组件共享引用、紧凑构造器直接赋字段、继承最终类三个真实边界说明 record 的限制。</description></item><item><title>《Java 编程入门》8.3 多态与动态分派</title><link>https://plumephp.com/java-intro-08-3-polymorphism-dispatch/</link><pubDate>Mon, 12 Oct 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-08-3-polymorphism-dispatch/</guid><description>从 LibraryService 只持有 LibraryRepository 接口却能调用到内存实现这件事出发，讲清编译时类型与运行时类型、invokevirtual 与 invokeinterface 的查找过程、字段隐藏和构造器调用可覆盖方法的陷阱，并用罚金策略与 javap 输出把动态分派落到可验证的代码上。</description></item><item><title>《Java 编程入门》8.2 接口、default 方法与抽象类</title><link>https://plumephp.com/java-intro-08-2-interfaces-default-methods/</link><pubDate>Mon, 12 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-08-2-interfaces-default-methods/</guid><description>把 library 的存储从 LibraryService 里抽出来：用 LibraryRepository 定义契约，用 InMemoryLibraryRepository 提供内存实现；再对比 default 方法、抽象类与模板方法，讲清三者各自解决什么问题、什么时候不该用，并给出接口实现、默认方法冲突与可见性收窄的真实编译错误。</description></item><item><title>《Java 编程入门》8.1 继承与 super：复用不是目的</title><link>https://plumephp.com/java-intro-08-1-inheritance-super/</link><pubDate>Mon, 12 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-08-1-inheritance-super/</guid><description>从 library 项目里「正式会员借 3 本、员工借 10 本」的差异出发，讲清 extends、super、构造器调用顺序、覆写规则与里氏替换；再用借阅期限、罚金计算和真实的编译错误，说明什么时候该用继承、什么时候该用组合，避免把复用当成继承的理由。</description></item><item><title>《Java 编程入门》7.3 封装与不可变</title><link>https://plumephp.com/java-intro-07-3-encapsulation-immutability/</link><pubDate>Sun, 11 Oct 2026 22:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-07-3-encapsulation-immutability/</guid><description>把 Book 和 Member 收成真正的不可变对象：private final 字段、无 setter、withX 返回新实例、List.copyOf 防御性复制；再把借出状态从 Book 移到 LibraryService 的 onLoan 集合，并用 List.copyOf 与 unmodifiableList 的真实差异说明「复制」和「视图」不是一回事。</description></item><item><title>《Java 编程入门》7.2 构造器、this 与初始化顺序</title><link>https://plumephp.com/java-intro-07-2-constructors-init-order/</link><pubDate>Sun, 11 Oct 2026 21:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-07-2-constructors-init-order/</guid><description>让 Book 从「字段袋子」变成「一创建就合法」的对象：讲清构造器的定义、重载与 this(...) 委托，final 字段的明确赋值，静态字段、实例字段、初始化块与构造器的执行顺序；再用 JDK 25 的灵活构造器体，把参数校验放到 this(...) 之前。</description></item><item><title>《Java 编程入门》7.1 类、字段与方法</title><link>https://plumephp.com/java-intro-07-1-class-basics/</link><pubDate>Sun, 11 Oct 2026 20:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-07-1-class-basics/</guid><description>回到 library 的领域对象：类把字段（状态）和方法（行为）放在一起，new 创建独立实例，this 指向当前接收者；再分清实例字段与静态字段、默认 toString/equals 的真实行为，以及字段默认值带来的静默错误，为 7.2 的构造器和 7.3 的封装打底。</description></item><item><title>《Java 编程入门》6.3 作用域、生命周期与栈帧</title><link>https://plumephp.com/java-intro-06-3-scope-and-stack-frame/</link><pubDate>Sun, 11 Oct 2026 16:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-06-3-scope-and-stack-frame/</guid><description>从 LibraryService.borrow 的局部变量讲起，分清作用域与生命周期：花括号决定名字能用到哪里，栈帧决定局部变量活到什么时候，可达性决定对象活到什么时候；再用 javap 的局部变量表、真实调用栈和 StackOverflowError 把这三件事对上。</description></item><item><title>《Java 编程入门》6.2 值传递的真相</title><link>https://plumephp.com/java-intro-06-2-pass-by-value/</link><pubDate>Sun, 11 Oct 2026 15:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-06-2-pass-by-value/</guid><description>用 library 的借书、还书和替换对象三个实验，讲清 Java 只有值传递：基本类型复制数值，对象复制引用；方法内重新赋值不影响调用方，通过引用修改对象却会影响。最后说明为什么返回内部 List 会泄漏状态，以及借还逻辑通过引用改 Book 时风险在哪。</description></item><item><title>《Java 编程入门》6.1 方法签名、重载与可变参数</title><link>https://plumephp.com/java-intro-06-1-methods-and-overload/</link><pubDate>Sun, 11 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-06-1-methods-and-overload/</guid><description>从 LibraryApp 越堆越多的职责出发，讲清方法签名的组成、重载解析的三道关（严格匹配、装箱、可变参数），以及可变参数背后的数组语义；最后拆出 LibraryService，用重载的 addBook 和 search 把 CLI 与业务逻辑分开。</description></item><item><title>《Java 编程入门》5.3 instanceof 模式匹配与守卫</title><link>https://plumephp.com/java-intro-05-3-pattern-matching-instanceof/</link><pubDate>Sun, 11 Oct 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-05-3-pattern-matching-instanceof/</guid><description>从 library 搜索参数的混合类型问题出发，讲清 instanceof 模式变量的流作用域、&amp;&amp; 右侧与提前返回后的作用范围，以及 switch 模式匹配里的 when 守卫和支配规则；最后用 parseValue 与 matches 把 year:2006、after:2006 这类过滤条件安全地落到 Book 字段上。</description></item><item><title>《Java 编程入门》5.2 switch 表达式与 yield</title><link>https://plumephp.com/java-intro-05-2-switch-expressions/</link><pubDate>Sun, 11 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-05-2-switch-expressions/</guid><description>从 5.1 留下的 if/else 命令链出发，拆开 switch 的冒号写法、箭头写法与表达式写法，讲清 fall-through、yield 的作用域和枚举穷尽性检查；再用 library 的 Command 枚举与 dispatch 方法，把命令分发写成一张编译器能检查的表。</description></item><item><title>《Java 编程入门》5.1 if、for、while：把流程写成可读的句子</title><link>https://plumephp.com/java-intro-05-1-control-flow/</link><pubDate>Sun, 11 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-05-1-control-flow/</guid><description>从 library 的 CLI 命令分发出发，讲清 if/else 链、卫语句、for 与 while 各自适合的场景；再用真实运行结果说明循环边界和边遍历边删除，并点出字符串比较中常见的三个坑，最后落到可运行的 LibraryApp 骨架。</description></item><item><title>《Java 编程入门》4.3 运算符、溢出与数值边界</title><link>https://plumephp.com/java-intro-04-3-operators-and-overflow/</link><pubDate>Sat, 10 Oct 2026 22:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-04-3-operators-and-overflow/</guid><description>从 library 的罚金计算出发，讲清整数除法、取模符号、类型提升、溢出与 Math.addExact 系列方法；再解释 0.1 + 0.2 为什么不等于 0.3、金额为什么用分而不是 double，最后用位运算表示借阅状态标志，并给出可复现的本机输出与边界检查清单。</description></item><item><title>《Java 编程入门》4.2 var、final 与类型推断</title><link>https://plumephp.com/java-intro-04-2-var-and-inference/</link><pubDate>Sat, 10 Oct 2026 21:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-04-2-var-and-inference/</guid><description>把 var 还原成编译期类型推断而不是动态类型：哪些位置能用、哪些位置编译失败、什么时候用 var 反而降低可读性；再讲 final 局部变量、static final 常量与「final 引用不等于不可变对象」的区别，并在 library 的 BookLabels 与 LoanPolicy 里落地。</description></item><item><title>《Java 编程入门》4.1 基本类型与包装类型</title><link>https://plumephp.com/java-intro-04-1-primitives-and-wrappers/</link><pubDate>Sat, 10 Oct 2026 20:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-04-1-primitives-and-wrappers/</guid><description>以 Book 的字段设计为线索，讲清八种基本类型的范围与默认值、什么时候该用 int 而不是 Integer、ISBN 为什么必须用 String；再拆开装箱拆箱、Integer 缓存、== 与 equals 的差异，用真实 NPE 和 128 比较结果说明包装类型最容易踩的三个坑。</description></item><item><title>《Java 编程入门》3.3 Maven 生命周期：compile、test、package</title><link>https://plumephp.com/java-intro-03-3-maven-lifecycle/</link><pubDate>Sat, 10 Oct 2026 16:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-03-3-maven-lifecycle/</guid><description>把 Maven 生命周期还原成一条可执行的流水线：validate、compile、test、package、verify、install、deploy 各自做什么，为什么 mvn package 会顺带跑测试，target 下每个目录从哪来；再用 library 工程实跑 compile、test、package，检查 jar 内容与 No tests to run 的真实输出。</description></item><item><title>《Java 编程入门》3.2 包、模块与可见性</title><link>https://plumephp.com/java-intro-03-2-packages-and-visibility/</link><pubDate>Sat, 10 Oct 2026 15:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-03-2-packages-and-visibility/</guid><description>把 library 拆成 com.plume.library 与 com.plume.library.cli 两个包，用 public、包私有、protected、private 四种可见性解释谁能看见谁，并用真实编译错误验证包私有边界；再对比 classpath 与 module path，给出 module-info.java 的 exports/requires 写法与卷一不启用模块的理由。</description></item><item><title>《Java 编程入门》3.1 Hello, Library：javac 与 java 的完整流程</title><link>https://plumephp.com/java-intro-03-1-hello-library/</link><pubDate>Sat, 10 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-03-1-hello-library/</guid><description>从零走完 Hello, Library 的完整链路：源码、javac -d、包目录、class 文件、java -cp 逐层拆解，解释 main 签名与 args 的来源；再用 javap 看字节码、用 --release 21 对比 class 文件版本，并给出文件名不匹配、缺少 main、类路径写错三类真实报错。</description></item><item><title>《Java 编程入门》2.3 IDE、JShell 与命令行</title><link>https://plumephp.com/java-intro-02-3-ide-jshell-cli/</link><pubDate>Sat, 10 Oct 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-02-3-ide-jshell-cli/</guid><description>把 IDE、JShell 与命令行放在同一套工作流里：用 JShell 快速验证表达式和 library 的字符串格式，用 javac/java 理解编译与运行的分工，再说明 IDE 导入 Maven 工程、指定 JDK 25 和避免提交 .idea 的具体做法，最后给出三套工具之间切换的检查清单。</description></item><item><title>《Java 编程入门》2.2 Maven 与标准目录结构</title><link>https://plumephp.com/java-intro-02-2-maven-layout/</link><pubDate>Sat, 10 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-02-2-maven-layout/</guid><description>把 library 从单文件 javac 推进到 Maven 工程：解释 groupId、artifactId、version 与标准目录结构，逐项拆开最小 pom.xml 里的 release 与编码配置，再用 mvn compile 验证 target/classes 的产物，并列出目录放错、POM 缺失、编码未设三类常见故障。</description></item><item><title>《Java 编程入门》2.1 安装 JDK 25：Temurin、PATH 与 JAVA_HOME</title><link>https://plumephp.com/java-intro-02-1-install-jdk25/</link><pubDate>Sat, 10 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-02-1-install-jdk25/</guid><description>从 Temurin 25.0.5 的安装包选择讲起，说明 PATH 与 JAVA_HOME 各自影响哪个环节，如何在 macOS、Linux、Windows 上验证 java 与 javac 指向同一个 JDK；再在 library 工程里写一个 EnvironmentProbe，把版本、java.home 与编码打印出来，避开多 JDK 环境最常见的错配。</description></item><item><title>《Java 编程入门》1.3 JVM、JRE、JDK 与字节码</title><link>https://plumephp.com/java-intro-01-3-jvm-jre-jdk/</link><pubDate>Fri, 09 Oct 2026 20:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-01-3-jvm-jre-jdk/</guid><description>把 JDK、JRE、JVM 三个常被混用的概念拆开：JDK 里到底有什么、JRE 为什么从 JDK 11 起不再单独分发、JVM 的类加载器与运行时数据区各管什么；再用 javap、class 文件头和真实报错，把字节码结构、解释执行与 JIT 编译、常见类加载错误串起来。</description></item><item><title>《Java 编程入门》1.2 JDK 25 LTS 与版本节奏</title><link>https://plumephp.com/java-intro-01-2-version-cadence/</link><pubDate>Fri, 09 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-01-2-version-cadence/</guid><description>把 Java 的发布节奏还原成一张可执行的选型表：六个月一个特性版本、两年一个 LTS，版本号每一段代表什么，JDK 21、25、27 各自适合谁；再给出用 --release 锁定目标版本、用 Maven Toolchains 固定构建 JDK、用 jdeps 检查依赖的落地做法。</description></item><item><title>《Java 编程入门》1.1 Java 解决了什么问题</title><link>https://plumephp.com/java-intro-01-1-why-java/</link><pubDate>Fri, 09 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-01-1-why-java/</guid><description>从 library 项目「换台电脑就跑不起来」的真实问题出发，讲清字节码与 JVM 如何提供跨平台能力，以及这套机制在版本、原生库、编码与时区上的真实边界；再把 Java 的生态、工具链、向后兼容和启动、内存、样板代码的代价放在一起，帮读者判断它是否适合自己的项目。</description></item><item><title>《Java 编程入门》目录</title><link>https://plumephp.com/java-intro-toc/</link><pubDate>Thu, 08 Oct 2026 12:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-toc/</guid><description>《Java 编程入门》全书导航页：说明本书定位、读者画像与前置知识，给出零基础、有语言基础、查漏补缺三条学习路径与八周计划，并按六个部分列出 18 章 54 节的完整章节索引，另含序、前言、附录 A–D 与常见问题速查，每一节都配一句话说明，方便按需定位与跳读。</description></item><item><title>《Java 编程入门》前言</title><link>https://plumephp.com/java-intro-preface/</link><pubDate>Thu, 08 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-preface/</guid><description>交代本书的读者对象、前置知识、六部分结构与章节依赖，列出 JDK 25、Maven 和终端的环境清单与真实版本输出，说明代码、输出、省略号和命令的书写约定，以及三种阅读路径、验证代码的具体方法、版本不一致时的排查顺序与本书刻意不覆盖的范围。</description></item><item><title>《Java 编程入门》序</title><link>https://plumephp.com/java-intro-foreword/</link><pubDate>Thu, 08 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-intro-foreword/</guid><description>说明这套 Java 四卷本为什么从语言与平台写起、为什么用 library 项目贯穿、为什么选 JDK 25 LTS 作主线，以及它与本站《Spring Boot》三部曲和 Java 专题的分工；也交代本书刻意不写的内容、验证方式，以及四卷本各自的边界。</description></item></channel></rss>