Java 学习路线 MOC
从零基础到可独立交付 Java 服务的系统学习路线:七个阶段、依赖关系、逐篇目录与 0 到 1 完成标准。
[!info] related notes
- 所属总入口:Java MOC
- 对象介绍:Java
- 平台哲学:Java 的起源与平台哲学
- 阶段地图:Java 语言基础 MOC · Java 类型系统与 OOP MOC · Java 工具链与构建 MOC · Java 并发 MOC · Java 测试与质量 MOC · Java 标准库与应用 MOC · Java JVM 与运行时 MOC · Java Web 与后端 MOC · Java 数据访问 MOC · Java 服务工程化 MOC
Java 学习路线 MOC
这个概念为什么出现
没有依赖顺序的笔记库会制造假进度:会写 public static void main 却不懂引用与 equals,会调 Spring 却不会处理异常边界与线程池。本路线把「从零到可交付服务」拆成七个阶段,作为学习与复习的主路径。
[!abstract] 路线结论 先建立“类型与对象如何在 JVM 上落地”的心智,再学继承/接口/相等性与泛型;随后把异常、资源与 IO 当成常规工程能力;并发必须连同 JMM 与线程池一起学;工程化(Maven/Gradle、测试)与 JVM 基础并行加深;最后用标准库 HTTP/JDBC 完成真实程序,框架(如 Spring)挂在应用层而不是替代语言主线。
学 Java 最怕把「语法会写」和「语言模型真正建立起来」混为一谈。整条路线围绕五个问题展开:
- 基本类型与引用类型如何分工,
null意味着什么 - 为什么面向对象默认是“类 + 接口契约”,多态如何替换实现
- 为什么异常是控制流,受检异常解决什么、制造什么成本
- 为什么并发主线是线程与内存可见性,而不是“随便 new Thread”
- 为什么 classpath/模块与构建工具是语言体验的一部分
如何使用这份路线
| 场景 | 做法 |
|---|---|
| 从零开始 | 按阶段编号顺序读;每篇先跑最小示例,再看规则与边界 |
| 已有 JS/TS 或 Python 经验 | 可加速阶段一语法,但不要跳过引用语义、equals、异常与并发 |
| 已有 Go 经验 | 对照值语义 vs 引用默认、error 值 vs 异常、goroutine vs 线程/虚拟线程 |
| 只抓主干 | 看文末「8 个主干主题」和「0 到 1 完成标准」 |
| 查某一主题 | 先定位阶段表中的文件名,再打开对应笔记;细节在原子笔记,不在本页展开 |
难度标记
- L1 入门 · L2 基础巩固 · L3 核心心智 · L4 工程/并发 · L5 运行时与进阶
- 源码:否 / 建议 / 需要 —— 是否值得对照规范、标准库或 OpenJDK 源码加深
依赖关系总图
flowchart TD
S1["阶段一 基本认知"] --> S2["阶段二 数据与类型模型"]
S2 --> S3["阶段三 错误、资源与 IO"]
S3 --> S4["阶段四 并发编程"]
S3 --> S5["阶段五 工程化开发"]
S4 --> S5
S5 --> S6["阶段六 JVM 与进阶"]
S5 --> S7["阶段七 真实项目能力"]
S4 --> S7
S6 --> S7
箭头表示认知依赖,不表示前一阶段必须全部背完。每个阶段都应运行最小例子并观察结果。
阶段与子 MOC 对照
| 阶段 | 目标 | 主要子 MOC |
|---|---|---|
| 一 | 建立 Java 的平台边界与程序骨架 | Java 语言基础 MOC · Java 工具链与构建 MOC |
| 二 | 对象模型、接口、相等性、泛型入门 | Java 类型系统与 OOP MOC |
| 三 | 异常、资源管理与 IO 抽象 | Java 标准库与应用 MOC |
| 四 | 线程、同步、JUC、异步组合与 JMM | Java 并发 MOC |
| 五 | 构建、测试、质量工具与项目结构 | 工具链 · 测试质量 · 服务工程 |
| 六 | 类加载、GC、反射与性能边界 | JVM 与运行时 MOC |
| 七 | CLI、HTTP、数据访问与服务交付 | Web 后端 · 数据访问 · 服务工程 |
阶段一:建立 Java 的基本认知
目标:能解释 Java 解决什么问题;能安装 JDK 并运行程序;理解编译/运行分离、基本类型、变量作用域、表达式、控制流与方法重载。
完成标准:
- 能从零写出带
main的类并用javac/java(或构建工具)验证 - 能说明基本类型与引用类型的分工,以及局部变量必须赋值后使用
- 能读懂方法签名、重载与
static的基本边界
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 1.1 | Java 的起源与平台哲学 | Java 为什么这样设计,平台分层是什么 | L2 | 建议 |
| 1.2 | 安装 JDK 并运行第一个程序 | 如何安装并跑通第一个程序 | L1 | 否 |
| 1.3 | Java 程序结构与 main | 类、包、main 与编译单元如何组织 | L1 | 否 |
| 1.4 | Java 基本类型与字面量 | 基本类型如何表示值 | L1 | 否 |
| 1.5 | Java 变量与作用域 | 局部/成员/类变量与 definitively assigned | L1 | 否 |
| 1.6 | Java 运算符与表达式 | 运算符、优先级、短路与数值提升 | L1 | 否 |
| 1.7 | Java 流程控制 | if/switch/for/while/break 如何组织控制流 | L1 | 否 |
| 1.8 | Java 方法与重载 | 方法签名、重载解析与 static | L2 | 否 |
| 1.9 | 使用 Scoop 安装并配置 Java 环境 | Windows 上如何用 Scoop 管理 JDK | L1 | 否 |
阶段二:理解 Java 的数据与对象模型
目标:建立数组、字符串、类与对象、继承多态、接口、equals/hashCode、泛型入门与 null 模型。
完成标准:
- 能解释引用赋值共享对象,与基本类型复制的区别
- 能用继承/接口做可替换设计,并知道何时该用组合
- 能正确覆写
equals/hashCode,并说明契约 - 能解释泛型主要是编译期检查 + 擦除,以及原始类型的风险
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 2.1 | Java 数组 | 数组长度、协变与引用语义 | L2 | 否 |
| 2.2 | Java 字符串与字符集 | String 不可变、编码与常见陷阱 | L2 | 否 |
| 2.3 | Java 类与对象 | 对象如何创建,字段与方法如何归属 | L2 | 否 |
| 2.4 | Java 字段、构造器与 this | 初始化顺序与构造责任 | L2 | 否 |
| 2.5 | Java 继承与多态 | 覆盖、向上转型与动态分派 | L3 | 建议 |
| 2.6 | Java 接口与抽象类 | 契约、默认方法与抽象类边界 | L3 | 否 |
| 2.7 | Java equals 与 hashCode | 相等性契约与哈希容器 | L3 | 建议 |
| 2.8 | Java 泛型基础 | 类型参数、擦除与边界 | L3 | 建议 |
| 2.9 | Java null 与 Optional | 空值主模型与 Optional 的正确用法 | L3 | 否 |
| 2.10 | Java Record 与数据载体(可选/后置) | 不可变数据载体何时用 record | L2 | 否 |
| 2.11 | Java 枚举 | enum 如何表达封闭常量集 | L2 | 否 |
| 2.12 | Java 集合框架概览 | List/Set/Map 心智与选用 | L3 | 否 |
阶段三:错误、资源与 IO
目标:把异常当作可设计的控制流;掌握 try-with-resources;建立字节流/字符流与 NIO 入门心智。
完成标准:
- 能区分受检/非受检异常,并设计合理抛出边界
- 能用 try-with-resources 关闭资源且理解抑制异常
- 能解释 InputStream/Reader 的职责分层
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 3.1 | Java 异常与错误处理 | 为什么异常是主错误模型,checked 代价是什么 | L3 | 否 |
| 3.2 | Java try-with-resources | 资源如何与异常路径一起关闭 | L3 | 否 |
| 3.3 | Java IO 流与 Reader | 字节流与字符流如何组合 | L3 | 建议 |
| 3.4 | Java NIO 概览 | Buffer/Channel/Path 解决什么 | L4 | 建议 |
| 3.5 | 资源生命周期与 AutoCloseable | 谁创建谁关闭 | L3 | 否 |
阶段四:并发编程
目标:建立线程启动、共享内存同步、线程池、异步组合与 happens-before 的完整心智。
完成标准:
- 能说明共享可变状态为何需要同步
- 能选用合理的 Executor 与任务边界,而不是无限
new Thread - 能解释
volatile/synchronized与 JMM 可见性的关系(规范层) - 能用 CompletableFuture 做异步组合(在理解线程池的前提下)
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 4.1 | Java 线程与 Runnable | 线程如何启动与结束 | L3 | 否 |
| 4.2 | Java synchronized 与 volatile | 互斥与可见性的语言层工具 | L4 | 建议 |
| 4.3 | Java JUC 锁与原子类 | Lock/原子类适用边界 | L4 | 否 |
| 4.4 | Java 执行器与线程池 | 如何限制并发并回收工作线程 | L4 | 建议 |
| 4.5 | Java 并发集合 | 并发容器解决什么、不解决什么 | L4 | 否 |
| 4.6 | Java CompletableFuture | 异步组合与异常传播 | L4 | 否 |
| 4.7 | Java 内存模型与 happens-before | 何时写入对其它线程可见 | L5 | 需要 |
| 4.8 | Java 虚拟线程概览(按版本) | 虚拟线程改变了什么成本模型 | L4 | 建议 |
阶段五:工程化开发
目标:把单文件练习组织成可构建、可测试、可发布的模块与服务骨架。
完成标准:
- 理解 package 可见性与依赖管理边界
- 会用 JUnit 写可重复测试
- 能说明项目分层与配置、日志的基本位置
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 5.1 | Java 包与可见性 | 包边界与访问修饰符如何约束设计 | L2 | 否 |
| 5.2 | Java 类路径与模块系统 | classpath 与 JPMS 各自解决什么 | L3 | 建议 |
| 5.3 | Maven 基础 | 坐标、生命周期与依赖范围 | L2 | 否 |
| 5.4 | Gradle 基础 | 任务模型与依赖声明 | L2 | 否 |
| 5.5 | Java 项目结构与分层 | 目录与分层如何映射依赖方向 | L3 | 否 |
| 5.6 | Java 测试与 JUnit | 如何组织单元/集成测试 | L2 | 否 |
| 5.7 | Java 日志 | 门面、实现与级别 | L2 | 否 |
| 5.8 | Java 配置管理 | 配置如何注入且保持可测试 | L3 | 否 |
| 5.9 | Java 静态检查与格式化 | 检查器与风格工具分工 | L2 | 否 |
阶段六:JVM 与进阶
目标:在语言主线稳定后,下沉到类加载、字节码、内存与 GC、反射与注解处理;明确规范 vs 实现。
完成标准:
- 能描述 class 文件加载的大致阶段
- 能说明堆/栈/方法区(元空间)等常见区域的职责级模型(实现相关要标注)
- 能解释反射的能力与成本边界
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 6.1 | JVM 类加载与字节码概览 | 类如何进入 JVM 并执行 | L5 | 需要 |
| 6.2 | JVM 内存与 GC 概览 | 分配与回收解决什么问题 | L5 | 需要 |
| 6.3 | Java 反射 | 运行时检查与调用的边界 | L4 | 建议 |
| 6.4 | Java 注解处理概览 | 编译期注解如何生成代码 | L4 | 建议 |
| 6.5 | 泛型擦除与可具体化边界 | 擦除对运行时意味着什么 | L4 | 建议 |
| 6.6 | JNI 概览(可选) | 与原生代码互操作的成本 | L5 | 建议 |
| 6.7 | Java 性能方法论 | 如何测量再优化 | L4 | 否 |
阶段七:真实项目能力
目标:用标准库与克制依赖完成 CLI/HTTP/数据访问闭环;框架作为可选加速器挂在应用层。
完成标准:
- 能完成一个可测试的 CLI 与一个最小 HTTP 服务
- 能完成 JDBC 读写的最小闭环并处理资源关闭
- 能说明何时引入 Spring 等框架,以及引入后仍依赖哪些语言主线能力
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 7.1 | 使用 Java 构建 CLI | 如何做可测试命令行程序 | L3 | 否 |
| 7.2 | 使用 Java 构建 HTTP 服务 | 如何用 JDK HTTP 能力做可测试服务 | L3 | 否 |
| 7.3 | Java JSON 与序列化 | JSON 映射与空值/类型边界 | L2 | 否 |
| 7.4 | Java JDBC 与数据访问 | 连接、语句、结果集与事务边界 | L4 | 建议 |
| 7.5 | Java HttpClient | 标准 HTTP 客户端用法 | L3 | 否 |
| 7.6 | Java 请求与领域校验 | 校验放在哪一层 | L3 | 否 |
| 7.7 | Java 认证与 JWT 概览 | 认证如何挂在 HTTP 边界 | L3 | 否 |
| 7.8 | Java 服务优雅关闭 | 如何排空请求并关闭依赖 | L4 | 否 |
| 7.9 | Java 可观测性 | 指标、日志、追踪如何联动 | L4 | 否 |
| 7.10 | Java Docker 部署 | 容器化 JVM 服务的构建与运行 | L3 | 否 |
| 7.11 | Spring Web 概览(可选框架) | 何时用 Spring 而不是只用 JDK | L3 | 否 |
| 7.12 | Spring Boot(既有) | 约定配置与起步依赖 | L3 | 否 |
如果只抓主干,优先这 8 个主题
- Java 基本类型与字面量 / 变量与作用域
- Java 类与对象
- 继承与多态 / 接口与抽象类
- equals 与 hashCode
- 泛型基础
- 异常与错误处理
- 线程 / 线程池
- 内存模型与 happens-before
一条实用学习原则
不要把 Java 学成“背 Spring 注解和面试题清单”。先把 类型与对象、相等性、异常与资源、并发与可见性 四条主线学稳,再进入构建、测试、Web、数据库和部署。
0 到 1 的完成标准
- 能解释引用赋值后两个变量为何可能指向同一对象
- 能正确说明
equals/hashCode契约,并解释放进 HashMap 的后果 - 能设计异常边界:哪些向上抛、哪些转译、哪些记录后恢复
- 能用线程池提交任务并说明拒绝策略/关闭流程的基本点
- 能写 JUnit 测试并用构建工具跑通
- 能完成 CLI 与 HTTP 服务 最小闭环
- 能区分“语言/JLS 保证”和“当前 HotSpot/GC 实现细节”
认知跳跃提醒(按路线可规避)
- 未理解引用与对象生命周期就学集合并发 → 先 2.3 / 2.9 / 2.12
- 未理解异常与资源关闭就上 JDBC/HTTP → 先 3.1 / 3.2
- 未理解同步与线程池就写“高性能异步” → 先 4.2 / 4.4 / 4.7
- 未测量就谈 GC 调优与反射优化 → 先 5.6 / 6.7,再 6.2 / 6.3
- 未完成语言主线就深陷 Spring 魔法 → 框架放阶段七,且对照 7.2 的标准库服务
相关入口
- 总地图:Java MOC
- 对象定位:Java
- 平台哲学:Java 的起源与平台哲学
- 安装验收:安装 JDK 并运行第一个程序 · 使用 Scoop 安装并配置 Java 环境
自测题
- 为什么并发阶段要放在异常与资源之后?
- 阶段六 JVM 笔记与阶段二泛型笔记应如何配合阅读?
- 若时间有限,优先抓哪 8 个主干主题?
答案
- 取消、失败传播、资源关闭是并发正确性的前置,否则线程泄漏与连接泄漏会混在一起。
- 先掌握语言层泛型与擦除直觉,再读字节码/反射细节;实现细节不回写为“语法永久如此”。
- 基本类型/变量、类与对象、继承接口、equals/hashCode、泛型、异常、线程/线程池、JMM。