当前位置: 首页 > 知识库问答 >
问题:

关于“为什么每个文件只有一个公共类”主题的给定答案的问题

陶和歌
2023-03-14

我来到阿克罗斯,问了一个问题:为什么Java文件中只有一个公共类

答案是这样的:

要了解这些限制背后的基本原因,让我们假设编译器不会因为将文件名命名为与公共类名相同而导致编译错误。

假设有一个包a

        A
      /   \
file1.java   file2.java

文件1.java

package A;

class file1
{
  public static void main(String args[])
  {

  }
}

public class file3
{
 public static void main(String args[])
 {

 }
}

现在我们知道,公共类也可以在包之外访问,现在让外部世界访问它将成为开发人员的责任。让我们看看如何:

假设包A只包含Java文件(没有类文件),包A之外的某个类尝试访问公共类file3,编译器将首先尝试查找file3。类(不可用),然后它将尝试查找文件3。java(不可用)。因此,即使file3类在本质上是公共的,但它对外部世界是不可见的。因此,如果编译器设置了限制,即如果文件包含公共类,则应将其命名为与公共类名相同的名称,则可以解决上述问题,并且开发人员不必考虑将公共类公开给外部世界。

编译器还限制了每个Java文件应有一个公共类,以便外部世界可以访问每个公共类。

但是我们不会使用像导入folder.packagename.filenameofclassfile3;这样它在技术上仍然有效吗?

如果<代码>。编译时类文件不存在

我们基本上会通过使用完整的限定名告诉编译器在哪里找到类文件3。

共有1个答案

卜泓
2023-03-14

这种解释或多或少是假的。公共类文件的源文件名必须与类名相同的真正原因是规范这么说。就这么简单。

导入语句不会做任何特别的事情;您可以导入一个根本不使用的类文件,这将导致类文件中没有任何文字;如果您运行代码时导入的类甚至不在,那也没关系。这不是python或脚本语言;导入不会加载它。所有导入com.foo.Bar;所做的是说:“任何时候Bar作为类型名称出现在这个文件中,想象它读com.foo.Bar”(因此,您可以删除导入语句,并将所有出现的Bar替换为com.foo.Bar,文件的工作原理相同。

因此,将文件名放在import语句中是不合法的。

还要注意的是,如果您将一个非公共类放在一个文件中,即使该文件与该类的名称不同,这也很好,并且如果您编译它,仍然会导致该类在其自己的文件中存在(编译一个java文件可能会生成多个类文件!)

如果我们不得不猜测为什么在java规范中编写公共类的人必须在一个名为相同的文件中。。。谁知道呢,真的。没有真正的理由。你找到的虚假答案是试图,如果你使用javac有限的能力来查找源文件,那么也必须编译源文件(使用-sourcepath选项,我想这可能确实更容易,但请注意,没有什么可以阻止您编写代码,这些代码引用同一个包中另一个非公共的、尚未编译的类,并且只运行javac ThatFile。java产生了相同的“现在需要编译的源文件很难找到”问题。因此,您找到的答案是bo格斯。

 类似资料:
  • 问题内容: 我最近开始学习Java,发现每个Java类都必须在单独的文件中声明非常奇怪。我是C#程序员,C#并没有实施任何此类限制。 Java为什么要这样做?有设计上的考虑吗? 编辑(基于几个答案): 为什么在IDE时代Java现在不取消此限制?这不会破坏任何现有代码(或者会破坏吗?)。 问题答案: 根据Java语言规范,第三版: 这种限制意味着每个编译单元最多只能有一个这样的类型。 这种限制使J

  • 问题内容: 为什么B类无法公开?如何在其他班级使用班级?在Cons中定义它更好吗? 问题答案: 根据Java语言规范,文件(.java)中只能有一个公共类,并且文件名应与公共类名相同。 如果希望在其他地方访问B类,则可以创建一个单独的B.java文件,然后将B类代码移至该文件。 该线程可以为您提供更多信息。

  • 上图是一个 wordpress 主题的文件部分结构 一直弄不懂 front-page.php, home.php 这两个文件到底有什么区别? 都是代表首页吗? home.php 和 single.php 又有什么区别? 如果查看单篇文章会进入 single.php, 那 home.php 为什么会被叫做文章页? 文件有点混淆, 求大佬指点指点..

  • 问题内容: 好的,这可能是java中的小问题。我们不能在一个文件中定义两个公共类。但是,在《 SCJP学习指南》一书的示例中,提到了以下示例: 当我将其复制粘贴到netbeans中时,立即引发了编译错误,该公共类A应该在单独的文件中提及。SCJP stdydy指南中的示例真的错误吗?同样在一些模拟测试中,我发现许多问题都具有这种模式,但是在所有选项中都没有提到编译器错误。在这里担心 问题答案: 是

  • [2020-06-01 08:00:27,746]警告[Consumer Clientid=Consumer-Console-Consumer-56224-1,GroupID=Console-Consumer-56224]提取相关id为2的元数据时出错:{Distance2 =Invalid_Topic_Exception}(org.apache.kafka.clients.NetworkClie

  • 创建一个同步多线程系统,以确定三个文本文件中所有整数或分数的总数。如果流被阻塞,则必须将其名称显示为"LOCKED"。为什么只计算一个文件(带锁的线程)?程序显示的内容:Thread-0 Locked!线程-2锁定!123.321 322099只有一个文件