Skip to content
第 3 / 250 章后端⏱ 10 分钟阅读

第 3 章:第一个 Hello World

学习目标

  • 理解 Java 程序的编译和运行流程
  • 掌握 public classmain 方法、System.out.println 的含义
  • 命令行IntelliJ IDEA 两种方式跑通第一个 Java 程序
  • 学会阅读带行号注释的代码

一、Hello World 的"重量"

学习任何编程语言,第一个程序都是 Hello World。但 Java 的 Hello World 比 Python、JS 重得多——这是 Java 语法啰嗦的"原罪"。

先看一段 Python 同等功能的代码:

python
# Python 一行搞定
print("Hello, World!")

再对比 Java:

java
// Java 至少 5 行
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

为什么 Java 这么"重"?

这背后藏着 Java 的三个核心设计哲学:

接下来,每一行代码都注释清楚,让你知其然更知其所以然。

二、最简 Hello World 代码解析

完整代码

java
/**
 * 我的第一个 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.outprintln 方法,打印一行并换行
}main 方法结束
}类结束

关键设计决策详解

public class HelloWorld 是什么意思?

java
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 启动时会调用这个方法。

java
public     static     void      main     (String[]    args)     {
 ↑          ↑          ↑         ↑        ↑            ↑
 访问修饰符  静态       返回类型   方法名   参数类型      参数名
修饰符含义为什么必须?
public公开方法JVM 在类外部调用 main,必须 public
static静态方法JVM 不需要创建对象就能调用
void无返回值JVM 不关心 main 的返回值
main方法名JVM 约定查找的方法名(不能改)
String[] args命令行参数接收外部传入的参数

System.out.println("Hello, World!"); 是怎么执行的?

链式调用解析

java
System.out.println("Hello, World!");
//  └┬─┘ └┬┘ └─┬───┘   └─────┬──────┘
//   类    字段  方法        参数
  • Systemjava.lang 包下的类,提供系统级功能
  • System.out:System 类的 public static final PrintStream out 静态字段(标准输出流)
  • println(String):PrintStream 类的方法,打印字符串并换行

为什么 System.out 是静态的?

全程序只有一个标准输出(stdout),没必要每个对象都有自己的。所以用 static 让所有类共享同一个实例。这种"全局静态字段"在 Java 里叫 Singleton 模式的最简形式。

④ println vs print vs printf 的区别

java
// 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:创建项目目录

bash
# 在合适的位置创建项目目录
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

bash
# Linux/macOS 用 touch + 编辑器
touch HelloWorld.java

# Windows PowerShell
New-Item HelloWorld.java

内容(所有字符都不能错,包括大小写、分号):

java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

中文分号陷阱

; 是英文半角分号。复制代码时有时会被替换成中文全角 ,导致编译错误:

error: ';' expected

排查方法:用编辑器查看文件的十六进制编码,中文分号是 0xEFBC9B,英文是 0x3B

步骤 3:编译(javac)

bash
# javac 是 Java 编译器(Java Compiler)
javac HelloWorld.java

发生了什么?

如果编译成功,目录下会出现 HelloWorld.class 文件:

bash
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)

bash
# java 是 Java 运行时(注意:不加 .class 后缀)
java HelloWorld

期望输出

Hello, World!

发生了什么?

运行命令不要加 .class 后缀!

bash
java HelloWorld      # ✅ 正确
java HelloWorld.class # ❌ 错误:找不到类

java 命令会自动在类路径下查找 .class 文件,手写 .class 会去找 HelloWorld.class.class

步骤 5:清理

bash
# 删除字节码文件(不影响源代码)
rm HelloWorld.class      # Linux/macOS
del HelloWorld.class     # Windows CMD
Remove-Item HelloWorld.class  # Windows PowerShell

四、用 IntelliJ IDEA 跑通(日常开发)

命令行是"理解原理",IDEA 是"日常开发"。两者都要会。

步骤 1:创建新项目

  1. 打开 IDEA → New Project
  2. 选择 Java → 配置项目 SDK 为 17
  3. 勾选 Add sample code(生成示例代码,本教程不勾选,自己写)
  4. Next → 项目名 01-hello-world → Finish

步骤 2:创建 Java 类

  1. 右键 src 目录 → NewJava Class
  2. 输入类名 HelloWorld
  3. 回车

IDEA 会自动生成:

java
package PACKAGE_NAME;  // IDEA 自动加的

public class HelloWorld {
}

步骤 3:写代码

在类里加上 main 方法:

方式 A:手动写

java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

方式 B:使用 IDEA 模板(推荐)

  1. 在类体内输入 main 然后按 Tab 键(IDEA 快捷键叫 Live Template
  2. IDEA 自动补全:
java
public class HelloWorld {
    public static void main(String[] args) {  // ← IDEA 自动补全
        // 光标定位在这里
    }
}
  1. 在方法体内输入 sout 然后按 Tab
java
        System.out.println();  // ← IDEA 自动补全
  1. 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:调试(如果出问题)

如果输出不对或者想看执行过程:

  1. System.out.println(...) 那一行左边点击一下,会出现一个红点(断点)
  2. 右键 → Debug 'HelloWorld.main()'
  3. 程序会停在断点处,底部出现 Debugger 窗口
  4. F8 单步执行,按 F9 继续运行

五、Hello World 的几个变体

变体 1:带命令行参数

java
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!");
        }
    }
}

编译运行

bash
$ javac HelloArgs.java
$ java HelloArgs 张三
# 输出:Hello, 张三!

$ java HelloArgs
# 输出:Hello, World!

在 IDEA 里运行需要配置 Program Arguments: Run → Edit Configurations → Program arguments: 张三

变体 2:打印多行

java
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 艺术

java
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

java
System.out.println(1);
System.out.println(2);
// ... 一直写到 10

为什么这样写?

这个练习故意让你体验"重复代码的坏味道"。等学到第 9 章循环,你会知道一个 for 循环就能搞定。

练习 3:挑战题

写一个 Calculator.java,接收两个命令行参数并打印它们的和:

bash
$ java Calculator 3 5
# 输出:3 + 5 = 8

$ java Calculator 10 20
# 输出:10 + 20 = 30

提示:把 String[] args 转成 int

java
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 默认编码与控制台编码不一致。

解决

bash
# 启动时指定编码
java -Dfile.encoding=UTF-8 HelloWorld

或在 IDEA 里:Run → Edit Configurations → VM options: -Dfile.encoding=UTF-8

Q3: 一个 .java 文件能写多个 class 吗?

可以,但只能有一个 public class(且文件名必须与 public 类同名):

java
// 文件名: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官方推荐,因为类型在前更清晰:

java
public static void main(String[] args) { }   // ✅ 推荐
public static void main(String args[]) { }   // ⚠️ C 风格遗留

推荐阅读


下一章第 4 章:变量与数据类型

你已经完成了

  • ✅ 理解 Java 程序的编译和运行流程
  • ✅ 掌握 public classmainSystem.out.println 的含义
  • ✅ 命令行编译运行 Hello World
  • ✅ IntelliJ IDEA 创建并运行项目
  • ✅ 完成 3 个动手练习(基础/进阶/挑战)

本站基于 VitePress 构建 · 由 Codebook 团队维护