Java 教程

Java 在 RootStack 体系中的定位是全栈核心语言——后端企业级开发主力、JVM 生态庞大、Spring 架构灵活且庞大。它与 C/C++(贴近硬件)不同:Java 抽象了硬件,但保留了性能与工程严谨性;它的全栈优势在于一种语言打通后端 + 中间件 + Android

本教程假设读者已有 C 语言基础。全文大量采用「与 C 对比」的写法:你熟悉的 char*malloc/free、指针、结构体,都会在 Java 中找到对应物或被明确告知”没有这个东西,取而代之的是……”。若为纯初学者,建议先完成 C 语言教程 前几章再回到这里。


写在教程之前

本教程的定位

Java 不是 C 的替代品,而是另一条主战场的入场券。学完本教程你将能够:

  • 后端企业级开发:Spring Boot / Spring Cloud 是全球后端的事实标准,银行、电商、电信系统的主要语言
  • 中间件与大数据:Kafka、Elasticsearch、Hadoop、Flink 全部构建在 JVM 之上——懂 JVM 才能真正运维和调优它们
  • Android 开发:Android 官方语言之一(另一个是 Kotlin,同样跑在 JVM 上)
  • 一种语言走全栈:后端 API 用 Java 写,客户端用 Android(Java),中间件配置调优靠 JVM 知识,技术栈高度统一

与 C 的根本差异一句话概括:C 把内存交给程序员管,Java 把内存交给 JVM 管;C 编译到具体平台的机器码,Java 编译到字节码由 JVM 到处运行。

不同系统下载 JDK

JDK(Java Development Kit)= 编译器 + 运行时 + 工具链,写 Java 只需要装好 JDK。

系统推荐方式命令/说明
WindowsEclipse Temurin 官方 MSIadoptium.net 下载 MSI 安装包,安装时勾选”设置 JAVA_HOME”;或用 winget:winget install EclipseAdoptium.Temurin.21.JDK
Linux (Debian/Ubuntu)apt 或 SDKMANsudo apt install openjdk-21-jdk;推荐 SDKMAN(见下)
Linux (Fedora)dnfsudo dnf install java-21-openjdk-devel
Linux (Arch)pacmansudo pacman -S jdk21-openjdk
macOSHomebrewbrew install --cask temurinbrew install openjdk@21

Linux/macOS 强烈推荐 SDKMAN 管理 JDK 多版本,一条命令安装切换,详见入门篇各章。

版本说明

推荐 JDK 17 或 JDK 21(均为 LTS 长期支持版)

版本类型说明
JDK 8LTS存量最大的老版本,大量遗留系统仍在用;新学习不建议从它开始
JDK 11LTS模块化之后的第一个 LTS
JDK 17LTS当前企业主流,新项目安全选择
JDK 21LTS最新 LTS,引入虚拟线程(Virtual Threads),本教程默认版本

非 LTS 版本(如 22、23、24)每半年发布一次,适合尝鲜,不适合生产。教程中所有代码在 JDK 17 与 21 下均可运行。

编辑器选择

编辑器平台说明
IntelliJ IDEA Community全平台强烈推荐。JetBrains 出品,Java 生态事实标准,社区版免费且够初学使用
IntelliJ IDEA Ultimate全平台旗舰版,含 Spring/数据库/Web 全套支持,学生邮箱可免费申请
VS Code + Extension Pack for Java全平台轻量路线,已有 VS Code 习惯的读者可选
Vim/Neovim + jdtls终端终端党方案,eclipse.jdt.ls 语言服务器提供补全

详细对比见 编辑器与 IDE 选择


教程结构

graph TB
    ROOT["java/"] --> P1["1入门/<br/>环境搭建、第一个程序、变量类型、<br/>流程控制、数组字符串、方法、面向对象基础"]
    ROOT --> P2["2深入/<br/>集合框架、泛型、异常、IO、多线程并发、<br/>JVM 内存模型与 GC、反射与注解"]
    ROOT --> P3["3工程化/<br/>Maven/Gradle 构建管理、单元测试、<br/>Spring Boot 实战、数据库连接、部署"]
    P1 -->|"语法地基"| P2
    P2 -->|"机制内功"| P3

