《Java 编程入门》序

说明这套 Java 四卷本为什么从语言与平台写起、为什么用 library 项目贯穿、为什么选 JDK 25 LTS 作主线,以及它与本站《Spring Boot》三部曲和 Java 专题的分工;也交代本书刻意不写的内容、验证方式,以及四卷本各自的边界。

为什么又写一套 Java 书

本站已经有《Spring Boot 入门》《Spring Boot 实战》《Spring Boot 高级》三部曲,共 150 篇;也有 java 与 java-enterprise 两个专题,约 90 篇单点文章。按数量算,Java 相关内容并不少。那为什么还要再写四卷?

因为现有内容解决的是另外两个问题。

Spring Boot 三部曲回答的是:用框架怎么把一个服务搭起来。 它从自动配置讲到事务、安全、可观测性,读者跟着做,能交付一个能跑的服务。但它默认你已经会 Java:知道泛型怎么写、异常怎么设计、集合怎么选、测试怎么拆。这些默认,恰恰是很多读者卡住的地方。

Java 专题回答的是:某个点到底怎么回事。 JUC 的 AQS、G1 的 Region、JFR 的事件模型,每一篇都往深里钻。但它们假设你已经有一个完整的语言地基,否则读起来像在补天花板。

中间缺的那一层,是「按顺序、带项目、从零把一个 Java 程序写对」。这套四卷本就是补这一层。

一个常见的困境

我见过不少这样的开发者:能用 Spring Boot 把接口写出来,能照着教程配好 MyBatis 和 Redis,但一旦遇到下面这些问题,就不知道从哪下手——

  • 两个 List 明明内容一样,equals 却返回 false,因为元素类型没写 equals。
  • 一个 HashMap 在并发下偶尔丢数据,不知道是 HashMap 的问题还是自己的问题。
  • 服务启动慢,不知道是类加载、JIT 还是 GC,只能加内存。
  • 测试写不下去,因为业务逻辑全堆在 Controller 里,离不开数据库。
  • 打包出来的 jar 在服务器上跑不起来,报 NoClassDefFoundError,只能把依赖全塞进去碰运气。

这些问题不是框架能替你解决的,它们属于语言、标准库和运行时。框架越方便,越容易掩盖地基的空洞。 这套书的目标,就是把地基补上。

为什么用 library 贯穿

大多数 Java 入门书用「员工管理」「订单系统」做例子,每个章节换一个,彼此不相干。这样讲语法很方便,但读者学完一章,不知道这一章在真实项目里对应什么位置。

本书换了一个做法:四卷共享一个项目 library(图书借阅系统)。

  • 卷一:library 是一个命令行程序,用内存存储,只用 JDK 标准库。
  • 卷二:它长成 libraryd HTTP 服务,引入 JDBC、连接池、JSON、日志和容器化。
  • 卷三:把它的仓储、校验、并发部分拆开,用反射、注解、虚拟线程重写。
  • 卷四:用 JFR、GC 日志、堆转储分析同一个服务的运行时行为。

这样做的好处是,每个语法点都有落点。讲 record 时,不是为了展示新语法,而是因为 Book 和 Member 就是数据载体;讲泛型时,不是为了背 PECS,而是因为仓储要支持多种实体;讲异常时,不是为了罗列类名,而是因为「书已被借出」需要一种可被调用方处理的错误。

坏处是,项目会约束示例的自由度。有些语法点(比如位运算、strictfp、某些反射 API)很难自然塞进借阅系统,我们会在附录或「常见错误」里补,而不是硬造场景。这个取舍是故意的:宁可少讲一个冷门语法,也不要把项目写成语法演示的拼盘。

为什么是 JDK 25 LTS

写作时(2026 年 10 月),Java 的版本格局是:当前 LTS 是 JDK 25,上一个 LTS 是 JDK 21,最新特性版是 JDK 27。本书选 25 作主线,理由有三条。

第一,它是当前唯一同时满足「有长期修复」和「生态已经跟上」的版本。 特性版每六个月一版,支持周期短,不适合做教材主线;21 虽然成熟,但新项目没有理由从两年前的 LTS 起步。

第二,25 的正式特性对入门书有实际价值。 Scoped Values、模块导入声明、紧凑源文件、灵活构造器、紧凑对象头,这些特性有的让代码更短,有的让并发模型更清楚,有的影响内存布局。卷一会用到其中一部分,卷三、卷四会展开。

