杰瑞科技汇

类是公共的,为何要在Java中声明?

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

类是公共的,为何要在Java中声明?-图1
(图片来源网络,侵删)

下面我将详细解释这句话的含义、背后的规则以及最佳实践。


public 类的声明规则

在 Java 中,public 访问修饰符意味着该类可以被任何其他类访问,无论这些类位于同一个包还是不同的包。

为了支持这种“随处可访问”的特性,Java 语言强制规定了文件名和类名之间的严格关系:

规则:如果一个类被声明为 public,那么存放这个类的源代码文件名必须与该类的完全名称(包括包名)一致。

类是公共的,为何要在Java中声明?-图2
(图片来源网络,侵删)
  • 文件名必须等于 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;
    }
}

根据规则:

  1. 文件名:必须是 Circle.java
  2. 文件位置:必须在 com/example/shapes/ 目录下,以匹配包名 com.example.shapes
  3. :这个文件里不能有另一个 public 类,但可以有非 public 的类(如内部类或辅助类)。

为什么需要这个规则?

这个规则主要有两个原因:

  1. 可预测性和唯一性:当你使用 import com.example.shapes.Circle; 语句时,编译器和 Java 虚拟机需要知道去哪里找到 Circle 类的定义,文件名和类名的一致性提供了一个简单、直接的查找机制,编译器会自动去 CLASSPATH 下寻找 com/example/shapes/Circle.class 文件,如果没有这个规则,一个文件里可能有多个 public 类,编译器将无法确定应该导入哪个。

    类是公共的,为何要在Java中声明?-图3
    (图片来源网络,侵删)
  2. 组织性和清晰性:它强制每个公共接口或组件都有一个明确对应的源文件,这使得代码库结构更清晰,更容易管理和维护,你可以通过文件名快速定位到特定的公共类。


对比:非 public

如果一个类没有 public 修饰符(或者使用 protected/package-private/private,但对于顶级类来说,只能是 public 或默认的包私有),那么文件名规则就不同了。

规则:如果一个类不是 public 的(即默认的包私有访问级别),那么它的文件名可以与类名不同,并且一个 .java 文件中可以有多个非 public 类。

示例

假设我们有两个辅助类 PointColor,它们只在 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 类:PointColor
  • 只要其他类在 com.example.shapes 包内,就可以直接使用 PointColor
  • com.example.anotherpackage 中的类将无法访问这两个类。

最佳实践

虽然技术上可以在一个文件中放置多个非 public 类,但现代 Java 开发中的强烈推荐做法是:

遵循“一个文件一个公共类”的原则。

即使一个类不是 public 的,也最好将它放在一个以其命名的 .java 文件中。

这样做的好处:

  • 一致性:无论类是否是 public,文件结构都保持一致,易于理解。
  • 可维护性:每个类都有自己的文件,修改一个类时不会意外影响其他类。
  • 工具支持:大多数 IDE(如 IntelliJ IDEA, Eclipse)和构建工具(如 Maven, Gradle)都基于“一个文件一个类”的模式来工作,遵循这个原则能获得最佳的开发体验。

特性 public public (包私有) 类
访问级别 任何地方都可以访问 仅在同一个包内可以访问
文件名规则 必须与类名相同 (e.g., MyClass.java) 可以与类名不同,但推荐使用类名
每文件数量 一个文件中最多只能有一个 public 一个文件中可以有多个
最佳实践 始终遵循“一个文件一个公共类”原则 推荐也遵循“一个文件一个类”原则,保持一致性

您的理解是完全正确的:public 类必须在 Java 中声明,并且这种声明伴随着严格的文件命名和组织规则,这是 Java 语言设计的一部分,旨在保证代码的清晰、可预测和易于管理。

分享:
扫描分享到社交APP
上一篇
下一篇