三阶段递进关系:

  1. 1 入门:从零建立 Java 语法体系,每一节都与 C 对照。目标是能独立写出几百行的多类程序。本阶段不使用框架、不依赖 IDE 魔法,一切命令行手工操作,打牢”编译-运行-排错”的底层直觉
  2. 2 深入:进入 Java 真正的难点与精髓——集合源码级理解、并发编程、JVM 内存与垃圾回收。这一阶段决定你是”会写 Java”还是”懂 Java”;面试与生产排障的差距都在这里拉开
  3. 3 工程化:真实项目怎么组织——依赖管理、测试、框架(Spring)、数据库、打包部署。这是求职与实战的临门一脚,也是前面所有知识的汇合点

各阶段预计投入(按每天 2 小时估算):

阶段时长完成标志
入门2 周能不查资料写出含类/循环/数组的完整小程序;LeetCode 累计 10 题
深入4 周说得清 HashMap 扩容原理;能写多线程计数器;理解 GC 日志
工程化6 周从零搭一个带数据库的 REST API 并部署上线

推荐学习路径

Phase 1:入门语法(1-2 周)

顺序文件重点
000 Java 是什么定位、JVM 原理、与 C/C++ 对比全景图
101 Windows 环境配置JDK 安装、JAVA_HOME、PATH
202 Linux 环境配置apt/dnf/pacman、SDKMAN 多版本管理
303 macOS 环境配置Homebrew、Apple Silicon 注意事项
404 编辑器与 IDE 选择IDEA/VS Code/Vim 三条路线对比
505 第一个程序与 jshellHello World 剖析、main 方法签名、REPL

按操作系统选读 01/02/03 中对应一章即可,其余两章可作参考跳过。

Phase 2:语言核心(3-4 周)

顺序文件重点
606 变量与数据类型八大基本类型 vs C、包装类缓存池陷阱
707 运算符与表达式无符号右移 >>>、短路求值、instanceof 模式匹配
808 条件语句switch 箭头语法、模式匹配 switch
909 循环结构增强 for 本质、标签 label 替代 goto
1010 数组数组是对象、Arrays 工具类 vs qsort
1111 字符串常量池与 ==/equals、StringBuilder
1212 方法值传递真相、重载、可变参数 vs stdarg

Phase 3:面向对象与进阶语法(3-4 周)

顺序文件重点
1313 类与对象struct 到 class 的跨越、record、GC 初识
1414 继承与多态动态绑定 vtable 原理、Object 三件套
1515 接口与抽象类面向接口编程、函数式接口与 Lambda
1616 异常处理受检异常设计哲学、try-with-resources
1717 文件 IO流模型、序列化、Files 一行读写

Phase 4:深入机制(4-6 周)

顺序文件重点
1801 泛型深入类型擦除、PECS,对比 C++ 模板
1902 注解与反射Spring 框架的底层基石
2003 集合框架深入HashMap 源码级理解,对比 C 手写哈希表
2104 多线程基础synchronized/volatile,对比 pthread
2205 并发包与线程池ThreadPoolExecutor 七参数、CompletableFuture
2306 JVM 内存模型运行时数据区、GC 判活与收集器演进
2407 JVM 调优jmap/jstack/arthas 实战排障
2508 Stream 与函数式Lambda 本质、Collectors 全家桶
2609 NIO 与网络编程BIO/NIO/AIO、Reactor 模式,对比 epoll
2710 设计模式单例五种写法、JDK 中处处是模式
2811 Java 新特性record/sealed/虚拟线程/GraalVM
2912 算法与 LeetCode刷题环境、API 速查、题型分类导航

Phase 5:工程工具链与数据库(2-3 周)

顺序文件重点
3001 Maven 构建POM/依赖仲裁/多模块,对比 CMake
3102 Gradle 构建Kotlin DSL、api vs implementation
3203 JDBC 与数据库连接PreparedStatement 防注入、事务、连接池
3304 MyBatis#{} vs ${}、动态 SQL、MyBatis-Plus

