这本书写给谁
这本书写给三类人。
第一类:会别的语言,但没系统学过 Java。 你可能写 Python、JavaScript、Go,能看懂类和对象,但 Java 的类型系统、泛型、受检异常、集合框架让你觉得别扭。这本书从工具链开始,把 Java 的「默认习惯」一条条讲清楚,而不是假设你已经知道。
第二类:学过 Java 语法,但没写过完整项目。 你能写 for 循环、能看懂 class,但面对一个空目录时不知道先建什么文件、pom.xml 怎么写、包怎么分、测试放哪里。这本书用一个贯穿项目把这些「工程动作」串起来。
第三类:从 C/C++ 转过来。 你熟悉内存和指针,但 Java 的引用语义、垃圾回收、泛型擦除、受检异常会让你不断踩坑。书里会专门标注这些「看起来像 C++、其实不一样」的地方。
如果你完全没写过代码,这本书的节奏可能偏快。建议先补一门语言的变量、循环、函数和数组,再回来读。
前置知识
只需要两件事:
- 会用命令行。 知道
cd、ls、mkdir,知道什么是环境变量,能看懂command not found和No such file or directory。 - 写过至少一门语言的完整程序。 知道函数、数组、循环、条件判断,最好写过一个几百行的脚本或小项目。
不需要提前会 Maven、Git、Linux 或 Spring。Maven 在第 2、3 章讲,Git 不在本书范围,Linux 只在部署相关章节出现。
本书结构
全书 61 篇,分六个部分:
| 部分 | 章节 | 解决的问题 |
|---|---|---|
| 一、起步 | 1–3 | Java 是什么、工具链怎么装、第一个程序怎么跑 |
| 二、语言基础 | 4–6 | 类型、控制流、方法,能写命令分发 |
| 三、面向对象 | 7–9 | 类、接口、record、enum、sealed,能表达领域模型 |
| 四、集合与泛型 | 10–12 | 容器、泛型、Stream,能做搜索与统计 |
| 五、异常、IO 与常用库 | 13–15 | 错误处理、文件读写、时间与正则 |
| 六、工程与交付 | 16–18 | 测试、打包、完整项目 |
章节之间有依赖,具体关系写在目录篇的「六个部分之间的依赖关系」里。简单说:第 8 章之前是语法,第 10 章之后开始拼装,第 18 章是总装。 跳章可以,但不要跳过第 8、9、10、13 章直接看第 18 章。
环境清单
本书的写作与验证环境:
| 项 | 版本 | 说明 |
|---|---|---|
| 操作系统 | macOS 26.3(arm64) | Linux 上命令基本一致;Windows 需替换路径分隔符 |
| JDK | Temurin 25.0.5+8(LTS) | JAVA_HOME=~/.jdks/jdk-25.0.5+8/Contents/Home |
| Maven | 3.9.12 | mvn -version 应显示 Java 25 |
| 终端 | zsh | bash 也可,环境变量写法相同 |
| 编码 | UTF-8 | JDK 18 起默认 UTF-8,但仍建议显式指定 |
检查命令:
java -version
javac -version
mvn -version
本机真实输出(节选):
openjdk version "25.0.5" 2026-10-20 LTS
OpenJDK Runtime Environment Temurin-25.0.5+8 (build 25.0.5+8-LTS)
OpenJDK 64-Bit Server VM Temurin-25.0.5+8 (build 25.0.5+8-LTS, mixed mode, sharing)
javac 25.0.5
Apache Maven 3.9.12
Java version: 25.0.5, vendor: Eclipse Adoptium, runtime: /Users/bingrong.yan/.jdks/jdk-25.0.5+8/Contents/Home
三条命令都要能跑通,并且 mvn -version 里的 Java version 要和 java -version 一致。不一致时,先检查 JAVA_HOME 和 PATH,不要急着往下读。
安装 JDK 25
macOS 用 Homebrew:
brew install --cask temurin@25
或者从 Adoptium 下载 tar.gz,解压到用户目录:
mkdir -p ~/.jdks
curl -L -o /tmp/temurin25.tar.gz \
"https://api.adoptium.net/v3/binary/latest/25/ga/mac/aarch64/jdk/hotspot/normal/eclipse"
tar -xzf /tmp/temurin25.tar.gz -C ~/.jdks
解压后把 JAVA_HOME 指向 Contents/Home。Linux 用对应的 linux/x64 或 linux/aarch64 包;Windows 用 .zip 并设置系统环境变量。
安装 Maven
macOS:
brew install maven
或者下载二进制包,解压后把 bin 加进 PATH。Maven 本身不绑定 JDK,它用 JAVA_HOME 指向的 JDK 运行;所以先装 JDK,再装 Maven。
代码约定
包名。 贯穿项目用 com.plume.library。书中片段如果只展示一个类,可能省略包声明;完整示例会写全。
类名。 领域对象用名词(Book、Member、Loan),服务用 XxxService,仓储用 XxxRepository,异常用 XxxException。接口和实现分开命名:LibraryRepository 是接口,InMemoryLibraryRepository 是实现。
文件名。 一个公开类一个文件,文件名与类名一致。这是 Java 的硬性要求,不是风格建议。
代码块。 完整可编译的代码会标 java;命令行标 bash;终端输出标 text;pom.xml 标 xml;SQL 标 sql。代码块里的 ... 表示省略,直接复制会编译失败。
输出。 代码块之后紧跟的 text 块是真实输出;如果是为了说明结构而简化的,会在前文写「示意」。不要把示意输出当成实测结果,两者的可信度不同。
异常。 书中的异常栈只保留关键行,用 ... 省略框架内部帧。完整栈在你自己的机器上可能更长。
版本标注。 凡是 JDK 21 与 25 行为不同的地方,会写成「JDK 21:……;JDK 25:……」。没有标注的,表示两个版本行为一致。
怎么验证代码
三个层次,按需要选择。
单文件:javac + java
适合一个完整类:
javac -d /tmp/java_check LibraryApp.java
java -cp /tmp/java_check LibraryApp
-d 指定输出目录,避免 .class 散落在源码旁边。类有包声明时,java 要写全限定名:
java -cp /tmp/java_check com.plume.library.LibraryApp
片段:jshell
适合验证一两行表达式或一个小方法:
jshell
jshell> List.of(3, 1, 2).stream().sorted().toList()
$1 ==> [1, 2, 3]
jshell 不需要 main,也不需要建文件,但它的片段是语句级的,不能验证包结构和模块。
工程:mvn test
适合验证整个项目:
mvn -q test
-q 只输出错误和测试摘要。想看完整生命周期,去掉 -q。第一次运行会下载依赖,之后会用本地缓存。
三种阅读路径
系统学(约 8 周)。 按 1→18 章顺序读,每周 2–3 章,每章代码手敲一遍。第 8 周把 library 重写一遍,不看答案。
快速过(约 3 周)。 第 1–3 章用两天跑通工具链;第 4–6 章只读小结和示例;第 7–12 章正常读;第 13–18 章重点跟项目。适合已经会一门语言、要在一两周内接手 Java 项目的人。
查漏补缺(按需)。 直接看目录篇的章节表,按关键词跳。每节末尾有小结和前后导航,跳读不会迷路。高频入口:泛型看第 11 章,集合看第 10 章,异常看第 13 章,测试看第 16 章,打包看第 17 章。
关于版本与错误
本书以 JDK 25 LTS 为主线,JDK 21 LTS 为对照。JDK 26、27 是特性版本,书中只在附录 C 提到,不作为主线。
如果你在 JDK 21 上运行卷一代码,绝大多数示例可以直接跑;用到 25 独有语法的地方会标注。编译目标默认 21,pom.xml 里通过 maven.compiler.release 固定。
书中难免有错误。发现代码跑不通时,按这个顺序排查:
- 确认
java -version、javac -version、mvn -version三者一致。 - 确认代码块里的
...已经替换成真实内容。 - 看本节末尾的「常见错误」和附录 D。
- 用
jshell把可疑片段单独跑一遍,缩小范围。 - 还不行,就把完整报错和最小复现代码记下来,再查官方文档。
Java 的报错信息通常很具体,尤其是编译错误:它会告诉你文件、行号、符号和期望类型。先读报错,再改代码,比凭感觉试错快得多。
从哪开始
如果你已经装好 JDK 25 和 Maven,直接跳到第 1 章;如果还没装,先按上面的环境清单做完。第 1 章不讲语法,讲 Java 为什么存在、跨平台的边界在哪——这些背景会帮你理解后面很多「为什么要这样设计」。
准备好了,就从 1.1 Java 解决了什么问题 开始。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。