主题
Chapter 01 · 走进 Java 世界
你的第一行 Java 代码,从这里开始。
🎯 本章目标
- 理解 Java 是什么、为什么这么火
- 搞清楚 JDK、JRE、JVM 三个让人头大的缩写
- 在自己的电脑上跑通第一个 Java 程序
- 知道一段 Java 代码从「写下来」到「跑起来」中间发生了什么
1. Java 是什么?用一个生活例子说明
想象你写了一本中文小说,想让全世界的人都能看:
- 方案 A:把小说翻译成英文、日文、法文、德文……每个国家都翻译一遍。累死。
- 方案 B:先翻译成一种"通用语",然后给每个国家配一个"通用语 → 本地语"的翻译官,看的时候现场翻译。这才聪明。
Java 就是方案 B。
- 你写的
.java文件 → 被编译成统一的"通用语"(字节码 .class) - 每台机器上装一个 JVM(Java 虚拟机) 当翻译官
- JVM 把字节码翻译成当前机器能懂的指令(Windows、Mac、Linux 都有自己的 JVM)
这就是 Java 最响亮的口号:"Write Once, Run Anywhere"(一次编写,到处运行)。
2. JDK / JRE / JVM 到底是啥?
这三个词新手最容易搞混。我们用一个 "汽车 4S 店" 的比喻:
| 缩写 | 全称 | 类比 | 用来做什么 |
|---|---|---|---|
| JVM | Java Virtual Machine | 汽车的发动机 | 真正执行字节码的核心 |
| JRE | Java Runtime Environment | 整辆能开的车(发动机+轮子+座椅) | 运行 Java 程序的最小环境(JVM + 核心类库) |
| JDK | Java Development Kit | 4S 店(车 + 维修工具 + 设计图纸) | 开发 Java 程序的全套工具(JRE + 编译器 javac + 调试工具) |
关系:JDK ⊃ JRE ⊃ JVM
💡 一句话总结:开发选 JDK,只跑别人写好的程序选 JRE,至于 JVM —— 它在 JDK 和 JRE 里都自带,不用单独装。
3. 为什么大家都在用 Java?
| 优势 | 通俗解释 |
|---|---|
| 跨平台 | 写一份代码,Windows / Linux / Mac 都能跑 |
| 生态强大 | Spring、MyBatis、Dubbo……几乎所有后端轮子都有 |
| 企业首选 | 银行、电商、社交、政府系统的中后台基本都是 Java |
| 岗位多 | BOSS 直聘上 Java 岗位常年位居前三 |
| 垃圾自动回收 | 写代码不用手动 free(),新手友好 |
⚠️ 缺点也得知道:相比 Python,Java 写起来啰嗦;相比 C++,性能略低;启动慢(不过 GraalVM 在改善这一点)。
4. 安装 JDK:你的开发环境
步骤 1:下载
推荐两个发行版:
- Oracle JDK:https://www.oracle.com/java/technologies/downloads/
- OpenJDK / Adoptium Temurin(免费、开源、企业首选):https://adoptium.net/
版本选择建议:
- 学习推荐 JDK 17 LTS(长期支持版本,企业最常用)
- 也可以用 JDK 21 LTS(最新 LTS)
- 不要选奇数版本(11 之后只有偶数年是 LTS)
步骤 2:安装
- Windows:双击
.msi文件,下一步即可。会自动配置环境变量。 - macOS:双击
.pkg安装,自动配置。 - Linux:解压 tarball 到
/opt/jdk-17,然后配置JAVA_HOME:
bash
export JAVA_HOME=/opt/jdk-17
export PATH=$JAVA_HOME/bin:$PATH步骤 3:验证
打开命令行(Windows 是 cmd / PowerShell,Mac/Linux 是 Terminal),输入:
bash
java -version
javac -version看到类似这样的输出就成功了:
openjdk version "17.0.10" 2024-01-16
OpenJDK Runtime Environment Temurin-17.0.10+7 (build 17.0.10+7)
OpenJDK 64-Bit Server VM Temurin-17.0.10+7 (build 17.0.10+7, mixed mode)🔧 如果提示"不是内部命令":环境变量没配好。Windows 下到「系统属性 → 环境变量 → Path」里加上 JDK 的
bin目录。
5. 你的第一个 Java 程序
Step 1: 写代码
新建文件 HelloWorld.java,写入以下代码:
java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java World!");
}
}⚠️ 重要:文件名必须和
public class后面的类名 完全一致(大小写也得一样),即HelloWorld.java。
Step 2: 编译
打开命令行,进入文件所在目录:
bash
javac HelloWorld.java执行后,目录里会多出一个 HelloWorld.class 文件 —— 这就是 字节码。
Step 3: 运行
bash
java HelloWorld注意:是 java HelloWorld(不带 .class,也不带 .java)。看到输出:
Hello, Java World!恭喜你成为 Java 程序员了! 🎉
6. 一段代码的"完整旅程"
让我们把刚才的过程再走一遍,看每一步内部到底发生了什么:
- 你写:
.java源代码(人类能看懂的文本) - 编译器 javac:检查语法 → 翻译成字节码
.class(机器能看懂的中间代码) - 类加载器 ClassLoader:把
.class加载到内存 - 字节码校验器:检查字节码合法性、没有非法操作
- 执行引擎:解释执行 + 即时编译(JIT),最终变成 CPU 指令运行
💡 JIT(Just In Time 即时编译):JVM 会把"经常运行的代码"编译成本地机器码,从此跑得飞快。这是 Java "虽然解释执行但性能很好"的秘密。
7. 解剖 HelloWorld 的每一个字
java
public class HelloWorld { // ① 定义一个公开的类,名字叫 HelloWorld
public static void main(String[] args) { // ② main 方法,程序入口
System.out.println("Hello, Java World!"); // ③ 打印字符串到控制台
}
}| 元素 | 含义 | 现在能记多少记多少 |
|---|---|---|
public | 公开的,谁都能访问 | 后面"封装"章节细讲 |
class | 类,Java 一切代码都得装在类里 | OOP 章节会讲 |
HelloWorld | 类名,首字母大写是惯例 | 命名规范 |
main | 主方法,JVM 找它启动程序 | 必须长这样,签名固定 |
static | 静态,不需要创建对象就能调用 | 第8章细讲 |
void | 没有返回值 | 方法章节 |
String[] args | 命令行参数 | 后面会用 |
System.out.println | 标准输出打印 | 等同 Python 的 print |
🤓 小知识:为什么必须叫
main?因为 JVM 启动时,会去找public static void main(String[] args)这个方法作为入口,名字写错就启动失败。
8. 实战练习
打开 ./code/HelloWorld.java 和 ./code/SystemInfo.java,完成以下挑战:
练习 1:打印你的名字
修改 HelloWorld,改成打印你自己的名字。
练习 2:打印多行
让程序连续打印 3 行文字(提示:写 3 个 println)。
练习 3:查看系统信息
运行 SystemInfo.java,看看 Java 还能告诉你哪些有趣的信息。
💻 运行方式:
bashcd code javac HelloWorld.java java HelloWorld
9. 浏览器演示
打开 demo.html 查看本章可视化演示,包括:
- Java 跨平台原理动画
- JDK/JRE/JVM 关系交互图
- 编译运行流程在线模拟
10. 面试可能会问什么?
Q1: JDK、JRE、JVM 有什么区别?
参考答案:
- JVM(Java 虚拟机):执行字节码的虚拟机,实现跨平台的核心。
- JRE(Java 运行时环境)= JVM + 核心类库(如
java.lang、java.util),只能运行别人写好的 Java 程序。 - JDK(Java 开发工具包)= JRE + 开发工具(
javac编译器、javadoc、jdb调试器等),既能开发又能运行。
包含关系:JDK ⊃ JRE ⊃ JVM。
Q2: Java 为什么能跨平台?
参考答案:因为 Java 程序不直接编译成机器码,而是先编译成 平台无关的字节码(.class),然后由各个平台上的 JVM 把字节码翻译成本地机器指令执行。所以同一份字节码可以在 Windows、Linux、macOS 上运行,只要那个平台有对应的 JVM。
Q3: 字节码和机器码有什么区别?
| 对比 | 字节码(.class) | 机器码 |
|---|---|---|
| 谁产生 | javac 编译器 | CPU 直接识别的二进制 |
| 谁执行 | JVM | CPU |
| 跨平台 | ✅ 是 | ❌ 否(绑定 CPU 架构) |
Q4: public static void main(String[] args) 中每个关键字的含义?
public:访问修饰符,让 JVM 能从外部调用它。static:静态的,不需要先 new 一个对象就能调用,因为 JVM 启动时还没有任何对象实例。void:返回值类型为空。main:固定的方法名,JVM 找它启动程序。String[] args:参数,接收命令行传入的字符串数组。
Q5: Java 是编译型还是解释型语言?
参考答案:两者都是。
- 编译:
.java→.class(编译型特性) - 解释:JVM 解释执行字节码(解释型特性)
- 同时还有 JIT 即时编译:把热点字节码编译成本地机器码缓存起来。
所以 Java 的精确说法是 "半编译半解释 + JIT" 语言。
Q6: 一个 .java 文件能定义多个类吗?
参考答案:可以,但是:
- 最多只能有一个
public类,且文件名必须与该 public 类同名。 - 其他类用 default 修饰即可(不写 public)。
- 编译后每个类生成一个独立的
.class文件。
java
// HelloWorld.java
public class HelloWorld { ... } // 文件名要叫 HelloWorld.java
class Helper { ... } // 可以,会编译出 Helper.class
class Util { ... } // 可以,会编译出 Util.class🎁 本章小结
✅ Java 通过"字节码 + JVM"实现跨平台
✅ 开发用 JDK,运行用 JRE,核心是 JVM
✅ HelloWorld 三件套:写 .java → javac 编译 → java 运行
✅ main 方法是程序入口,签名固定🔗 导航
- ⬅️ 上一章:首页 README
- ➡️ 下一章:Chapter 02 · 变量与数据类型