Phase 6:Spring 全家桶(4-5 周)

顺序文件重点
3405 Spring IoC 与 AOPBean 生命周期、三级缓存、动态代理
3506 Spring Boot 快速开发自动配置原理、starter、REST API 实战
3607 Spring MVC九种参数接收、全局异常、拦截器、RESTful
3708 Spring Data JPA方法名推导查询、N+1、关联映射
3809 Spring Security过滤器链、JWT、RBAC、OAuth2

Phase 7:生产级工程能力(3-4 周)

顺序文件重点
3910 日志框架SLF4J+Logback 配置、MDC 链路追踪
4011 单元测试JUnit5/Mockito/Testcontainers/JaCoCo
4112 Docker 容器化分层缓存瘦身、compose 编排
42CD 流水线GitHub Actions 完整工作流
4314 性能调优与监控JMH/JFR/火焰图、缓存三大问题

Phase 8:全栈实战与架构(4-5 周)

顺序文件重点
4415 全栈开发技巧OpenAPI 先行、WebSocket、Todo 全栈实战
4516 应急处理与线上问题排查CPU 飙高五步法、三个故障现场复现
4617 GitHub 热门项目实战读源码方法论、提 PR 全流程(贯穿全程)
4718 架构设计入门DDD/微服务拆分/OpenFeign mini 微服务

全部 48 个文件已完成。配套学习路线另见 路径 G — Java 全栈路径


相关教程

教程关系
C本教程的前置与对照系。内存模型、指针概念的”反面教材”——Java 正是为了解决 C 的手动内存管理痛点而生
C++同为编译型强类型语言。Java 借鉴了 C++ 语法但砍掉了指针运算、多重继承、手动 delete;反过来 C++ 程序员学 Java 会觉得”处处受限但处处安全”
Rust系统级的另一种答案:不用 GC 也能内存安全(所有权+借用检查)。对比学习能加深对 GC 与所有权两种模型的理解,Rust 的 Option/Result 与 Java 的 Optional/异常也值得互照
Python脚本工具线。Python 的 REPL 体验在 Java 中对应 jshell;两者虚拟机机制(CPython 字节码 vs JVM 字节码)可对照——学深入篇 JVM 时会频繁回想起 CPython 的设计
数据库后端开发必备。Java 工程化阶段的 JDBC/MyBatis/JPA 都以 SQL 基础为前提;反过来 Java 的连接池、事务管理也会加深你对数据库原理的理解

与其他模块的关联

  • DSA 学习路线 — Java 的集合框架就是一本活的《数据结构》教材,刷题可用 Java
  • 计算机网络 — Java Socket/NIO 网络编程是网络理论的落地实践
  • 内核教程 — 理解进程/线程/虚拟内存后,JVM 的运行模型会豁然开朗
  • 红队知识库 — 大量企业靶场与真实目标环境是 Java 技术栈,Java 反序列化漏洞是重点课题


Java 与 C 快速对照(学习心法)

开始之前,先在脑中装好这张”翻译表”。后续每一章都会反复用到它:

你熟悉的 CJava 中的对应一句话差异
char*String 对象不可变、自带长度、无 \0
struct + 函数class数据与操作绑定,带访问控制
malloc/freenew + GC只管申请,回收交给 JVM
int* p 指针运算引用(无算术运算)能指向、不能加减移动
gcc 编译出可执行文件javac 编译出字节码平台无关,JVM 执行
make/CMakeMaven/Gradle依赖自动下载,声明式构建
#definestatic final 常量有类型、有作用域、可调试
头文件 .himport 直接读字节码元信息
数组越界 = UB数组越界 = 抛异常明确报错而非静默踩内存
gdb 调试IDE 图形化调试/jdb断点、变量视图开箱即用

带着这张表学,每章问自己两个问题:

  1. 这个概念在 C 里对应什么?
  2. Java 为什么这样设计?解决了 C 的什么痛点?

第二个问题的答案,几乎都指向同一个词:安全性——内存安全(GC)、类型安全(强类型+无指针运算)、行为安全(无 UB)。理解了这条设计主线,Java 的很多”啰嗦”就变得合理。


