跳到内容

元数据卡

  • 前置知识:机器上有 JDK,成功运行过 Hello World(见 ch01-hello-world.md
  • 预计时间:20 分钟
  • 完成标志:能口述每一行 public static void main(String[] args) 的用途

老陈师傅把 Hello World 代码抄到小黑板上,开始一块一块地敲。

java
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.javaHelloWorld.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[]) 的方法。找到了,就从这里开始执行;找不到,就报错退出。名字不能改——就像你家的正门不能随便换个方向开。

你不需要现在就理解 publicstaticvoid 的全部含义。就像你不会要求一个刚学走路的人解释股四头肌和腓肠肌的区别——先学会走,再说肌肉。


第三行:System.out.println("Hello World!");

"这句才是真正干活的东西。"他把茶杯推到一边。

这句话从里到外拆开看:

  1. "Hello World!" —— 你要打印的文字。在 Java 里,文字必须用英文双引号包起来,这叫"字符串字面量"。
  2. println(...) —— "打印一行"的方法。注意 ln 是 line 的缩写——打完这行之后自动换行。
  3. System.out —— 标准输出,默认就是你的终端屏幕。System 是 Java 自带的系统工具类,不需要你写,它就住在 Java 标准库里。
  4. ; —— Java 绝大部分语句末尾都要加分号,像句号一样告诉编译器:这句话说完了。
mermaid
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 的领地边界

java
public class HelloWorld {  // ← 类的领地开始
    public static void main(String[] args) {  // ← main 的领地开始
        System.out.println("Hello World!");   // ← 真正干活的地方
    }  // ← main 的领地结束
}  // ← 类的领地结束

"花括号是 Java 的'领地边界'。开头的 { 表示领地开始,结尾的 } 表示领地结束。class 的领地包着 main 的领地,main 的领地包着代码。"

mermaid
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 的 print 不需要 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 最基本的语法规则。

Built with VitePress | Software Systems Atlas