首页 / Java 入门教程 / 第一个 Java 程序:Hello World

Java 入门教程

第一个 Java 程序:Hello World

本教程共 100 篇 · 第 5 篇 · 更新于 2026-08-05 · 约 5 分钟阅读

JavaJava 入门教程Hello Worldjavac编译运行jshell

5. 第一个 Java 程序:Hello World

本节目标:亲手写出、编译并运行第一个 Java 程序,把「源码 → 字节码 → 运行结果」这条链路走通一遍。

先把代码敲出来

找个干净的目录,比如 D:\javacode~/javacode

在里面新建一个文件,名字必须是 Hello.java,注意大小写。

用任何文本编辑器打开它(记事本、VS Code、Sublime 都行),输入这段代码:

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
```bash

一个字符都别改,尤其注意:

- `public`、`class`、`static`、`void` 全部**小写**
- `Hello` 首字母**大写**,且必须和文件名 `Hello.java` 一致
- `String` 首字母**大写**
- 最后那行结尾有个**分号**
- 花括号要**成对**

保存文件。编码建议选 UTF-8

## 这几行在说什么

详细结构下一章会拆,这里先有个大概印象。

```java
public class Hello {   // ① 定义一个名叫 Hello 的类
    public static void main(String[] args) {   // ② main 方法
        System.out.println("Hello, world!");   // ③ 往屏幕打印一行文字
    }
}

是 Java 代码的基本容器。任何代码都得写在某个类里,不能像 Python 那样光秃秃写一行。

main 方法是固定的程序入口。JVM 启动后就找它,找不到就报错。这一长串写法暂时先照抄,一个字母都不能变。

System.out.println(...) 表示「打印一行并换行」。括号里双引号包起来的是要打印的字符串

编译:把源码变成字节码

打开终端,切换到 Hello.java 所在的目录

cd D:/javacode
```bash

执行编译命令:

```bash
javac Hello.java

没有任何输出就是成功了。Unix 世界的老规矩:沉默即正常。

ls(Windows 用 dir)看看目录:

ls
```java

```text
Hello.class    Hello.java

多出来的 Hello.class 就是 class 文件。它是二进制的,用记事本打开会是乱码,别管它。

Note

编译中文注释时如果报「编码 GBK 的不可映射字符」,加上编码参数:javac -encoding UTF-8 Hello.java

运行:把字节码交给 JVM

java Hello
```text

```text
Hello, world!

看到这行字,恭喜,第一个 Java 程序跑通了。

Warning

java Hello不是 java Hello.class。给 java 命令传的是类名,不是文件名,所以不带 .class 后缀。这是新手第一天必踩的坑。

整个过程串起来:

Hello.java  ──javac──▶  Hello.class  ──java──▶  Hello, world!
  源码文件              class 文件              运行结果
```bash

## 五个高频报错

第一次运行十有八九会遇到报错。下面这几个占了九成。

### 类名与文件名不一致

```text
Hello.java:1: 错误: 类 Hi 是公共的, 应在名为 Hi.java 的文件中声明
public class Hi {
       ^

规则:一个源文件里最多一个 public 类,且它的名字必须和文件名完全一致(含大小写)。

文件叫 Hello.java,类就得叫 Hello

找不到或无法加载主类

错误: 找不到或无法加载主类 Hello
```bash

三种可能:

1. 当前目录下没有 `Hello.class`——用 `ls` 确认一下,或者你根本没在那个目录里。
2. 类名大小写敲错了,比如敲成 `java hello`。
3. 编译时报错了,`.class` 根本没生成出来。

### 缺少分号

```text
Hello.java:3: 错误: 需要';'
        System.out.println("Hello, world!")
                                           ^

Java 的每条语句都以分号结尾。^ 符号指的位置就是编译器觉得缺东西的地方。

大小写写错

Hello.java:2: 错误: 找不到符号
    public static void Main(String[] args) {
```bash

或者写成 `system.out.println`、`string[] args`。

**Java 严格区分大小写**,`Main` 和 `main` 是两个完全不同的名字。JVM 只认小写的 `main`。

### 花括号不配对

```text
Hello.java:5: 错误: 需要'}'

少了一个 }。养成习惯:打完左花括号立刻补上右花括号,再往中间填内容。

Tip

看报错先看行号Hello.java:3 里的 3),再看 ^ 指的列。编译器的报错信息比想象中准,别一看到英文就跳过。

让编译产物单独放一个目录

刚才编译时,.class.java 混在同一个目录里。文件一多就乱。

javac-d 参数可以指定输出目录:

javac -d out Hello.java
```text

`out` 目录不存在会自动创建。现在结构清爽多了:

```text
javacode/
├── Hello.java
└── out/
    └── Hello.class

运行时要告诉 JVM 去哪儿找类,用 -cp(classpath 的缩写):

java -cp out Hello
```text

```text
Hello, world!

真实项目里源码放 src、产物放 targetbuild,就是这个思路的放大版。Maven、Gradle 这些构建工具帮你把参数拼好,原理没变。

Tip

-cp 也可以写成 -classpath,两者等价。不指定时默认是当前目录 .,所以前面直接 java Hello 才能跑通。

更快的两条捷径

单文件源码直接运行

Java 11 开始,简单程序可以跳过编译:

java Hello.java
```text

```text
Hello, world!

JVM 会在内存里临时编译再执行,磁盘上不产生 .class 文件。

这招适合学语法时快速验证。但实际项目里代码要依赖第三方库、要分多个文件,还是得走正规编译流程。

用 jshell 试一行

连文件都不想建的时候,用 jshell(Java 9 引入):

jshell
```java

```java
jshell> System.out.println("Hello, world!")
Hello, world!

jshell> int x = 1 + 2 * 3
x ==> 7

jshell> /exit

jshell 里不用写类、不用写 main,甚至可以省略末尾分号。想验证「5 / 2 到底等于几」这种小问题,它是最快的工具。

Note

jshell 只适合试探语法。正式代码还是要写在 .java 文件里。

换个类名练一遍

光抄一遍不算会。改成你自己的名字试试:

public class Greeting {
    public static void main(String[] args) {
        System.out.println("我叫小明");
        System.out.println("今年 18 岁");
    }
}
```bash

保存为 `Greeting.java`(文件名跟着类名改),然后:

```bash
javac Greeting.java
java Greeting
我叫小明
今年 18 岁
```bash

两个 `println` 打印两行,说明**语句是从上往下依次执行**的。

试着把第二行 `println` 改成 `print`(去掉 `ln`),再跑一次,观察换行的变化。这种小实验比看十遍讲解管用。

## 小结

Java 源文件后缀是 `.java`,文件名必须和文件里的 `public` 类名完全一致。

`javac 文件名.java` 编译成 `.class`,`java 类名`(不带后缀)运行。

编译成功没有任何输出,出错时先看行号和 `^` 指向的位置。

Java 严格区分大小写,`main` 方法的写法一个字母都不能改。

Java 11 起支持 `java Hello.java` 直接运行单文件,`jshell` 可以交互式试语法。