使用说明:让大脑真正学会 Java

建立主动预测、运行、解释和纠错的学习回路,并锁定 Java 17 工具边界。覆盖8个核心目录节点,并通过对象/执行图、参数实验和失败证据复核。

为什么“使用说明:让大脑真正学会 Java”必须从可运行证据开始

建立主动预测、运行、解释和纠错的学习回路,并锁定 Java 17 工具边界。本页属于正式单元,目标不是复制原书正文、插图或趣味题,而是依照 O'Reilly 官方第3版完整目录,把核心标题重构为预测、代码、对象图、失败注入和验收工件。正式节点共8个,最终产物是学习合同、JDK 17 环境证据与错题回放记录。

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;涉及当前安全建议、平台兼容和生产库选型时,仍需另查对应版本的官方文档。

五个贯穿全书的术语

、、、、。

静态类型限制调用端能说什么,运行时类型决定多态时谁执行;对象合同约束状态,运行证据检验解释,最小反例则防止把单次成功扩张成普遍规律。五者应出现在代码、图和测试的同一版本中。

四个可复算指标

目录覆盖率只说明核心标题是否有落点:

Ctoc=NcoveredNofficialC_{toc}=\frac{N_{covered}}{N_{official}}

验证覆盖必须同时覆盖正常、边界与失败状态:

Cevidence=Nobserved state× pathNplanned state× pathC_{evidence}=\frac{N_{observed\ state\times\ path}}{N_{planned\ state\times\ path}}

一次实验的总成本包含编译、执行、观察和解释:

Texperiment=Tcompile+Trun+Tobserve+TexplainT_{experiment}=T_{compile}+T_{run}+T_{observe}+T_{explain}

回归风险按受影响合同、未覆盖路径与共享状态修正:

Rregression=Icontract×(1Cevidence)×(1+Sshared)R_{regression}=I_{contract}\times(1-C_{evidence})\times(1+S_{shared})

这些式子用于暴露遗漏,不是能力证明。覆盖率达到100%仍可能只有表面复述;时间更短也可能是跳过验证。必须保留分项、输入和失败样本,不能只报告一个总数。

Who is this book for?

核心目录节点 1/8。 先写出该标题要回答的运行时问题、输入状态和可观察输出,再预测编译结果与执行结果;预测必须先于运行,避免事后解释。 “Who is this book for?”必须服务于“建立主动预测、运行、解释和纠错的学习回路,并锁定 Java 17 工具边界”,并在“学习合同、JDK 17 环境证据与错题回放记录”中留下可检查位置。

本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“只阅读答案而不先预测,或环境并非 JDK 17 却把版本差异误判成概念错误”,就退回模型或合同层修复,不用增加日志掩盖根因。

Who should probably back away from this book?

核心目录节点 2/8。 把概念落到对象、引用、类型、调用栈或资源生命周期图上;每条箭头都要说明谁拥有状态、谁能修改以及何时失效。 “Who should probably back away from this book?”必须服务于“建立主动预测、运行、解释和纠错的学习回路,并锁定 Java 17 工具边界”,并在“学习合同、JDK 17 环境证据与错题回放记录”中留下可检查位置。

本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“只阅读答案而不先预测,或环境并非 JDK 17 却把版本差异误判成概念错误”,就退回模型或合同层修复,不用增加日志掩盖根因。

We know what you are thinking

核心目录节点 3/8。 给出一个最小正常样例和一个只改变单一条件的反例,比较编译诊断、异常类型、输出顺序或状态快照,而不是只说‘会出错’。 “We know what you are thinking”必须服务于“建立主动预测、运行、解释和纠错的学习回路,并锁定 Java 17 工具边界”,并在“学习合同、JDK 17 环境证据与错题回放记录”中留下可检查位置。

本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“只阅读答案而不先预测,或环境并非 JDK 17 却把版本差异误判成概念错误”,就退回模型或合同层修复,不用增加日志掩盖根因。

Metacognition: thinking about thinking

核心目录节点 4/8。 用 API 合同核对参数、返回值、可变性、线程安全和关闭责任;示例能够运行不代表对空值、极值、重复调用或并发调度成立。 “Metacognition: thinking about thinking”必须服务于“建立主动预测、运行、解释和纠错的学习回路,并锁定 Java 17 工具边界”,并在“学习合同、JDK 17 环境证据与错题回放记录”中留下可检查位置。

