元数据卡
- 前置知识:机器上有 JDK,成功运行过 Hello World(见 ch01-hello-world.md)
- 预计时间:20 分钟
- 完成标志:能口述每一行
public static void main(String[] args)的用途
老陈师傅把 Hello World 代码抄到小黑板上,开始一块一块地敲。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}他在黑板角落画了一个村庄的简图,把村口的城门、广场、公告板依次标出来——"代码也是一座城。"
第一行:public class HelloWorld
"Java 里所有代码都待在'类'这个容器里。"
class —— 关键词。告诉编译器:嘿,我要定义一个类了。
HelloWorld —— 类的名字。你自己起的。
public —— 访问修饰符。你现在只需要知道:这段程序里 public 类的名字必须和文件名一模一样。至于什么时候可以省略 public,以及省略后有什么影响,后面的章节会讲。
⚠️ 最重要的规则:类名必须和文件名一模一样。
HelloWorld.java里面就只能有一个public class HelloWorld。大小写也算——Helloworld.java和HelloWorld.java是两个文件。
你可以把 class 理解成变量村的房屋——所有代码都住在这个房子里。
第二行:public static void main(String[] args)
老陈师傅的手指在这一行停了一下。
"这是整个程序的'城门'。Java 虚拟机启动你的程序时,第一件事就是找这扇城门——名字叫 main 的方法。如果找不到,它就不知道从哪里开始执行。"
他逐个词敲过去:
| 词 | 做什么 | 你现在需要知道的程度 |
|---|---|---|
public | 让虚拟机能够找到这扇城门 | 知道就行,第7章细讲 |
static | 让这个方法在程序启动时就已经存在,不需要先"造"任何东西 | 知道就行,第5章细讲 |
void | 这个方法不返回任何值 | 知道就行,第5章细讲 |
main | 城门名字——程序入口 | 必须记住 |
String[] args | 命令行参数,后面会用到 | 暂时无视 |
为什么是
main不是别的? 这是 Java 语言设计者定下的规矩。Java 虚拟机启动时,它会在你指定的类里面寻找一个签名正好是public static void main(String[])的方法。找到了,就从这里开始执行;找不到,就报错退出。名字不能改——就像你家的正门不能随便换个方向开。
你不需要现在就理解 public、static、void 的全部含义。就像你不会要求一个刚学走路的人解释股四头肌和腓肠肌的区别——先学会走,再说肌肉。
第三行:System.out.println("Hello World!");
"这句才是真正干活的东西。"他把茶杯推到一边。
这句话从里到外拆开看:
"Hello World!"—— 你要打印的文字。在 Java 里,文字必须用英文双引号包起来,这叫"字符串字面量"。println(...)—— "打印一行"的方法。注意ln是 line 的缩写——打完这行之后自动换行。System.out—— 标准输出,默认就是你的终端屏幕。System是 Java 自带的系统工具类,不需要你写,它就住在 Java 标准库里。;—— Java 绝大部分语句末尾都要加分号,像句号一样告诉编译器:这句话说完了。
flowchart LR
subgraph System["System(系统工具箱)"]
out["out(输出口)"]
end
out --> println["println(打印一行)"]
println --> text[""Hello World!"(要显示的文字)"]
text --> semicolon[";(句号——语句结束)"]"记住分号。"他说。"漏掉分号是新手最常犯的错,编译器会直接骂你。"
同一行多句,行不行? 语法上可以。
System.out.println("A"); System.out.println("B");放到一行能跑。但没人这么写。每行一条语句,代码才像人能读的东西。
花括号 { } —— Java 的领地边界
public class HelloWorld { // ← 类的领地开始
public static void main(String[] args) { // ← main 的领地开始
System.out.println("Hello World!"); // ← 真正干活的地方
} // ← main 的领地结束
} // ← 类的领地结束"花括号是 Java 的'领地边界'。开头的 { 表示领地开始,结尾的 } 表示领地结束。class 的领地包着 main 的领地,main 的领地包着代码。"
graph TD
subgraph class_territory["HelloWorld 类的领地 { }"]
subgraph main_territory["main 方法的领地 { }"]
code["System.out.println();"]
end
end注意一个细节:领地是可以嵌套的。大领地(类)里面包着小领地(方法),小领地里面才是真正的代码。就像变量村——村庄里面包着房屋,房屋里面住着人。
即兴对比:Python 和 C++ 怎么写 main
Python 差异
阿花又凑过来,"他们在 Java 里用花括号圈领地,但 Python 不这么干。"
Python 不用花括号。Python 用缩进表示领地:
python# hello.py def main(): print("Hello World!") # 缩进表示属于 main if __name__ == "__main__": main()缩进错了,程序就跑错了——甚至跑不了。Java 用花括号,缩进只是给别人看的,编译器不在意。
另外 Python 的
System.out前缀——这是设计哲学的差异:Java 把一切都包在类里,Python 把最常用的东西直接给你。
C++ 差异
老陈把手册又翻了一页,"同一个家族的 C++,写法也有差别。"
C++ 的 main 长这样:
cpp#include <iostream> // 包含输入输出库 int main() { // Java: public static void main std::cout << "Hello World!" << std::endl; return 0; // Java 不需要 return }最大的区别:C++ 你要自己
#include用到的库,Java 自动 import 最常用的。C++ 的main必须返回int(0 表示成功),Java 的main返回void(什么都不返回)。
关键知识点速查
| 代码片段 | 它是什么? | 记住它 |
|---|---|---|
public class HelloWorld | 定义一个公开的类 | 类名 = 文件名 |
public static void main(String[] args) | 程序的入口(城门) | 死了都要记住 |
System.out.println(...) | 打印一行到终端 | J 大写,S 大写 |
{ } | 领地边界,成对出现 | 有 {`` 就要有 }`` |
; | 语句结束(句号) | 英文分号,每句末尾 |
验收标准
- [ ] 你能逐行解释 Hello World 代码中每一行的作用
- [ ] 你能指出
main方法是程序的什么位置 - [ ] 你能说出花括号
{ }的作用 - [ ] 你知道
System.out.println中的ln是什么意思 - [ ] 你能说出为什么
main的名字不能改
→ 下一步
逐行拆解之后,你已经知道每块砖是干什么用的了。但怎样砌砖才算规范的?花括号怎么配对、分号往哪放、名字能不能写大写?
下一步:ch01-syntax-rules.md —— Java 最基本的语法规则。