如果一个类是 public 的,那么它必须在 Java 中声明。

下面我将详细解释这句话的含义、背后的规则以及最佳实践。
public 类的声明规则
在 Java 中,public 访问修饰符意味着该类可以被任何其他类访问,无论这些类位于同一个包还是不同的包。
为了支持这种“随处可访问”的特性,Java 语言强制规定了文件名和类名之间的严格关系:
规则:如果一个类被声明为
public,那么存放这个类的源代码文件名必须与该类的完全名称(包括包名)一致。(图片来源网络,侵删)
- 文件名必须等于
public类的类名,并且文件扩展名必须是.java。 - 一个
.java源文件中,最多只能有一个public类。
示例
假设我们有一个类 com.example.shapes.Circle,并且它被声明为 public。
// 文件路径: com/example/shapes/Circle.java
package com.example.shapes;
// 这个类是 public 的
public class Circle {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public double getArea() {
return Math.PI * radius * radius;
}
}
根据规则:
- 文件名:必须是
Circle.java。 - 文件位置:必须在
com/example/shapes/目录下,以匹配包名com.example.shapes。 - :这个文件里不能有另一个
public类,但可以有非public的类(如内部类或辅助类)。
为什么需要这个规则?
这个规则主要有两个原因:
-
可预测性和唯一性:当你使用
import com.example.shapes.Circle;语句时,编译器和 Java 虚拟机需要知道去哪里找到Circle类的定义,文件名和类名的一致性提供了一个简单、直接的查找机制,编译器会自动去CLASSPATH下寻找com/example/shapes/Circle.class文件,如果没有这个规则,一个文件里可能有多个public类,编译器将无法确定应该导入哪个。
(图片来源网络,侵删) -
组织性和清晰性:它强制每个公共接口或组件都有一个明确对应的源文件,这使得代码库结构更清晰,更容易管理和维护,你可以通过文件名快速定位到特定的公共类。
对比:非 public 类
如果一个类没有 public 修饰符(或者使用 protected/package-private/private,但对于顶级类来说,只能是 public 或默认的包私有),那么文件名规则就不同了。
规则:如果一个类不是
public的(即默认的包私有访问级别),那么它的文件名可以与类名不同,并且一个.java文件中可以有多个非public类。
示例
假设我们有两个辅助类 Point 和 Color,它们只在 com.example.shapes 包内使用,不需要被外部包访问。
// 文件路径: com/example/shapes/ShapeHelper.java
package com.example.shapes;
// 这个类不是 public 的,只能在 com.example.shapes 包内访问
class Point {
int x, y;
}
// 这个类也不是 public 的
class Color {
String name;
}
// 这个文件里还可以有一个 public 类,但根据“一个文件一个 public 类”的规则,我们不在这里声明。
// 这个文件通常只作为辅助类的容器。
在这个例子中:
- 文件名是
ShapeHelper.java。 - 文件中包含了两个非
public类:Point和Color。 - 只要其他类在
com.example.shapes包内,就可以直接使用Point和Color。 - 在
com.example.anotherpackage中的类将无法访问这两个类。
最佳实践
虽然技术上可以在一个文件中放置多个非 public 类,但现代 Java 开发中的强烈推荐做法是:
遵循“一个文件一个公共类”的原则。
即使一个类不是 public 的,也最好将它放在一个以其命名的 .java 文件中。
这样做的好处:
- 一致性:无论类是否是
public,文件结构都保持一致,易于理解。 - 可维护性:每个类都有自己的文件,修改一个类时不会意外影响其他类。
- 工具支持:大多数 IDE(如 IntelliJ IDEA, Eclipse)和构建工具(如 Maven, Gradle)都基于“一个文件一个类”的模式来工作,遵循这个原则能获得最佳的开发体验。
| 特性 | public 类 |
非 public (包私有) 类 |
|---|---|---|
| 访问级别 | 任何地方都可以访问 | 仅在同一个包内可以访问 |
| 文件名规则 | 必须与类名相同 (e.g., MyClass.java) |
可以与类名不同,但推荐使用类名 |
| 每文件数量 | 一个文件中最多只能有一个 public 类 |
一个文件中可以有多个 |
| 最佳实践 | 始终遵循“一个文件一个公共类”原则 | 推荐也遵循“一个文件一个类”原则,保持一致性 |
您的理解是完全正确的:public 类必须在 Java 中声明,并且这种声明伴随着严格的文件命名和组织规则,这是 Java 语言设计的一部分,旨在保证代码的清晰、可预测和易于管理。

