第 3 章:第一个 Hello World
学习目标
- 理解 Java 程序的编译和运行流程
- 掌握
public class、main方法、System.out.println的含义 - 用命令行和 IntelliJ IDEA 两种方式跑通第一个 Java 程序
- 学会阅读带行号注释的代码
一、Hello World 的"重量"
学习任何编程语言,第一个程序都是 Hello World。但 Java 的 Hello World 比 Python、JS 重得多——这是 Java 语法啰嗦的"原罪"。
先看一段 Python 同等功能的代码:
# Python 一行搞定
print("Hello, World!")再对比 Java:
// Java 至少 5 行
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}为什么 Java 这么"重"?
这背后藏着 Java 的三个核心设计哲学:
接下来,每一行代码都注释清楚,让你知其然更知其所以然。
二、最简 Hello World 代码解析
完整代码
/**
* 我的第一个 Java 程序
*
* 这是 Javadoc 注释:用于生成 API 文档
* 普通注释用 //(单行)或 /* */(多行)
*/
public class HelloWorld { // ① 类声明:public class + 类名
public static void main(String[] args) { // ② main 方法:Java 程序固定入口
System.out.println("Hello, World!"); // ③ 打印语句
} // ④ main 方法结束
} // ⑤ 类结束逐行注释
| 行号 | 代码 | 含义 |
|---|---|---|
| ① | public class HelloWorld { | 声明一个公开类,类名必须叫 HelloWorld(与文件名一致) |
| ② | public static void main(String[] args) { | 声明 main 方法——Java 程序的固定入口 |
| ③ | System.out.println("Hello, World!"); | 调用 System.out 的 println 方法,打印一行并换行 |
| ④ | } | main 方法结束 |
| ⑤ | } | 类结束 |
关键设计决策详解
① public class HelloWorld 是什么意思?
public class HelloWorld {
↑ ↑ ↑
访问修饰符 关键字 类名public:访问修饰符,表示这个类对所有包可见。Java 要求public类的类名必须与文件名完全一致。class:关键字,表示"这是一个类"。HelloWorld:类名,遵循 UpperCamelCase 命名规范。
为什么文件名必须与 public 类名一致?
Java 编译器(
javac)需要根据文件名找到对应的public class。如果不一致:bash$ javac helloworld.java error: class HelloWorld is public, should be declared in a file named HelloWorld.java这条限制保证了"文件名即类名"的清晰映射,但一个
.java文件可以有多个非 public 的辅助类。
② public static void main(String[] args) 是什么?
这是 Java 程序的固定入口,JVM 启动时会调用这个方法。
public static void main (String[] args) {
↑ ↑ ↑ ↑ ↑ ↑
访问修饰符 静态 返回类型 方法名 参数类型 参数名| 修饰符 | 含义 | 为什么必须? |
|---|---|---|
public | 公开方法 | JVM 在类外部调用 main,必须 public |
static | 静态方法 | JVM 不需要创建对象就能调用 |
void | 无返回值 | JVM 不关心 main 的返回值 |
main | 方法名 | JVM 约定查找的方法名(不能改) |
String[] args | 命令行参数 | 接收外部传入的参数 |
③ System.out.println("Hello, World!"); 是怎么执行的?
链式调用解析:
System.out.println("Hello, World!");
// └┬─┘ └┬┘ └─┬───┘ └─────┬──────┘
// 类 字段 方法 参数System:java.lang包下的类,提供系统级功能System.out:System 类的public static final PrintStream out静态字段(标准输出流)println(String):PrintStream 类的方法,打印字符串并换行
为什么 System.out 是静态的?
全程序只有一个标准输出(stdout),没必要每个对象都有自己的。所以用
static让所有类共享同一个实例。这种"全局静态字段"在 Java 里叫 Singleton 模式的最简形式。
④ println vs print vs printf 的区别
// print:不换行
System.out.print("Hello");
System.out.print(" World");
// 输出:Hello World(一行)
// println:换行(print + line)
System.out.println("Hello");
System.out.println("World");
// 输出:
// Hello
// World
// (两行)
// printf:格式化输出(C 风格)
System.out.printf("Hello, %s! 你今年 %d 岁%n", "张三", 18);
// 输出:Hello, 张三! 你今年 18 岁
// %s = 字符串占位符,%d = 整数占位符,%n = 换行符三、用命令行编译运行(理解原理)
第一次跑通 Hello World 非常重要
不要跳过这一步!先用命令行跑通,理解 Java 程序"先编译、后运行"的本质。
步骤 1:创建项目目录
# 在合适的位置创建项目目录
mkdir -p ~/java-learning/01-hello-world
cd ~/java-learning/01-hello-world
# Windows PowerShell
mkdir C:\java-learning\01-hello-world
cd C:\java-learning\01-hello-world步骤 2:编写源代码
创建文件 HelloWorld.java:
# Linux/macOS 用 touch + 编辑器
touch HelloWorld.java
# Windows PowerShell
New-Item HelloWorld.java内容(所有字符都不能错,包括大小写、分号):
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}中文分号陷阱
;是英文半角分号。复制代码时有时会被替换成中文全角;,导致编译错误:error: ';' expected排查方法:用编辑器查看文件的十六进制编码,中文分号是
0xEFBC9B,英文是0x3B。
步骤 3:编译(javac)
# javac 是 Java 编译器(Java Compiler)
javac HelloWorld.java发生了什么?
如果编译成功,目录下会出现 HelloWorld.class 文件:
ls -la
# -rw-r--r-- HelloWorld.class ← 新生成的字节码文件
# -rw-r--r-- HelloWorld.java ← 源代码常见编译错误:
错误 1:类名与文件名不一致
$ javac helloworld.java
error: class HelloWorld is public, should be declared in a file named HelloWorld.java
错误 2:少了分号
$ javac HelloWorld.java
HelloWorld.java:3: error: ';' expected
System.out.println("Hello, World!")
^
错误 3:括号不匹配
$ javac HelloWorld.java
HelloWorld.java:1: error: reached end of file while parsing
}
^步骤 4:运行(java)
# java 是 Java 运行时(注意:不加 .class 后缀)
java HelloWorld期望输出:
Hello, World!发生了什么?
运行命令不要加 .class 后缀!
bashjava HelloWorld # ✅ 正确 java HelloWorld.class # ❌ 错误:找不到类
java命令会自动在类路径下查找.class文件,手写.class会去找HelloWorld.class.class。
步骤 5:清理
# 删除字节码文件(不影响源代码)
rm HelloWorld.class # Linux/macOS
del HelloWorld.class # Windows CMD
Remove-Item HelloWorld.class # Windows PowerShell四、用 IntelliJ IDEA 跑通(日常开发)
命令行是"理解原理",IDEA 是"日常开发"。两者都要会。
步骤 1:创建新项目
- 打开 IDEA → New Project
- 选择 Java → 配置项目 SDK 为 17
- 勾选 Add sample code(生成示例代码,本教程不勾选,自己写)
- Next → 项目名
01-hello-world→ Finish
步骤 2:创建 Java 类
- 右键
src目录 → New → Java Class - 输入类名
HelloWorld - 回车
IDEA 会自动生成:
package PACKAGE_NAME; // IDEA 自动加的
public class HelloWorld {
}步骤 3:写代码
在类里加上 main 方法:
方式 A:手动写
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}方式 B:使用 IDEA 模板(推荐)
- 在类体内输入
main然后按Tab键(IDEA 快捷键叫 Live Template) - IDEA 自动补全:
public class HelloWorld {
public static void main(String[] args) { // ← IDEA 自动补全
// 光标定位在这里
}
}- 在方法体内输入
sout然后按Tab:
System.out.println(); // ← IDEA 自动补全- 在
println()的括号里写"Hello, World!"
步骤 4:运行
方式 A:点击绿色箭头 ▶
- 在
main方法左边有一个绿色三角形箭头,点击它 - 选择 Run 'HelloWorld.main()'
方式 B:右键运行
- 在代码编辑区右键 → Run 'HelloWorld.main()'
方式 C:快捷键
- macOS:
⌃ + ⌥ + R - Windows:
Ctrl + Shift + F10
期望输出(IDEA 底部 Run 窗口):
Hello, World!
Process finished with exit code 0
exit code 0表示程序正常退出。任何非 0 值都表示异常退出。
步骤 5:调试(如果出问题)
如果输出不对或者想看执行过程:
- 在
System.out.println(...)那一行左边点击一下,会出现一个红点(断点) - 右键 → Debug 'HelloWorld.main()'
- 程序会停在断点处,底部出现 Debugger 窗口
- 按
F8单步执行,按F9继续运行
五、Hello World 的几个变体
变体 1:带命令行参数
public class HelloArgs {
public static void main(String[] args) {
// args 是命令行传入的参数
if (args.length > 0) {
System.out.println("Hello, " + args[0] + "!");
} else {
System.out.println("Hello, World!");
}
}
}编译运行:
$ javac HelloArgs.java
$ java HelloArgs 张三
# 输出:Hello, 张三!
$ java HelloArgs
# 输出:Hello, World!在 IDEA 里运行需要配置 Program Arguments:
Run → Edit Configurations → Program arguments: 张三
变体 2:打印多行
public class HelloMultiLine {
public static void main(String[] args) {
System.out.println("=== Java 学习日志 ===");
System.out.println("日期:2026-08-12");
System.out.println("作者:你的名字");
System.out.println("目标:成为 Java 工程师");
}
}输出:
=== Java 学习日志 ===
日期:2026-08-12
作者:你的名字
目标:成为 Java 工程师变体 3:带 ASCII 艺术
public class HelloArt {
public static void main(String[] args) {
System.out.println(" ___ ___ _ _ ");
System.out.println(" | _ )/ _ \\ _ _| (_)_ _ ");
System.out.println(" | _ \\ (_) | '_| | | '_| ");
System.out.println(" |___/\\___/|_| |_|_|_| ");
System.out.println("Hello, Java World!");
}
}六、完整代码清单
📦 完整代码位于仓库:
examples/hello-java/
包含三个文件:
HelloWorld.java— 最简版本HelloArgs.java— 命令行参数版本HelloArt.java— ASCII 艺术版本README.md— 运行指引
七、本章小结
| 要点 | 关键 |
|---|---|
| Java 程序的本质 | 先 javac 编译为 .class 字节码,再 java 运行 |
| main 方法签名 | public static void main(String[] args) — 固定写法 |
| System.out.println | 打印字符串 + 换行 |
| 三种注释 | // 单行、/* */ 多行、/** */ Javadoc |
| 编译错误排查 | 类名与文件名一致、分号别用中文、括号要匹配 |
| 运行错误排查 | java 命令不加 .class、注意大小写 |
动手练习
练习 1:基础题(必做)
写一个 SelfIntroduction.java,打印你的自我介绍:
=== 我的自我介绍 ===
姓名:张三
职业:Java 工程师
爱好:阅读、跑步、编程
格言:Stay Hungry, Stay Foolish.练习 2:进阶题
写一个 PrintNumber.java,打印 1 到 10 的数字,每个数字一行。
提示:现在你还不会循环,所以老老实实写 10 个 println:
System.out.println(1);
System.out.println(2);
// ... 一直写到 10为什么这样写?
这个练习故意让你体验"重复代码的坏味道"。等学到第 9 章循环,你会知道一个 for 循环就能搞定。
练习 3:挑战题
写一个 Calculator.java,接收两个命令行参数并打印它们的和:
$ java Calculator 3 5
# 输出:3 + 5 = 8
$ java Calculator 10 20
# 输出:10 + 20 = 30提示:把 String[] args 转成 int:
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);常见问题
Q1: IDEA 里运行报错 "Error: java: invalid target release: 17"
原因:IDEA 使用的 JDK 版本低于 17。
解决:File → Project Structure → Project SDK → 选择 17
Q2: 控制台中文乱码
原因:JVM 默认编码与控制台编码不一致。
解决:
# 启动时指定编码
java -Dfile.encoding=UTF-8 HelloWorld或在 IDEA 里:Run → Edit Configurations → VM options: -Dfile.encoding=UTF-8
Q3: 一个 .java 文件能写多个 class 吗?
可以,但只能有一个 public class(且文件名必须与 public 类同名):
// 文件名:Helper.java
public class Helper {
public static void main(String[] args) {
System.out.println("主类");
}
}
// 辅助类,不是 public,文件名不需要等于它
class HelperUtil {
public static String greet() {
return "Hello from HelperUtil";
}
}不过企业级项目通常一个类一个文件,便于查找。
Q4: 为什么要写 String[] args 而不是 String args[]?
两种写法都合法,但 String[] args 是官方推荐,因为类型在前更清晰:
public static void main(String[] args) { } // ✅ 推荐
public static void main(String args[]) { } // ⚠️ C 风格遗留推荐阅读
- 📖 《Java 核心技术 卷 1》第 2-3 章 — Hello World 与基础语法
- 🌐 IntelliJ IDEA 官方文档 — IDE 使用指南
- 🌐 JDK 17 官方文档 — 标准库参考
下一章:第 4 章:变量与数据类型 →
你已经完成了:
- ✅ 理解 Java 程序的编译和运行流程
- ✅ 掌握
public class、main、System.out.println的含义 - ✅ 命令行编译运行 Hello World
- ✅ IntelliJ IDEA 创建并运行项目
- ✅ 完成 3 个动手练习(基础/进阶/挑战)