main 方法
当你想直接运行一个 Java 类时(通过命令行 java MyClass),Java 虚拟机(JVM)会寻找该类中的一个特殊方法,作为程序的入口点,这个方法就是 public static void main(String[] args)。

public: 访问修饰符,表示这个方法可以被任何其他类访问。static: 关键字,表示这个方法属于类本身,而不是类的某个实例(对象),你不需要创建对象就可以调用它,这是 JVM 能够直接找到它的原因。void: 返回类型,表示这个方法在执行完毕后不返回任何值。main: 方法名,JVM 约定的固定名称。String[] args: 参数列表,这是一个字符串数组,用于接收在命令行中传入的参数。
运行类的 main 方法(最常见的场景)
这是最直接的方式,通常用于启动一个应用程序。
步骤 1:编写 Java 类
创建一个名为 MyFirstProgram.java 的文件。
// MyFirstProgram.java
public class MyFirstProgram {
// 这是程序的入口点
public static void main(String[] args) {
System.out.println("Hello, World! 程序已启动。");
// 调用同一个类中的另一个方法
printMessage();
}
// 一个普通的实例方法
public void printMessage() {
System.out.println("这是通过 main 方法调用的另一个方法。");
}
}
步骤 2:编译代码
打开终端或命令提示符,导航到 MyFirstProgram.java 文件所在的目录,然后使用 javac 命令进行编译。
javac MyFirstProgram.java
如果编译成功,你会得到一个 MyFirstProgram.class 文件,这是 Java 字节码。

步骤 3:运行类
使用 java 命令来运行这个类。注意:这里运行的是类名,而不是文件名,并且不需要加 .class 后缀。
java MyFirstProgram
输出结果:
Hello, World! 程序已启动。
这是通过 main 方法调用的另一个方法。
调用其他类的方法(更常见的情况)
在实际开发中,main 方法通常只负责启动程序,而大部分业务逻辑都在其他类的方法中,这时你需要创建对象来调用这些非 static 方法。
步骤 1:编写多个 Java 类
假设你有两个文件:MainApp.java(包含 main 方法)和 Calculator.java(包含可调用的方法)。

文件 1: Calculator.java
// Calculator.java
public class Calculator {
// 一个实例方法,需要创建对象才能调用
public int add(int a, int b) {
return a + b;
}
// 另一个实例方法
public void displayResult(int result) {
System.out.println("计算结果是: " + result);
}
// 一个静态方法,可以直接通过类名调用
public static void printWelcomeMessage() {
System.out.println("欢迎使用计算器!");
}
}
文件 2: MainApp.java
// MainApp.java
public class MainApp {
public static void main(String[] args) {
// 1. 调用 Calculator 类的静态方法
Calculator.printWelcomeMessage();
// 2. 创建 Calculator 类的实例(对象)
Calculator myCalculator = new Calculator();
// 3. 使用对象调用实例方法
int sum = myCalculator.add(10, 25);
myCalculator.displayResult(sum);
}
}
步骤 2 & 3:编译和运行
在终端中,确保两个文件在同一个目录下,然后编译并运行 MainApp。
# 编译所有 .java 文件 javac *.java # 运行包含 main 方法的类 java MainApp
输出结果:
欢迎使用计算器!
计算结果是: 35
关键区别:静态方法 vs. 实例方法
理解这两者的区别至关重要:
| 特性 | 静态方法 (static) |
实例方法 |
|---|---|---|
| 所属 | 属于类本身 | 属于类的实例(对象) |
| 调用方式 | 通过类名直接调用 (e.g., ClassName.method()) |
必须先创建对象,然后通过对象调用 (e.g., obj.method()) |
| 内存占用 | 类加载时存在于方法区,整个程序生命周期中只有一份 | 每创建一个对象,就会在堆内存中生成一份方法引用 |
| 访问权限 | 只能访问类的静态成员(静态变量、静态方法) | 可以访问类的所有成员,包括实例变量、实例方法和静态成员 |
| 类比 | 类似于一个工具箱里的工具,谁都能用 | 类似于你自己的汽车,只有你能开 |
总结与操作流程
- 确定入口:如果你想直接从命令行运行一个程序,请确保该类有一个
public static void main(String[] args)方法。 - 编译:使用
javac YourClassName.java将.java源文件编译成.class字节码文件。 - 运行:使用
java YourClassName来启动程序,JVM 会加载YourClassName类,并执行其main方法。 - 调用其他方法:
- 如果要调用的方法是
static的(比如工具类方法),直接用ClassName.methodName()调用。 - 如果要调用的方法是非静态的(实例方法),必须先用
ClassName objectName = new ClassName();创建一个对象,然后用objectName.methodName()来调用。
- 如果要调用的方法是
常见问题
Q: 为什么运行时用 java MyFirstProgram,而不是 java MyFirstProgram.class?
A: javac 是 Java 编译器,它需要一个 .java 源文件作为输入,并输出 .class 字节码文件,而 java 是 Java 虚拟机(JVM)的启动器,它需要一个类名作为输入,然后去类路径(Classpath)下寻找对应的 .class 文件来加载和执行,你告诉它的是“运行哪个类”,而不是“加载哪个文件”。
Q: Error: Could not find or load main class MyFirstProgram 怎么办?
A: 这是非常常见的错误,原因通常是:
- 不在正确的目录:确保你在包含
.class文件的目录下运行java命令。 - 类名大小写错误:Java 是大小写敏感的,
MyFirstProgram和myfirstprogram是不同的。 - 类路径问题:
.class文件不在当前目录,你需要使用-cp或-classpath选项来告诉 JVM 去哪里找。java -cp /path/to/your/classes MyFirstProgram。 - 包名问题:如果你的类在包(package)中,运行方式会更复杂,需要包含完整的包路径。
