首页 / Java 入门教程 / Java 程序基本结构

Java 入门教程

Java 程序基本结构

本教程共 100 篇 · 第 6 篇 · 更新于 2026-08-05 · 约 5 分钟阅读

JavaJava 入门教程程序结构main 方法类定义命令行参数

本节目标:看懂一个 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);            // ⑦ 语句
    }
}

顺序是固定的:包声明 → 导入语句 → 类定义。写反了编译不过。

包和导入这两部分可以省略(Hello World 就没写),但一旦出现,位置不能挪。

类定义里面放字段方法,这两者的先后顺序倒是自由的,只是习惯上字段写在前面。

class:Java 代码的基本单位

Java 是面向对象语言,所有代码都必须写在类里面

public class Demo {
    // 所有内容都在这对花括号之间
}

class 是关键字,必须小写。Demo 是类名,由你自己起。

类名的规则:

  • 以字母、$_ 开头,后面可跟字母、数字、$_
  • 不能用关键字
  • 习惯用大驼峰:每个单词首字母大写

好的类名:HelloNoteBookOrderServiceVRPlayer

不好的类名: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) {
}
部分含义
public公开的,JVM 在类外部调用它,必须能访问到
static静态的,不需要先创建对象就能调用
void返回值类型为「无」,这个方法不返回任何东西
main方法名,JVM 写死了找这个名字,不能改
String[] args参数:一个字符串数组,接收命令行传进来的内容
{ }方法体,真正执行的代码写在里面

为什么必须 static?因为 JVM 启动时还没有任何对象存在,只能调用不依赖对象的静态方法。

为什么参数是 String[]?因为命令行传进来的东西天然都是文本。

Warning

这个签名一个字母都不能改。写成 MainvoideString args[] 之外的任何变体,要么编译报错,要么运行时报「找不到主方法」。

唯一允许的变化:参数名 args 可以随便改(叫 a 也行),String[] args 可以写成 String args[](C 风格,不推荐)。

args 到底能干什么

args 不是摆设。运行程序时跟在类名后面的内容,会被塞进这个数组。

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
参数个数: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);            // 方法调用语句
    }
}

分号是语句的分隔符,不是「行结束符」。所以下面这种写法语法上完全合法:

int a = 1; int b = 2; System.out.println(a + b);

一行挤三条语句能跑,但可读性极差,实际开发中不要这么写。

反过来,一条长语句拆成多行也没问题,编译器认分号不认换行:

System.out.println(
    "这条语句" +
    "拆成了三行"
);

缩进和格式:编译器不管,人管

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");
    }
}

编译这一个文件:

javac Main.java

会生成两个 class 文件:

Main.class    Helper.class

一个类对应一个 .class 文件,这条规则没有例外。

实际项目中一般一个类一个文件,只有极小的辅助类才会这么塞在一起。

小结

源文件的固定顺序是:包声明 → 导入语句 → 类定义,前两者可省略但不能换位置。

一个文件最多一个 public 类,且类名必须和文件名完全一致。

public static void main(String[] args) 是 JVM 认定的入口签名,除参数名外一个字母都不能改。

args 接收命令行参数,不传时长度为 0 而不是 null

每条语句以分号结尾;缩进和换行编译器不管,但要按社区约定写整齐。