先看一条报错,装过 Java 的人一半都见过它:
```text
C:\Users\你> javac Hello.java
'javac' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
```

奇怪的是,`java -version` 明明能输出版本号——说明机器上"有 Java",但 `javac` 就是找不到。
**十有八九,你装的是 JRE,不是 JDK。** 这俩不是同一个东西。今天这篇把它们和 JVM 的关系一次讲清楚,这是学 Java 的第一块地基。
## 01 一张图:三层套娃关系
记住一句话就够了:**JDK 包含 JRE,JRE 包含 JVM。**
| 名称 | 全称 | 一句话解释 | 给谁用 |
| ---- | ------------------------ | -------------------------------------------------------------------------------- | -------------- |
| JDK | Java Development Kit | Java 开发工具包 = JRE + 开发工具(javac 编译器、jdb 调试器、javadoc 文档工具…) | 写代码的人 |
| JRE | Java Runtime Environment | Java 运行环境 = JVM + 核心类库(String、集合这些别人写好的轮子) | 只运行程序的人 |
| JVM | Java Virtual Machine | Java 虚拟机,真正执行代码的引擎 | —— |
一个类比:JVM 是发动机,JRE 是一台能开走的整车,JDK 是整车外加一整个修理厂。**你以后要"造车"(写代码),所以必须装 JDK。**

## 02 你的代码是怎么跑起来的(三步)
```text
Hello.java(你写的源码)
↓ javac 编译
Hello.class(字节码,和操作系统无关)
↓ JVM 解释执行
屏幕上输出 Hello World
```
**字节码是关键**:它不挑操作系统,Windows 和 Linux 上的 Hello.class 是同一个文件。跨平台的是 JVM——每个系统装自己的 JVM,负责把同一份字节码翻译成各自系统的机器指令。
这就是"一次编译,到处运行"的真相:**到处跑的不是你的代码,是字节码 + 各地版本的 JVM。**
<!-- 配图未匹配到文件:编译执行三步流程图(推荐)(请手动补图) -->
## 03 三个坑,先记下来
**坑 1:装了 JRE,javac 不存在**
回到开头的报错。JRE 里只有"运行"用的 java 命令,没有"编译"用的 javac。去控制面板看看你装的是哪个——装的是 JRE,卸掉换 JDK。
**坑 2:java -version 有输出 ≠ 装好了**
<!-- 此处原为人工截图插槽:验货命令截图(人工插槽,必做) -->
验货命令是 `javac -version`,两个都能输出版本号,才算 JDK 装到位。
**坑 3:JDK 11 之后没有单独的 JRE 了**
从 JDK 11 起,官方不再单独发布 JRE(用 jlink 按需打包运行时)。所以现在网上让你"先装 JRE 再装 JDK"的教程,基本都是老黄历——**直接装 JDK,一步到位。**橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。