《Head First Java(第3版)》权威学习地图
沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链。覆盖21个核心目录节点,并通过对象/执行图、参数实验和失败证据复核。
为什么“《Head First Java(第3版)》权威学习地图”必须从可运行证据开始
沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链。本页属于学习地图,目标不是复制原书正文、插图或趣味题,而是依照 O'Reilly 官方第3版完整目录,把核心标题重构为预测、代码、对象图、失败注入和验收工件。正式节点共21个,最终产物是21单元路线、406个核心目录节点覆盖表与全书运行证据档案。
Java 程序同时存在源代码、编译期类型、字节码、运行时对象、调用栈、线程和外部资源七种观察面。只看最终输出,可能把引用别名、异常传播、惰性求值或竞态隐藏起来;只背语言规则,又无法证明自己能在真实程序中定位状态。因此每个结论都要同时回答“编译器允许什么”“运行时发生什么”“证据怎样复现”。
版次坐标与边界
本课程采用 Kathy Sierra、Bert Bates、Trisha Gee 的 Head First Java, 3rd Edition,O'Reilly Media,2022年5月,754页,ISBN 9781492091646。O'Reilly 官方书目页和 “Table of Contents (the real thing)” 确认其面向 Java 17 的使用说明、18章与附录 A/B,共21个正式教学单元;课程逐项覆盖406个核心目录标题,另设学习地图和总复习,共23页。
目录忠实不等于逐字复制。这里保留知识顺序和概念边界,中文解释、代码、图解、公式与练习均为独立教学重构。JDK 后续版本可能增加语法或 API,但本课程的可执行基线固定为 Java 17;涉及当前安全建议、平台兼容和生产库选型时,仍需另查对应版本的官方文档。
五个贯穿全书的术语
、、、、。
静态类型限制调用端能说什么,运行时类型决定多态时谁执行;对象合同约束状态,运行证据检验解释,最小反例则防止把单次成功扩张成普遍规律。五者应出现在代码、图和测试的同一版本中。
四个可复算指标
目录覆盖率只说明核心标题是否有落点:
验证覆盖必须同时覆盖正常、边界与失败状态:
一次实验的总成本包含编译、执行、观察和解释:
回归风险按受影响合同、未覆盖路径与共享状态修正:
这些式子用于暴露遗漏,不是能力证明。覆盖率达到100%仍可能只有表面复述;时间更短也可能是跳过验证。必须保留分项、输入和失败样本,不能只报告一个总数。
How to Use This Book: Intro
核心目录节点 1/21。 先写出该标题要回答的运行时问题、输入状态和可观察输出,再预测编译结果与执行结果;预测必须先于运行,避免事后解释。 “How to Use This Book: Intro”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
1. Breaking the Surface: Dive In: A Quick Dip
核心目录节点 2/21。 把概念落到对象、引用、类型、调用栈或资源生命周期图上;每条箭头都要说明谁拥有状态、谁能修改以及何时失效。 “1. Breaking the Surface: Dive In: A Quick Dip”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
2. A Trip to Objectville: Classes and Objects
核心目录节点 3/21。 给出一个最小正常样例和一个只改变单一条件的反例,比较编译诊断、异常类型、输出顺序或状态快照,而不是只说‘会出错’。 “2. A Trip to Objectville: Classes and Objects”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
3. Know Your Variables: Primitives and References
核心目录节点 4/21。 用 API 合同核对参数、返回值、可变性、线程安全和关闭责任;示例能够运行不代表对空值、极值、重复调用或并发调度成立。 “3. Know Your Variables: Primitives and References”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
4. How Objects Behave: Methods Use Instance Variables
核心目录节点 5/21。 把结论写成可由另一位学习者复现的证据:JDK 版本、完整命令、最小代码、实际输出、期望输出和差异解释缺一不可。 “4. How Objects Behave: Methods Use Instance Variables”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
5. Extra-Strength Methods: Writing A Program
核心目录节点 6/21。 最后问这个节点怎样约束本单元工件;若解释不能改变设计、测试或调试决策,就仍停留在术语记忆层。 “5. Extra-Strength Methods: Writing A Program”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
6. Using the Java Library: Get to Know the Java API
核心目录节点 7/21。 先写出该标题要回答的运行时问题、输入状态和可观察输出,再预测编译结果与执行结果;预测必须先于运行,避免事后解释。 “6. Using the Java Library: Get to Know the Java API”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
7. Better Living in Objectville: Inheritance and Polymorphism
核心目录节点 8/21。 把概念落到对象、引用、类型、调用栈或资源生命周期图上;每条箭头都要说明谁拥有状态、谁能修改以及何时失效。 “7. Better Living in Objectville: Inheritance and Polymorphism”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
8. Serious Polymorphism: Interfaces and Abstract Classes
核心目录节点 9/21。 给出一个最小正常样例和一个只改变单一条件的反例,比较编译诊断、异常类型、输出顺序或状态快照,而不是只说‘会出错’。 “8. Serious Polymorphism: Interfaces and Abstract Classes”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
9. Life and Death of an Object: Constructors and Garbage Collection
核心目录节点 10/21。 用 API 合同核对参数、返回值、可变性、线程安全和关闭责任;示例能够运行不代表对空值、极值、重复调用或并发调度成立。 “9. Life and Death of an Object: Constructors and Garbage Collection”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
10. Numbers Matter: Numbers and Statics
核心目录节点 11/21。 把结论写成可由另一位学习者复现的证据:JDK 版本、完整命令、最小代码、实际输出、期望输出和差异解释缺一不可。 “10. Numbers Matter: Numbers and Statics”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
11. Data Structures: Collections and Generics
核心目录节点 12/21。 最后问这个节点怎样约束本单元工件;若解释不能改变设计、测试或调试决策,就仍停留在术语记忆层。 “11. Data Structures: Collections and Generics”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
12. Lambdas and Streams: What, Not How
核心目录节点 13/21。 先写出该标题要回答的运行时问题、输入状态和可观察输出,再预测编译结果与执行结果;预测必须先于运行,避免事后解释。 “12. Lambdas and Streams: What, Not How”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
13. Risky Behavior: Exception Handling
核心目录节点 14/21。 把概念落到对象、引用、类型、调用栈或资源生命周期图上;每条箭头都要说明谁拥有状态、谁能修改以及何时失效。 “13. Risky Behavior: Exception Handling”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
14. A Very Graphic Story: Getting Gui
核心目录节点 15/21。 给出一个最小正常样例和一个只改变单一条件的反例,比较编译诊断、异常类型、输出顺序或状态快照,而不是只说‘会出错’。 “14. A Very Graphic Story: Getting Gui”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
15. Work on Your Swing: Using Swing
核心目录节点 16/21。 用 API 合同核对参数、返回值、可变性、线程安全和关闭责任;示例能够运行不代表对空值、极值、重复调用或并发调度成立。 “15. Work on Your Swing: Using Swing”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
16. Saving Objects (and Text): Serialization and File I/O
核心目录节点 17/21。 把结论写成可由另一位学习者复现的证据:JDK 版本、完整命令、最小代码、实际输出、期望输出和差异解释缺一不可。 “16. Saving Objects (and Text): Serialization and File I/O”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
17. Make a Connection: Networking and Threads
核心目录节点 18/21。 最后问这个节点怎样约束本单元工件;若解释不能改变设计、测试或调试决策,就仍停留在术语记忆层。 “17. Make a Connection: Networking and Threads”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
18. Dealing with Concurrency Issues: Race Conditions and Immutable Data
核心目录节点 19/21。 先写出该标题要回答的运行时问题、输入状态和可观察输出,再预测编译结果与执行结果;预测必须先于运行,避免事后解释。 “18. Dealing with Concurrency Issues: Race Conditions and Immutable Data”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
A. Final Code Kitchen
核心目录节点 20/21。 把概念落到对象、引用、类型、调用栈或资源生命周期图上;每条箭头都要说明谁拥有状态、谁能修改以及何时失效。 “A. Final Code Kitchen”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
B. The top ten-ish topics that did not make it into the rest of the book
核心目录节点 21/21。 给出一个最小正常样例和一个只改变单一条件的反例,比较编译诊断、异常类型、输出顺序或状态快照,而不是只说‘会出错’。 “B. The top ten-ish topics that did not make it into the rest of the book”必须服务于“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”,并在“21单元路线、406个核心目录节点覆盖表与全书运行证据档案”中留下可检查位置。
本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“按旧版八个主题跳读,遗漏构造/GC、异常、序列化、Lambda/Stream 和并发正确性”,就退回模型或合同层修复,不用增加日志掩盖根因。
把目录节点变成可维护 Java 工件
先建立最小项目,只保留一个生产类、一个测试类和一条确定的启动命令。每次实验先写预测,再冻结输入并运行;输出必须同时包含关键状态,而非只有“成功”。若结论涉及对象身份,就记录引用别名;涉及集合,就记录顺序、重复和相等性;涉及 I/O 或线程,就记录获取、使用、关闭和超时。
本单元的最小实现围绕“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”:
record UnitGate(String id, boolean compiled, boolean tested, boolean explained) {
boolean passed() { return compiled && tested && explained; }
}
var gate = new UnitGate("chapter-01", true, true, true);
System.out.println(gate.passed());不要把样例输出当作测试。测试要固定合同和反例,并让失败信息指出哪条承诺被破坏:
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
class UnitContractTest {
@Test void normalBoundaryAndCounterexampleStayVisible() {
var observed = java.util.List.of("normal", "boundary", "counterexample");
assertAll(
() -> assertEquals(3, observed.size()),
() -> assertTrue(observed.contains("boundary")),
() -> assertThrows(NumberFormatException.class, () -> Integer.parseInt("NaN"))
);
}
}验收记录要绑定环境和命令;“在我机器上能跑”不具备交接价值:
Feature: Head First Java, 3rd Edition: Official Learning Map
Scenario: another learner reproduces the contract
Given JDK 17 and the frozen source revision
When the learner compiles, runs, and injects the documented boundary
Then the actual type, output, exception, and state match the prediction
And the evidence explains any ordering or ownership assumption先预测再运行
先预测:若把对象数从4增到16、操作量从12增到36、工作线程从1增到6,输出值、顺序、总工作量与协调成本分别怎样变化?然后一次只改变一个输入,记录编译诊断、运行输出、异常、线程名和状态快照。观察不符合预测时,先列出静态类型、运行时类型、共享状态、资源生命周期和调度五类替代解释,再修改代码。
三类高频误区
本章回顾
“《Head First Java(第3版)》权威学习地图”的核心不是记住更多 API,而是把“沿对象模型、类库、函数式数据处理、GUI、I/O、网络与并发建立完整 Java 17 能力链”转成可运行、可解释、可推翻的对象合同。完整证据链应留下预测、静态类型、运行时对象、命令、输出、边界、反例和修复决议;缺少任何一环,都不能证明该目录节点已经掌握。