本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“只阅读答案而不先预测,或环境并非 JDK 17 却把版本差异误判成概念错误”,就退回模型或合同层修复,不用增加日志掩盖根因。

Here is what WE did

核心目录节点 5/8。 把结论写成可由另一位学习者复现的证据:JDK 版本、完整命令、最小代码、实际输出、期望输出和差异解释缺一不可。 “Here is what WE did”必须服务于“建立主动预测、运行、解释和纠错的学习回路,并锁定 Java 17 工具边界”,并在“学习合同、JDK 17 环境证据与错题回放记录”中留下可检查位置。

本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“只阅读答案而不先预测,或环境并非 JDK 17 却把版本差异误判成概念错误”,就退回模型或合同层修复,不用增加日志掩盖根因。

Here is what YOU can do to bend your brain into submission

核心目录节点 6/8。 最后问这个节点怎样约束本单元工件;若解释不能改变设计、测试或调试决策,就仍停留在术语记忆层。 “Here is what YOU can do to bend your brain into submission”必须服务于“建立主动预测、运行、解释和纠错的学习回路,并锁定 Java 17 工具边界”,并在“学习合同、JDK 17 环境证据与错题回放记录”中留下可检查位置。

本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“只阅读答案而不先预测,或环境并非 JDK 17 却把版本差异误判成概念错误”,就退回模型或合同层修复,不用增加日志掩盖根因。

What you need for this book

核心目录节点 7/8。 先写出该标题要回答的运行时问题、输入状态和可观察输出,再预测编译结果与执行结果;预测必须先于运行,避免事后解释。 “What you need for this book”必须服务于“建立主动预测、运行、解释和纠错的学习回路,并锁定 Java 17 工具边界”,并在“学习合同、JDK 17 环境证据与错题回放记录”中留下可检查位置。

本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“只阅读答案而不先预测,或环境并非 JDK 17 却把版本差异误判成概念错误”,就退回模型或合同层修复,不用增加日志掩盖根因。

Last-minute things you need to know

核心目录节点 8/8。 把概念落到对象、引用、类型、调用栈或资源生命周期图上;每条箭头都要说明谁拥有状态、谁能修改以及何时失效。 “Last-minute things you need to know”必须服务于“建立主动预测、运行、解释和纠错的学习回路,并锁定 Java 17 工具边界”,并在“学习合同、JDK 17 环境证据与错题回放记录”中留下可检查位置。

本节点至少执行一次正常路径、一次边界路径和一次失败路径。记录静态类型与运行时对象是否一致、状态由谁拥有、异常或返回值怎样传播,以及结果能否由冻结输入重复获得;若出现“只阅读答案而不先预测,或环境并非 JDK 17 却把版本差异误判成概念错误”,就退回模型或合同层修复,不用增加日志掩盖根因。

把目录节点变成可维护 Java 工件

先建立最小项目,只保留一个生产类、一个测试类和一条确定的启动命令。每次实验先写预测,再冻结输入并运行;输出必须同时包含关键状态,而非只有“成功”。若结论涉及对象身份,就记录引用别名;涉及集合,就记录顺序、重复和相等性;涉及 I/O 或线程,就记录获取、使用、关闭和超时。

本单元的最小实现围绕“建立主动预测、运行、解释和纠错的学习回路,并锁定 Java 17 工具边界”:

record LearningEvidence(String prediction, String command, String observation) {}
 
var firstRun = new LearningEvidence(
    "编译成功并输出 17",
    "java --version",
    System.getProperty("java.version")
);
System.out.println(firstRun);

不要把样例输出当作测试。测试要固定合同和反例,并让失败信息指出哪条承诺被破坏:

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: How to Use This Book: Intro
  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,输出值、顺序、总工作量与协调成本分别怎样变化?然后一次只改变一个输入,记录编译诊断、运行输出、异常、线程名和状态快照。观察不符合预测时,先列出静态类型、运行时类型、共享状态、资源生命周期和调度五类替代解释,再修改代码。

三类高频误区

本章回顾

“使用说明:让大脑真正学会 Java”的核心不是记住更多 API,而是把“建立主动预测、运行、解释和纠错的学习回路,并锁定 Java 17 工具边界”转成可运行、可解释、可推翻的对象合同。完整证据链应留下预测、静态类型、运行时对象、命令、输出、边界、反例和修复决议;缺少任何一环,都不能证明该目录节点已经掌握。

讨论

评论区加载中…