Java 源文件中的类名约束与编译行为规则
1. 多类共存与 .class
文件生成规则
-
规则
一个.java
文件可以定义多个类(public
或非public
),但每个类名必须唯一(包作用域内)。 编译后,每个类生成独立的.class
文件,文件名与类名严格一致(包括大小写)。
示例:// File: Demo.java class A {} // 生成 A.class public class Demo {} // 生成 Demo.class(必须与源文件名一致)
-
注意
若无
public
类,文件名可自由定义,但类名仍需唯一。
2. public
类的强制约束
-
规则
每个
.java
文件仅允许一个public
类。public
类名必须与源文件名完全一致(包括大小写)。示例:
// File: App.java public class App {} // ✅ 正确 public class Main {} // ❌ 错误:类名必须为 App
3. 单文件源码启动的特殊行为
- 规则
使用单文件启动(如java Demo.java
)时,JVM 默认执行文件中第一个声明且包含有效main
方法的类。若第一个类无main
方法,后续类的main
方法也不会被调用。
正确示例(第一个类有 main
方法)
// File: SingleFileDemo.java
public class SingleFileDemo { // ✅ 类名与文件名一致
public static void main(String[] args) {
System.out.println("执行 SingleFileDemo 的 main 方法");
}
}
class Helper {
public static void main(String[] args) {
System.out.println("Helper 类的 main 方法(不会执行)");
}
}
-
运行命令
java SingleFileDemo.java
-
输出结果
执行 SingleFileDemo 的 main 方法
-
说明
JVM 仅执行第一个类SingleFileDemo
的main
方法,后续类的main
方法被忽略。
错误示例(第一个类无 main
方法)
// File: WrongOrderDemo.java
class A { // ❌ 第一个类无 main 方法
public void print() {
System.out.println("A 类的普通方法");
}
}
class B {
public static void main(String[] args) {
System.out.println("B 类的 main 方法(不会执行)");
}
}
- 运行命令
java WrongOrderDemo.java
- 输出结果
错误: 在类 A 中找不到 main 方法
- 说明
JVM 检查第一个类A
是否包含main
方法,若无则直接报错。