环境自检清单

学完入门篇环境三章后,用这份清单自查。全部通过再进入后续章节:

# 1. 编译器可用
javac -version          # 期望: javac 21.x.x
 
# 2. 运行时可用且版本一致
java -version           # 期望: openjdk version "21.x.x"
 
# 3. JAVA_HOME 已设置(Windows: echo %JAVA_HOME%)
echo $JAVA_HOME
 
# 4. 能编译运行单文件
echo 'public class T { public static void main(String[] a){ System.out.println("ok"); } }' > T.java
java T.java             # 期望输出: ok
rm -f T.java
 
# 5. jshell 可用(输入 /exit 退出)
jshell

五步全绿即环境就绪。任何一步失败回到对应系统章节的排错节。


常见问题 FAQ

Q:已经有 Python 了,为什么还要学 Java?
Python 在 RootStack 中定位为工具线(脚本、辅助),而 Java 是工程主线——大型多人协作的长期项目需要静态类型、统一规范和成熟框架,这正是 Java 的统治区。两者互补而非互替。

Q:直接学 Kotlin 不行吗?
Kotlin 语法更现代,但它的运行时、类库、生态全部建立在 Java 之上;不懂 Java 的 Kotlin 学习者会在标准库和 JVM 报错面前寸步难行。先 Java 后 Kotlin 是主流路径。

Q:C 学得一般能学 Java 吗?
可以,甚至更顺——不需要”忘掉”指针和手动内存管理,只需知道 Java 把这些接管了。有 C 底子反而更容易理解 JVM 内存模型、栈与堆这些深入篇内容。

Q:学到什么程度可以找工作?
现实基准大致是:本教程三阶段走完 + LeetCode 150 题左右 + 一个完整的 Spring Boot 项目(含数据库、部署)。工程化篇结束时我们会给出项目选题建议。

Q:教程为什么处处提 C?
因为 RootStack 假设读者是 C 背景迁移者。对比式学习比从零记忆快得多:新概念挂在你已有的知识树上,而不是悬空背诵。

Q:JDK、OpenJDK、Oracle JDK 到底什么关系?
Java 语言规范和 JVM 规范开源;OpenJDK 是规范的官方参考实现(源码项目);Oracle JDK、Temurin、Corretto 等都是基于 OpenJDK 源码构建的发行版,差异主要在许可与商业支持。学习阶段选哪个都兼容。

Q:Java 会不会被 Go/Rust 取代?
在云原生基础设施领域 Go 确实在抢地盘,Rust 在系统层替代 C/C++。但存量企业系统 + Spring 生态 + 大数据栈的惯性至少还有十年以上;且 JVM 本身在持续进化(虚拟线程、GraalVM 原生镜像)。学 Java 的投资回报周期依然很长。


学习方法建议

1. 对比式笔记

准备一个持续追加的”差异清单”,每章往里加一行。三个月后它会是你最好的复习材料:

# 我的 C→Java 差异清单(示例)
- 字符串: char* → String,不可变,== 比较 vs equals
- 数组长度: 手动传参 → arr.length 属性
- 输出: printf("%d\n", x) → System.out.println(x)
- ...

2. 代码必须亲手敲

教程里的代码块全部可运行。复制粘贴运行一遍只完成 30% 的学习——改坏它、读报错、修好它,才完成剩下 70%。Java 的编译期报错信息质量很高,是免费的教学材料。

3. jshell 当草稿纸

任何”如果……会怎样?“的疑问,先开 jshell 验证再查文档。验证过的结论记得写进对比式笔记。

4. 刷题节奏

每章末尾配一道 LeetCode 真题,不要跳过。语法学习的留存率靠输出维持,刷题是最便宜的输出方式。目标节奏:入门篇结束累计 10 题,深入篇结束累计 50 题。

5. 用 Git 管理练习代码

mkdir ~/code/java-learn && cd ~/code/java-learn
git init
# 每章一个目录: ch05-hello/ ch06-types/ ...
git add . && git commit -m "ch05: first program and jshell"

