📖 所属阶段:W1 · Java 语言基础(共 3 个模块:M01 + M02 + M03)
1. 模块概览
| 项目 | 内容 |
|---|---|
| 一句话总结 | 搞定 JDK 环境,理解 Java 程序从源码到运行的完整链路 |
| 前置依赖 | 无(零基础入门) |
| 预计耗时 | 30 分钟 |
| 评估标准 | 能在终端成功编译运行 HelloWorld.java,能说出 Java 编译型 vs JS 解释型的区别 |
1.1 概念映射速查表
| 前端概念 | Java 对应 | 说明 |
|---|---|---|
| VS Code | IntelliJ IDEA 或 VS Code + Java Extension Pack | 开发工具 |
| Chrome DevTools Console | JShell / jshell |
交互式 REPL |
node app.js(直接运行) |
javac HelloWorld.java && java HelloWorld |
Java 必须先编译再运行 |
console.log() |
System.out.println() |
输出到控制台 |
.js 文件(源码) |
.java → .class(字节码) |
JS 解释执行,Java 编译后执行 |
| Node.js | JVM(Java Virtual Machine) | 运行时环境 |
2. 核心知识点
知识点 1:Java 运行原理 ------ 编译型 vs 解释型
前端类比
你写的 JS → Node.js / 浏览器 逐行解释执行(解释型)
你写的 TS → 先 tsc 编译成 JS → 再执行(编译型)
Java 原理
arduino
你写的 .java → javac 编译成 .class(字节码)→ JVM 执行(先编译后运行)
scss
┌──────────────┐ javac 编译 ┌──────────────┐ JVM 执行 ┌──────────────┐
│ HelloWorld.java │ ──────────────→ │ HelloWorld.class │ ──────────────→ │ 输出结果 │
│ (人类可读源码) │ │ (JVM 字节码) │ │ (Hello Java) │
└──────────────┘ └──────────────┘ └──────────────┘
最小可运行代码
bash
# 第 1 步:编译(生成 .class 文件)
javac -encoding UTF-8 HelloWorld.java
# 第 2 步:运行(JVM 加载 .class 执行)
java HelloWorld
💡 为什么有两步? 就像 TS 必须先
tsc变成 JS 才能跑。Java 编译成.class后,可以在任何有 JVM 的机器上运行------这就是 "一次编写,到处运行"。
知识点 2:main 方法 ------ 程序的入口
前端类比
前端没有显式的入口方法------浏览器直接加载 HTML。但 Node.js 项目有 index.js 作为入口,类似 Java 的 main。
typescript
// Node.js 的入口文件 index.js
console.log("Hello Node");
// 运行:node index.js
Java 原理
java
// Java 的入口 ------ 每个可运行程序必须有且只有一个 main 方法
public static void main(String[] args) {
System.out.println("Hello Java");
}
逐字拆解:
| 关键字 | 含义 | 类比 |
|---|---|---|
public |
公开的,任何地方都能访问 | 前端没有强制要求 |
static |
静态的,属于类本身而非实例 | 类似 JS 的 static 方法 |
void |
返回值为空 | TypeScript 的 : void |
main |
方法名,JVM 约定的入口名 | 固定的,不能改 |
String[] args |
命令行参数(字符串数组) | 类似 process.argv |
最小可运行代码
java
package com.example.learn;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
知识点 3:package(包)------ Java 的模块系统
前端类比
typescript
// 前端:用目录结构 + import 组织代码
// src/components/UserCard.tsx
import { Button } from './Button';
java
// Java:用 package + import 组织代码
// src/com/example/learn/HelloWorld.java
package com.example.learn; // 声明我属于这个包
import java.util.List; // 从其他包导入
Java 原理
package必须放在文件第一行(注释除外)- 目录结构必须和 package 名一致:
com.example.learn→com/example/learn/ - 同一个包内的类互相访问不需要 import
目录结构对比
css
前端项目 Java 项目
────────── ──────────
src/ src/
components/ com/
Button.tsx example/
UserCard.tsx learn/
utils/ HelloWorld.java
format.ts (package com.example.learn)
知识点 4:System.out.println ------ Java 的 console.log
前端类比
typescript
console.log("Hello"); // 字符串
console.log("Name:", name); // 多个参数(逗号分隔)
console.log(`Hello ${name}`); // 模板字符串
Java 原理
java
System.out.println("Hello"); // 字符串
System.out.println("Name: " + name); // 字符串拼接(用 + 号)
System.out.printf("Hello %s", name); // 格式化输出(类似 printf)
// Java 没有模板字符串,用 + 拼接或 printf
对比表:
| 场景 | JavaScript | Java |
|---|---|---|
| 输出字符串 | console.log("hi") |
System.out.println("hi") |
| 输出变量 | Name: ${name} |
"Name: " + name |
| 不换行输出 | console.log("hi") |
System.out.print("hi") |
| 格式化 | 模板字符串 | String.format("Name=%s", name) |
知识点 5:JShell ------ Java 的浏览器控制台
前端类比
你在浏览器里按 F12 打开 DevTools Console,可以实时写 JS 代码并立即执行:
javascript
// 在 Chrome DevTools Console 里
> 1 + 1
2
> [1,2,3].map(x => x * 2)
[2, 4, 6]
Java 原理
JDK 自带了一个叫 JShell 的交互式工具,功能一样:
bash
# 在终端输入 jshell 启动
$ jshell
jshell> 1 + 1
$1 ==> 2
jshell> "Hello".toUpperCase()
$2 ==> "HELLO"
jshell> int x = 10;
x ==> 10
jshell> x * 2
$4 ==> 20
jshell> /exit
💡 JShell 是学习 Java 语法的神器------不用写完整类、不用编译,直接敲代码立即看结果。遇到不确定的语法,先在 jshell 里试一下。
3. 完整示例代码
文件:src/com/example/learn/HelloWorld.java
java
// HelloWorld.java ------ 第一个 Java 程序
// 学习目标:理解 Java 程序的基本结构,能编译并运行一个控制台程序
package com.example.learn;
public class HelloWorld {
// main 方法是程序的入口点,JVM 启动后会找这个方法
// 参数 String[] args 是命令行参数,类比前端的 process.argv
public static void main(String[] args) {
// System.out.println 类比前端的 console.log
System.out.println("Hello, Java! 🎉");
System.out.println("我是一个前端开发者,正在学习 Java");
System.out.println("当前 JDK 版本: " + System.getProperty("java.version"));
}
}
运行步骤
bash
# 方式 1:命令行(PowerShell / CMD)
cd M01-Env-FirstProgram
javac -encoding UTF-8 -d out src/com/example/learn/HelloWorld.java
java -cp out com.example.learn.HelloWorld
# 方式 2:JShell 快速测试(不用写完整类)
jshell
jshell> System.out.println("Hello from JShell!")
jshell> /exit
# 方式 3:IntelliJ IDEA
# 直接打开文件,右键 → Run 'HelloWorld.main()'
4. 练习题
题目 1(必做):打印自己的姓名和年龄
写一个程序,输出你的姓名、年龄和职业(前端开发者)。
要求:
- 创建一个新文件
MyInfo.java - 在
main方法里用System.out.println输出三行信息 - 编译运行成功
参考答案:
java
package com.example.learn;
public class MyInfo {
public static void main(String[] args) {
String name = "你的名字";
int age = 25;
String job = "前端开发者";
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
System.out.println("职业:" + job);
}
}
运行结果:
姓名:你的名字
年龄:25
职业:前端开发者
题目 2(进阶):用 JShell 试一下
打开 jshell,验证以下表达式的结果:
| 表达式 | 你猜的结果 | jshell 实际结果 |
|---|---|---|
10 / 3 |
? | ? |
10.0 / 3 |
? | ? |
"hello" + 123 |
? | ? |
Math.random() |
? | ? |
💡 这个练习会帮你发现 Java 和 JS 的一个重要区别------整数除法。做完你就知道 M02 要讲的坑是什么了 😏
5. 常见坑
坑 1:Windows 中文乱码
现象 :编译时报错 编码 GBK 的不可映射字符,或运行后中文显示乱码。
原因 :Windows 默认用 GBK 编码,而你的 .java 文件是 UTF-8 保存的。
解决 :编译时加 -encoding UTF-8 参数:
bash
javac -encoding UTF-8 HelloWorld.java
或者设置环境变量 JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 全局生效。
坑 2:public 类名必须和文件名一致
现象 :报错 类 HelloWorld 是公共的, 应在名为 HelloWorld.java 的文件中声明
原因 :Java 规定------一个 .java 文件里只能有一个 public 类,且类名必须和文件名完全一致(包括大小写)。
java
// 文件名必须是 Greeting.java
public class Greeting { ... } // ✅ 正确
// 文件名是 HelloWorld.java,但类名是 Greeting
public class Greeting { ... } // ❌ 编译报错
坑 3:包名和目录不匹配
现象 :java 运行时报错 Could not find or load main class
原因 :package com.example.learn 必须对应目录 com/example/learn/。如果目录不对,JVM 找不到类。
正确结构:
bash
src/com/example/learn/HelloWorld.java ← package com.example.learn
运行时要用完整类名:java com.example.learn.HelloWorld
6. 知识小结
arduino
M01 你学到了什么?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ Java 运行三步曲:.java → javac → .class → java 运行
✅ main 方法是入口:public static void main(String[] args)
✅ package 声明:第一行,目录必须匹配
✅ System.out.println ≈ console.log(但字符串拼接用 + 号)
✅ JShell = Java 版浏览器控制台,学语法神器
✅ Windows 注意编码:javac -encoding UTF-8
✅ public 类名 = 文件名(完全一致)
下一个模块 → M02:Java 语法基础
相关文件:JAVA-LEARN-SPEC.md | JAVA-SPRING-BLOG.md | AI-JAVA-TIPS.md