第三,21 仍然是一本必须能读的书。 很多公司还在 21 上,所以本书的编译目标默认是 21,卷一使用的语法也都在 21 里成立。你完全可以用 JDK 25 开发、用 --release 21 产出、部署到 21 的服务器。版本差异集中写在附录 C,正文只在必要处标注。

这套书不写什么

为了避免误会,先把边界说清楚。

不写 Spring。 Spring Boot 三部曲已经覆盖框架层。本书即使讲到 Web,也用 JDK 自带的 com.sun.net.httpserver,目的是让你看清 HTTP 服务的基本构成,而不是再学一套框架。

不写 Kotlin、Scala、Groovy。 JVM 多语言是另一个话题,本站有专门文章。本书只讲 Java 语言本身。

不写 Android。 Android 有自己的工具链、运行时和 UI 体系,和本书的服务器端视角差别很大。

不写全部标准库。 java.base 有几千个类,本书只覆盖入门和实战最常用的部分。附录 B 给了一张地图,告诉你其余的东西在哪,需要时再查。

不承诺性能数字。 书中涉及性能的地方,会给可复现的命令和测量方法,但不会写「比 XX 快 30%」这种离开环境就没有意义的结论。卷四会教你如何在自己的机器上测。

四卷本的路线

卷书名回答的问题
一《Java 编程入门》不会 Java,怎么从零写出一个结构清楚的程序?
二《Java 编程实战》不用 Spring,怎么把程序做成可交付的服务?
三《Java 高级编程》泛型、反射、字节码、并发、虚拟线程到底怎么工作?
四《Java 虚拟机原理与性能调优》代码跑起来之后,JVM 里发生了什么,怎么观测和调优?

四卷可以按顺序读,也可以按需跳。卷一结束时,你应该能独立完成一个 CLI + REST 的小项目;卷二结束时,能交付一个带数据库、缓存、日志、测试和容器镜像的服务;卷三、卷四更偏机制,适合已经能写业务代码、想搞清楚底层的人。

写作与验证方式

这套书的代码不是「看着对」就发出来的。写作过程中做了三层验证:

  1. 单文件编译:每个完整类都用 javac 编译过,片段用 jshell 或包装类验证过。
  2. 项目运行:library 的关键阶段(CLI、HTTP 服务、并发改造、GC 观测)实际运行过,终端输出是真实结果。
  3. 产物检查:全书用 Hugo 构建,检查章节页、目录页、书架卡片和内部链接;构建失败或链接断裂不会发布。

仍然会有遗漏。Java 的 API 很多,同一个行为在不同平台上可能有细微差异;书中的输出以本机 macOS + Temurin 25.0.5 为准。如果你在 Linux 或 Windows 上看到不同的结果,先检查版本、编码和时区,再判断是不是书里的问题。

关于「入门」两个字

最后说一点期望管理。

「入门」不等于「简单」。这本书会讲泛型擦除、值传递、受检异常、类型推断的边界,这些概念在第一天就会让初学者困惑。我不会为了显得轻松而把它们删掉,因为删掉之后,你写出的代码会在某一天以更难懂的方式报错。

但「入门」也不等于「完整」。卷一不会讲 JMM 的全部规则,不会讲 AQS 的实现,不会讲 G1 的染色指针。这些在卷三、卷四。卷一的目标是:让你能写出正确的代码,并且知道哪些问题现在不必深究、以后去哪补。

如果你接受这个目标,我们就可以开始了。

约定

  • 书中命令默认在 macOS / Linux 的 shell 中执行;Windows 用户把 export 换成 set,路径分隔符换成 \。
  • $JAVA_HOME 指 JDK 25 的安装目录;本书使用 ~/.jdks/jdk-25.0.5+8/Contents/Home。
  • 代码块中的 ... 表示省略,不表示可编译的语法。
  • 「本机输出」指在写作环境的真实输出;「示意」指为了说明结构而简化的输出。
  • 章节编号 1.1、1.2 对应 URL 中的 java-intro-01-1-...、java-intro-01-2-...。

下一节是前言,会把这些约定展开成可执行的环境清单。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「java」更多文章

  1. 《Netty 高性能网络编程》15.3 linkd-v2 验收与复盘
  2. 《Netty 高性能网络编程》15.2 限流、超时与降级
  3. 《Netty 高性能网络编程》15.1 网关路由与转发