好处:随时回看任意阶段代码对比进步;养成提交习惯为工程化篇铺路;搞坏了随时回滚。


术语速查表

初学会被缩写轰炸,先混个脸熟,后续章节会逐个展开:

术语全称一句话解释
JVMJava Virtual Machine执行字节码的虚拟机,Java 跨平台的秘密
JREJava Runtime EnvironmentJVM + 核心类库,运行 Java 程序所需的最小集合
JDKJava Development KitJRE + 编译器与工具,开发者装这个
OpenJDKOpen Java Development KitJDK 的开源参考实现,各发行版的共同上游
LTSLong-Term Support长期支持版本(8/11/17/21),生产环境只选这些
javacJava Compiler编译器,把 .java 编译成 .class
字节码bytecode.class 文件里的中间指令格式,平台无关
JITJust-In-Time compilation运行时把热点字节码编译成机器码的技术
GCGarbage Collection垃圾回收,自动内存管理机制
jshellJava ShellJDK 自带的交互式解释器(REPL)
Maven / Gradle构建与依赖管理工具,对应 make/CMake 的生态位
SpringSpring Framework企业级开发框架全家桶,工程化篇主角
IDEIntegrated Development Environment集成开发环境,本教程指 IntelliJ IDEA

外部资源

  • Oracle Java 官方文档 — 权威参考,API 文档必查
  • dev.java — Oracle 新一代 Java 学习门户,教程质量高且有官方示例
  • Spring 官网 — Spring/Spring Boot 官方指南(Guides 板块每个都是可动手的小项目)
  • Baeldung — 最优质的英文 Java 实战教程站
  • SDKMAN — JDK/Groovy/Kotlin 等 JVM 生态 SDK 的版本管理器
  • Adoptium — Eclipse Temurin 免费 OpenJDK 发行版下载
  • Java Language Specification — 语言规范,深究语义时查阅

本章小结

  • Java 在 RootStack 中是全栈核心语言:后端 + 大数据 + Android 一通百通
  • 装 JDK 选 Temurin,版本选 17 或 21 LTS,Linux/macOS 用 SDKMAN 管多版本
  • 编辑器首选 IntelliJ IDEA 社区版
  • 学习路径三阶段:入门语法 → 深入机制 → 工程化框架
  • 全程带着”C 视角”学习:每遇到一个新概念,先问”这在 C 里对应什么”

下一步

环境与工具的决策已经全部做完,从 00 Java 是什么 开始进入正题。如果只想最快跑起来:

# 三平台各一条命令(详见对应章节)
winget install EclipseAdoptium.Temurin.21.JDK   # Windows
sudo pacman -S jdk21-openjdk                    # Arch Linux
brew install --cask temurin@21                  # macOS

装好后在任意终端输入 jshell,敲下 System.out.println("hello") ——你已经是一个能运行 Java 代码的程序员了,剩下的只是把这件事做深。


本目录的写作约定

为方便协作与检索,java/ 目录遵循以下约定(也帮助读者快速定位内容):

  1. 命名:文件名格式 NN_主题.md,编号即推荐阅读顺序;中文标题、下划线分隔
  2. 对比表:凡引入新概念必配「与 C 对比」表格——这是本教程与市面教程的最大差异
  3. 图形:架构与流程一律使用 mermaid 代码块,不使用字符画
  4. 链接:站内互引用 Obsidian wiki 链接 [[路径|显示名]],外部资源用标准 markdown 链接
  5. LeetCode 巩固:基础知识章节末尾固定小节,每章一道真实题目
  6. 代码:所有示例完整可运行、带中文注释,在 JDK 17 与 21 下验证通过

发现内容过时或错误时,欢迎在对应文件内直接修订并提交。目录之外的讨论请走 RootStack 的 ISSUES 流程。

提示:Obsidian 用户可将本 vault 直接作为仓库打开,wiki 链接与 mermaid 图均可原生渲染;纯 GitHub 浏览时 wiki 链接会退化为普通文本,mermaid 仍可渲染。

祝学习顺利。