M01:环境搭建与第一个 Java 程序

📖 所属阶段: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.learncom/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

相关推荐
盗_心i1 小时前
OCPP 1.6-J 配置管理手册:GetConfiguration / ChangeConfiguration 与标准配置键
后端
传奇开心果编程1 小时前
【Go入门练中学】第1课:从零开始
后端·学习·golang
isfox1 小时前
Python 的 @classmethod 和 @staticmethod:什么时候用哪个,一次说清楚
后端
薛定谔的算法2 小时前
前端视角秒懂:Java 和 Spring Boot 的关系,就像 JS 和 React
后端
颜进强2 小时前
从零搭一套 WorkBuddy Skill 骨架:调接口 → 生成 HTML 报告的分层设计与流转拆解
前端·后端·ai编程
寒蝉1282 小时前
从真实业务场景看缓存的代价
后端
深蓝AI2 小时前
Agent 记忆层落地实战:抽取、整合、存储、检索,为什么大上下文窗口救不了你
后端·架构
steven1582 小时前
第 17 章 组件与配置问题
后端