Java 程序基本结构
本教程共 100 篇 · 第 6 篇 · 更新于 2026-08-05 · 约 5 分钟阅读
6. Java 程序基本结构
本节目标:看懂一个 Java 源文件从上到下由哪几部分组成,彻底搞清
main方法每个单词的含义。
一个源文件的完整骨架
上一章的 Hello World 是最精简的版本。完整的 Java 源文件长这样:
package com.example.demo; // ① 包声明,最多一条,必须在最前
import java.util.Scanner; // ② 导入语句,可以有多条
/**
* ③ 文档注释:说明这个类是干什么的
*/
public class Demo { // ④ 类定义
static final String TITLE = "示例程序"; // ⑤ 成员(字段)
public static void main(String[] args) { // ⑥ 方法
System.out.println(TITLE); // ⑦ 语句
}
}
```bash
顺序是**固定的**:包声明 → 导入语句 → 类定义。写反了编译不过。
包和导入这两部分可以省略(Hello World 就没写),但一旦出现,位置不能挪。
类定义里面放**字段**和**方法**,这两者的先后顺序倒是自由的,只是习惯上字段写在前面。
## class:Java 代码的基本单位
Java 是面向对象语言,**所有代码都必须写在类里面**。
```java
public class Demo {
// 所有内容都在这对花括号之间
}
class 是关键字,必须小写。Demo 是类名,由你自己起。
类名的规则:
- 以字母、
$或_开头,后面可跟字母、数字、$、_ - 不能用关键字
- 习惯用大驼峰:每个单词首字母大写
好的类名:Hello、NoteBook、OrderService、VRPlayer
不好的类名:hello(首字母小写)、Note_Book(用了下划线)、_World(下划线开头)、Good123(数字结尾没意义)
Note「不好」指的是不符合社区约定,不是编译不过。
Note_Book完全能编译,但同事看了会皱眉。代码是写给人看的,风格统一很重要。
public 修饰符的两条硬规矩
public 表示这个类是公开的,任何地方都能访问。
它带来两条必须记住的规则:
规矩一:一个源文件里最多只能有一个 public 类。
规矩二:这个 public 类的名字必须和文件名完全一致(含大小写)。
Demo.java 里的 public 类只能叫 Demo。改名字就得改文件名,反之亦然。
不写 public 也能编译,但这个类无法从命令行直接启动。所以入口类一律加 public。
逐字拆解 main 方法
这一长串是初学者最迷惑的地方,一个词一个词过:
public static void main(String[] args) {
}
```bash
| 部分 | 含义 |
|------|------|
| `public` | 公开的,JVM 在类外部调用它,必须能访问到 |
| `static` | 静态的,不需要先创建对象就能调用 |
| `void` | 返回值类型为「无」,这个方法不返回任何东西 |
| `main` | 方法名,**JVM 写死了找这个名字**,不能改 |
| `String[] args` | 参数:一个字符串数组,接收命令行传进来的内容 |
| `{ }` | 方法体,真正执行的代码写在里面 |
为什么必须 `static`?因为 JVM 启动时还没有任何对象存在,只能调用不依赖对象的静态方法。
为什么参数是 `String[]`?因为命令行传进来的东西天然都是文本。
> [!WARNING]
> 这个签名一个字母都不能改。写成 `Main`、`voide`、`String args[]` 之外的任何变体,要么编译报错,要么运行时报「找不到主方法」。
>
> 唯一允许的变化:参数名 `args` 可以随便改(叫 `a` 也行),`String[] args` 可以写成 `String args[]`(C 风格,不推荐)。
## args 到底能干什么
`args` 不是摆设。运行程序时跟在类名后面的内容,会被塞进这个数组。
```java
public class ArgsDemo {
public static void main(String[] args) {
System.out.println("参数个数:" + args.length);
for (String arg : args) {
System.out.println("收到:" + arg);
}
}
}
编译运行,在类名后面加几个词:
javac ArgsDemo.java
java ArgsDemo apple banana cherry
```text
```text
参数个数:3
收到:apple
收到:banana
收到:cherry
不传参数时 args.length 是 0,数组是空的,不是 null。这点很多人搞错。
Tip想传带空格的参数,用双引号包起来:
java ArgsDemo "hello world",这算一个参数而不是两个。
语句:以分号结尾的最小执行单元
方法体里的每一行可执行代码叫语句,必须以分号结尾。
public class Statements {
public static void main(String[] args) {
int x = 10; // 声明语句
x = x + 5; // 赋值语句
System.out.println(x); // 方法调用语句
}
}
```java
分号是**语句的分隔符**,不是「行结束符」。所以下面这种写法语法上完全合法:
```java
int a = 1; int b = 2; System.out.println(a + b);
一行挤三条语句能跑,但可读性极差,实际开发中不要这么写。
反过来,一条长语句拆成多行也没问题,编译器认分号不认换行:
System.out.println(
"这条语句" +
"拆成了三行"
);
```bash
## 缩进和格式:编译器不管,人管
Java 对空格和换行完全不敏感。下面这段能正常编译运行:
```java
public class Ugly{public static void main(String[] args){System.out.println("能跑");}}
但没人会这么写。社区约定的格式是:
- 缩进用 4 个空格(或一个 Tab,团队内统一即可)
- 左花括号
{放在行尾,不另起一行 - 运算符两侧各留一个空格:
a + b而不是a+b - 逗号后面加空格:
method(a, b)而不是method(a,b)
IDE 有一键格式化快捷键(IntelliJ IDEA 是 Ctrl+Alt+L,macOS 是 ⌘+⌥+L),随手按一下就整齐了。
一个文件里放多个类
一个源文件可以定义多个类,但只能有一个 public 类:
public class Main {
public static void main(String[] args) {
Helper.sayHi();
}
}
class Helper { // 没有 public,允许和 Main 同文件
static void sayHi() {
System.out.println("Hi from Helper");
}
}
```bash
编译这一个文件:
```bash
javac Main.java
会生成两个 class 文件:
Main.class Helper.class
```bash
**一个类对应一个 `.class` 文件**,这条规则没有例外。
实际项目中一般一个类一个文件,只有极小的辅助类才会这么塞在一起。
## 小结
源文件的固定顺序是:包声明 → 导入语句 → 类定义,前两者可省略但不能换位置。
一个文件最多一个 `public` 类,且类名必须和文件名完全一致。
`public static void main(String[] args)` 是 JVM 认定的入口签名,除参数名外一个字母都不能改。
`args` 接收命令行参数,不传时长度为 0 而不是 `null`。
每条语句以分号结尾;缩进和换行编译器不管,但要按社区约定写整齐。