第1章:你的第一个程序
本章只讲 Java。Python 和 C++ 等你学完前半卷再来比较。
一个故事开头
想象你要跟一个只会说标点符号的外星人对话。
"帮我算 2+3。"
外星人盯着你,一动不动。
你比划了半天,外星人终于吐出一个回答:"😂🔥👽"
完全不是你要的东西。
你跟计算机说话就是这种感觉——你觉得自己说得很清楚了,但计算机理解的完全是另一回事。计算机要求指令像乐高说明书一样精确到每一步,"组装"这个词写错一个字母它就卡住不动了。
写程序这事说白了就是学习外星人的语言,然后把你的想法翻译给它听。
1. 先跑起来再说
装一个 JDK
JDK 是 Java Development Kit 的缩写——翻译过来就是"写 Java 程序的工具箱"。里面装了编译器、运行环境、还有一大箱工具。
去 https://jdk.java.net/ 下载你操作系统对应的版本。
选哪个版本? 看课程要求。没要求就 JDK 21 或 25 都行。JDK 21 是上一代 LTS(2023-09),JDK 25 是最新的(2025-09),对你学语法几乎没有区别。
装完之后打开终端(Windows 叫命令提示符或 PowerShell,Mac/Linux 叫终端),输入:
java --version如果看到类似这样的输出,说明装好了:
openjdk 21.0.2 2024-01-16 LTS
Java(TM) SE Runtime Environment如果报"不是内部或外部命令",大概率是安装时没勾"添加到 PATH"。搜一下"JDK 环境变量配置",三步搞定。
写你的第一个程序
建一个文件夹 java-learn,在里面建一个文件 HelloWorld.java,把这五行敲进去:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}现在打开终端,cd 到 java-learn 文件夹,执行:
javac HelloWorld.java
java HelloWorld你应该看到屏幕上出现:
Hello, World!恭喜。你跟外星人的第一次对话成功了。
💥 拆了它:现在来搞事情
把 "Hello, World!" 改成 "Hello, 奶茶!",重新编译运行。
看到 Hello, 奶茶! 了吗?好,现在只改内容不改别的——很简单。
现在来搞点破坏:
把 HelloWorld.java 改成这样:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!")
}
}编译。看到什么了?
HelloWorld.java:3: error: ';' expected报错信息告诉你三件事:
- 在哪 —
HelloWorld.java:3(第三行) - 怎么了 —
';' expected(少了分号) - 精确位置 —
^箭头指的地方
记下这个感觉——你第一次亲手让程序崩溃了。后面十多年你会干无数次这种事。
🧪 动手试试
改完以下每个改动后重新编译运行,观察结果:
- 把
main改成mian - 把
String改成string(小写) - 把
System改成system - 把类名改成
helloWorld(小写开头),但不改文件名
每个改动你都会得到一个报错。看报错信息能不能猜到原因。
2. 这五行走的是什么魔法
现在拆开那五行代码。不说术语轰炸,打三个比方。
第一层:public class HelloWorld
想象你买了一个文件柜。柜子外面贴着标签:"HelloWorld"。
public class HelloWorld {
// 这个花括号里面的东西都属于这个柜子
}class= "这是一个文件柜"(Java 里叫类,就是装代码的容器)HelloWorld= 柜子的标签(名字)public= 这个柜子放在大厅里,谁都能打开(目前当固定格式看)
Java 有个死规矩:文件名必须跟柜子标签一模一样。HelloWorld.java 里面必须有一个 public class HelloWorld。差一个大写字母都不行。
第二层:public static void main(String[] args)
这行是所有 Java 程序的"正门"。Java 启动程序的时候,它会来找这扇门——如果找不到,它就进不去。
public static void main(String[] args) {
// 进了这扇门之后,里面的代码开始执行
}每个词拆开看(现在只需要大概知道,不用背):
| 词 | 什么意思 |
|---|---|
public | 门是对外开的(谁都能进来) |
static | 门是嵌在墙上的(不用先建房子就能进门) |
void | 进门之后不交作业(这个方法不返回值) |
main | 这门叫 main — Java 启动时固定找这个名字 |
(String[] args) | 进门时可以带东西(先不管这个) |
第一周,你就把它当成一个魔法咒语。你不需要理解为什么咒语是"阿瓦达索命"而不是"菠萝菠萝蜜"——先记住它长这样,后面自然就懂了。
📌 现在不需要理解:
static是什么意思?void是什么东西?String[] args为什么一堆符号?全部不需要。第5章学方法时会自然解开。你现在只需要记住:Java 找main方法作为程序入口。
第三层:System.out.println("Hello, World!")
这是真正干活的部分。它就是一个喇叭——把括号里的内容喊到屏幕上。
System.out.println("Hello, World!");拆开看:
System— Java 标准库里自带的类(在java.lang包里),管的是系统层面的输入输出out— System 类里的一个输出口,默认对着屏幕/终端println— 喊一句话,然后换行(print line 的缩写)
⚠️ 提醒一下:把
System叫成"你电脑的系统"只是用来帮你记住名字。实际上它是一个标准类。System.out一般打在终端上,但程序在服务器上跑时输出也可能被重定向到日志文件。现在你只要知道它"能把字打到屏幕上"就够了。
System.out.println("你好"); // 喊"你好"然后换行
System.out.print("你好"); // 喊"你好"不换行
System.out.print("世界"); // 接上一行 → "你好世界"
System.out.println(); // 只换行也可以喊数字:
System.out.println(42); // 输出 42
System.out.println(3 + 4); // 输出 7 Java 先算 3+4,再输出结果
System.out.println("3" + "4"); // 输出 34 引号里的 3 和 4 是文字,不是数字每句话后面要加分号
System.out.println("Hello") // ❌ 少分号,编译报错
System.out.println("World"); // ✅ 正确分号等于中文的句号——告诉编译器"这句话说完了"。
3. 编译运行到底在干什么
看完上面的,你现在知道代码长什么样了。但 javac 和 java 这两个命令在背后干了什么?
javac HelloWorld.java # 步骤1:编译
java HelloWorld # 步骤2:运行打个比方:你要给一个外国朋友寄信。
| 步骤 | 干什么 | 对应编程 |
|---|---|---|
| 写中文信 | 你写的内容 | 写 HelloWorld.java |
| 翻译成英文 | 编译器把 Java 代码翻译成"字节码" | javac HelloWorld.java → 生成 HelloWorld.class |
| 朋友读英文信 | JVM(Java 虚拟机)执行字节码 | java HelloWorld |
javac 就是翻译官(编译器),java 就是读信的人(运行环境)。
中间产物 .class 文件也叫字节码——它不是给 CPU 直接读的,是给 JVM 读的。这也是 Java 能"一次编写,到处运行"的原因:你给 Windows 编译的 .class 文件,拷到 Mac 上,用 Mac 的 JVM 一样能跑。
4. 常见的崩溃场景
💥 拆了它:新手四大天坑
下面这四个坑,每个 Java 初学者都踩过至少一次。与其等着踩,不如现在主动踩一遍。
坑1:类名跟文件名不一致
// 文件名:HelloWorld.java
public class HelloWorldd { // 多了个 d编译报错:class HelloWorldd is public, should be declared in a file named HelloWorldd.java
电脑说:"你文件名叫 HelloWorld.java,但里面那个柜子贴的标签是 HelloWorldd。我该信哪个?"
坑2:大小写弄反了
public static void main(String[] args) {
System.out.println("Hello");
}上面这段看起来对。改一个看看:
public static void Main(String[] args) { // M 大写Java 会告诉你:找不到 main 方法。因为 Java 启动时找的是全小写的 main,不是大写的 Main。
坑3:运行时加了 .class
java HelloWorld.class # ❌ 不要加 .class
java HelloWorld # ✅ 这样才对java 命令自动知道要找 .class 文件。你加上了它反而找不到了。
坑4:路径不对
你在 /home/user/java-learn 下面编译了,但运行的时候在 /home/user 下面。
cd /home/user/java-learn
javac HelloWorld.java # ✅ 编译,HelloWorld.class 在 java-learn 里
cd ..
java HelloWorld # ❌ 当前目录是 /home/user,找不到 HelloWorld.class运行 java 的时候,它默认在当前目录找 .class 文件。
5. 写一个你自己的程序
打开一个新的文件 MyFirstProgram.java:
public class MyFirstProgram {
public static void main(String[] args) {
System.out.println("你好,世界!");
System.out.println("我是新手程序员。");
System.out.println(8 + 7);
}
}编译运行:
javac MyFirstProgram.java
java MyFirstProgram输出:
你好,世界!
我是新手程序员。
15🧪 动手试试
不改代码——改内容。把第三行的 8 + 7 换成别的运算:
System.out.println(10 - 3);
System.out.println(9 * 8);
System.out.println(15 / 3);
System.out.println(10 / 3); // 猜猜这个会输出什么?最后一个 10 / 3 输出的不是 3.33,而是 3。为什么?因为 10 和 3 都是整数,Java 的整数除法只保留整数部分。这点第3章会细讲,先留个悬念。
6. 我猜你会问
Q: 为什么 Java 这么啰嗦?Python 写 print("Hello") 一行就完了。 A: Java 的设计哲学是"明确说出来你每一步想干什么"——有点像签合同,条款多但不容易误会。Python 自由度大,但自由度大也意味着容易出奇怪的 bug。各有各的好处。
Q: // 开头的行是什么? A: 注释。写给人类看的,Java 会完全忽略。
// 这是单行注释——Java 看到 // 就跳过这一行
System.out.println("Hello"); // 注释也可以跟在代码后面
/*
这是多行注释
中间的内容全被忽略
*/写注释是好习惯——你过两周再看自己写的代码,如果不加注释,你会觉得是三个月前的陌生人写的。
Q: javac 不认识怎么办? A: 说明你只装了 JRE(只有运行环境)没装 JDK(包含编译器)。去下载完整 JDK。
你现在学会的东西
写 Java 程序要经过三步:写代码(.java)→ 编译(javac)→ 运行(java)。
一个最小的 Java 程序长这样:
public class 类名 {
public static void main(String[] args) {
System.out.println("想说的话");
}
}确保这三样一致:
- 文件名 = 类名 +
.java - 类名第一个字母大写
- 每句话以
;结尾
遇到报错看三样:
- 行号 — 哪一行出问题
- 错误信息 — 什么问题
- 箭头位置 — 具体哪个字符
✅ 验收标准
完成本章后,你应该能:
- [ ] 在电脑上装好 JDK,
java --version能正常输出版本号 - [ ] 手写一个 HelloWorld.java,用
javac编译、java运行看到输出 - [ ] 故意删掉分号,自己看懂报错信息里的行号提示和错误类型
- [ ] 解释
main方法是程序的入口 - [ ] 知道
System.out.println大概在干什么(把内容输出到终端)
📌 常见卡点
- 文件名和类名大小写不一致——Java 大小写敏感,推荐都首字母大写
- `javac` 不认识——只装了 JRE 没装 JDK,去下载完整 JDK
- 漏掉分号——每句话结尾加分号,包括最后一句
- 中文符号——编译器不认识中文标点,全部用半角符号
🔜 现在不需要理解
- `public`、`static`、`void` 这几个关键字的具体含义——第5章会讲
- `String[] args` 是什么意思——后面用到时自然解开
- JVM 到底怎么执行字节码的——第一卷后半深入
🧪 练习
1. 改一改:把 HelloWorld 里的 "Hello, World!" 改成你的名字,重新编译运行。
2. 算一算:在 main 里写 System.out.println(15 + 27) 和 System.out.println(100 - 33),看看输出。
3. 找错题:下面这段代码有什么问题?
public class Test {
public static void main(String[] args) {
System.out.println("Hello")
}
}