第一个 Java 程序:Hello World
本教程共 100 篇 · 第 5 篇 · 更新于 2026-08-05 · 约 5 分钟阅读
本节目标:亲手写出、编译并运行第一个 Java 程序,把「源码 → 字节码 → 运行结果」这条链路走通一遍。
先把代码敲出来
找个干净的目录,比如 D:\javacode 或 ~/javacode。
在里面新建一个文件,名字必须是 Hello.java,注意大小写。
用任何文本编辑器打开它(记事本、VS Code、Sublime 都行),输入这段代码:
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
一个字符都别改,尤其注意:
public、class、static、void全部小写Hello首字母大写,且必须和文件名Hello.java一致String首字母大写- 最后那行结尾有个分号
- 花括号要成对
保存文件。编码建议选 UTF-8。
这几行在说什么
详细结构下一章会拆,这里先有个大概印象。
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
执行编译命令:
javac Hello.java
没有任何输出就是成功了。Unix 世界的老规矩:沉默即正常。
用 ls(Windows 用 dir)看看目录:
ls
Hello.class Hello.java
多出来的 Hello.class 就是 class 文件。它是二进制的,用记事本打开会是乱码,别管它。
Note编译中文注释时如果报「编码 GBK 的不可映射字符」,加上编码参数:
javac -encoding UTF-8 Hello.java。
运行:把字节码交给 JVM
java Hello
Hello, world!
看到这行字,恭喜,第一个 Java 程序跑通了。
Warning是
java Hello,不是java Hello.class。给java命令传的是类名,不是文件名,所以不带.class后缀。这是新手第一天必踩的坑。
整个过程串起来:
Hello.java ──javac──▶ Hello.class ──java──▶ Hello, world!
源码文件 class 文件 运行结果
五个高频报错
第一次运行十有八九会遇到报错。下面这几个占了九成。
类名与文件名不一致
Hello.java:1: 错误: 类 Hi 是公共的, 应在名为 Hi.java 的文件中声明
public class Hi {
^
规则:一个源文件里最多一个 public 类,且它的名字必须和文件名完全一致(含大小写)。
文件叫 Hello.java,类就得叫 Hello。
找不到或无法加载主类
错误: 找不到或无法加载主类 Hello
三种可能:
- 当前目录下没有
Hello.class——用ls确认一下,或者你根本没在那个目录里。 - 类名大小写敲错了,比如敲成
java hello。 - 编译时报错了,
.class根本没生成出来。
缺少分号
Hello.java:3: 错误: 需要';'
System.out.println("Hello, world!")
^
Java 的每条语句都以分号结尾。^ 符号指的位置就是编译器觉得缺东西的地方。
大小写写错
Hello.java:2: 错误: 找不到符号
public static void Main(String[] args) {
或者写成 system.out.println、string[] args。
Java 严格区分大小写,Main 和 main 是两个完全不同的名字。JVM 只认小写的 main。
花括号不配对
Hello.java:5: 错误: 需要'}'
少了一个 }。养成习惯:打完左花括号立刻补上右花括号,再往中间填内容。
Tip看报错先看行号(
Hello.java:3里的 3),再看^指的列。编译器的报错信息比想象中准,别一看到英文就跳过。
让编译产物单独放一个目录
刚才编译时,.class 和 .java 混在同一个目录里。文件一多就乱。
javac 的 -d 参数可以指定输出目录:
javac -d out Hello.java
out 目录不存在会自动创建。现在结构清爽多了:
javacode/
├── Hello.java
└── out/
└── Hello.class
运行时要告诉 JVM 去哪儿找类,用 -cp(classpath 的缩写):
java -cp out Hello
Hello, world!
真实项目里源码放 src、产物放 target 或 build,就是这个思路的放大版。Maven、Gradle 这些构建工具帮你把参数拼好,原理没变。
Tip
-cp也可以写成-classpath,两者等价。不指定时默认是当前目录.,所以前面直接java Hello才能跑通。
更快的两条捷径
单文件源码直接运行
从 Java 11 开始,简单程序可以跳过编译:
java Hello.java
Hello, world!
JVM 会在内存里临时编译再执行,磁盘上不产生 .class 文件。
这招适合学语法时快速验证。但实际项目里代码要依赖第三方库、要分多个文件,还是得走正规编译流程。
用 jshell 试一行
连文件都不想建的时候,用 jshell(Java 9 引入):
jshell
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 岁");
}
}
保存为 Greeting.java(文件名跟着类名改),然后:
javac Greeting.java
java Greeting
我叫小明
今年 18 岁
两个 println 打印两行,说明语句是从上往下依次执行的。
试着把第二行 println 改成 print(去掉 ln),再跑一次,观察换行的变化。这种小实验比看十遍讲解管用。
小结
Java 源文件后缀是 .java,文件名必须和文件里的 public 类名完全一致。
javac 文件名.java 编译成 .class,java 类名(不带后缀)运行。
编译成功没有任何输出,出错时先看行号和 ^ 指向的位置。
Java 严格区分大小写,main 方法的写法一个字母都不能改。
Java 11 起支持 java Hello.java 直接运行单文件,jshell 可以交互式试语法。