一个 Java 源文件最多只能有一个 public class,且必须与文件名同名;其余可定义多个包级私有类或内部类,但为保障可读性与维护性,建议每个顶层 public 类单独成文件。

可以,但有严格限制:一个 Java 源文件(.java 文件)最多只能有一个 public class,且该 public class 的名称必须与文件名完全一致;其余 class 可以是包级私有(即不加访问修饰符)的普通类,数量不限。
为什么只能有一个 public class?
这是 Java 编译器的强制规定,目的是保证类的唯一可识别性。JVM 通过文件名定位 public 类,如果一个文件里出现两个 public class(比如 A.java 中定义了 public class A 和 public class B),编译器会直接报错:class B is public, should be declared in a file named B.java。
非 public 类怎么写?
可以在同一个源文件中定义多个非 public 类,它们默认具有包级访问权限,只能被同一包内的其他类访问。例如:
A.java 文件内容如下:
立即学习“Java免费学习笔记(深入)”;
public class A {
public static void main(String[] args) {
B b = new B();
C c = new C();
}
}
class B { } // 包级私有,合法
class C { } // 包级私有,合法
内部类算不算“多个 class”?
算,但不违反规则。内部类(包括静态内部类、成员内部类、局部内部类、匿名内部类)属于嵌套在另一个类内部的类型定义,它们不构成源文件顶层的 class 声明,因此不影响“一个 public class”的限制。例如,在 A.java 中写 public class A 并在其内部定义 static class Inner,完全合法。
实际开发中建议怎么做?
虽然语法允许一个文件含多个非 public 类,但主流实践强烈建议:
- 每个顶层类(尤其是 public 类)单独放在一个同名文件中,提升可读性和可维护性
- 仅在确实需要紧密耦合、且生命周期/作用域高度受限时,才把辅助类(如私有工具类、测试用桩类)和主类放在同一文件中
- 避免在生产代码中堆砌多个顶层非 public 类,IDE 和构建工具(如 Maven)通常按“一个文件一个公开类”约定组织和扫描类










