【问题标题】:What happens when you declare two or more classes inside one .java file with the file name same as the public class in it? [duplicate]当您在一个 .java 文件中声明两个或多个类且文件名与其中的公共类相同时会发生什么? [复制]
【发布时间】:2021-05-19 09:19:22
【问题描述】:

它在编译时会创建单独的 .class 文件吗?这样做对吗?

【问题讨论】:

  • 这很容易尝试!
  • 您可以在主公共类中创建内部类和匿名类。我一直这样做,所以我可以将answers in Stack Overflow 粘贴为一段代码。
  • 试一试,你会看到编译后生成的多个.class文件。问题是它是非标准的、非惯用的做法,因此令人困惑。
  • @GilbertLeBlanc 你甚至可以在一个文件中定义多个顶级类,但只有一个可以是公共的。

标签: java class


【解决方案1】:

Java 语言规范 (JLS 7.6) 指出:

“如果顶级类型的名称显示为同一包中声明的任何其他顶级类或接口类型的名称,则会出现编译时错误。”

由于文件中的所有顶级类型声明都是同一个包的成员,因此如果您在同一个文件中声明两个具有相同名称的顶级类型,那么第二个违反了上述规则。

规范还规定了以下内容:

“当且仅当包存储在文件系统中时(第 7.2 节),如果在以下文件中找不到类型,主机系统可能会选择强制执行以下限制:它是编译时错误如果满足以下任一条件,则由类型名称加上扩展名(例如 .java 或 .jav)组成的名称:

  • 该类型被声明该类型的包的其他普通编译单元中的代码引用。

  • 该类型被声明为公共的(因此可以从其他包中的代码访问)。”

这意味着(对于此类实现)文件中只有一个顶级类型可以是public

(大多数 Java 编译器都会强制执行此限制。)

但是,如果您不打破上述限制,Java 语言允许您在单个文件中声明多个顶级类型。


它在编译时会创建单独的.class 文件吗?

是的。事实上,还有一个单独的 .class 文件为任何嵌套或内部类以及任何 lambdas 生成。


这样做对吗?

通常认为这样做是个坏主意。一些 Java 风格指南明确指出每个源文件应该有一个顶级类型声明。其他人对此保持沉默。

由于单个源文件中的多种类型在实践中是不常见的,因此大多数程序员都不会想到这一点。因此,这是一个可读性问题,这是不这样做的实际原因。

【讨论】:

    猜你喜欢
    • 2013-05-27
    • 1970-01-01
    • 2012-10-31
    • 2011-01-21
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多