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

问题描述 投票:0回答:1

我来了以下问题:Why only 1 public class in Java file

并且有这个答案:

要了解这些限制背后的基本原因,假设编译器未给出未命名文件名的编译错误与公共类名相同。

假设有一个包裹A

        A
      /   \
file1.java   file2.java

file1.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.class(不可用),然后进行查找将尝试查找file3.java(不可用)。所以即使file3课堂本质上是公共的,外界看不到。所以如果编译器施加限制,即文件包含public类,其名称应与公共类名称相同,然后在上方问题可以解决,开发人员无需考虑向公众公开公共课堂。

编译器还提出了限制,即最多应有一个每个Java文件的公共类,以便可以访问每个公共类通过外部世界。

但是我们不使用像import folder.packagename.filenameofclassfile3;这样的东西,所以它在技术上仍然可以工作吗?

如果.class-file在编译时不存在

我们基本上会告诉编译器使用完全限定的名称在哪里找到class file3

java compilation classloader filenames
1个回答
0
投票
该解释或多或少是伪造的。公用类文件的源文件名必须与类名相同的真正原因是因为规范这样说。就这么简单。

import语句没有什么特别的;您可以导入根本不使用的类文件,这将导致在类文件中什么都没有。如果在运行代码时该导入的类甚至还没有出现,那将无关紧要。这不是python或脚本语言;导入不会加载它。完全没有import com.foo.Bar;的全部意思是:“ Anytime Bar在文件中显示为类型名称,想象它改为读取com.foo.Bar”(因此,您可以删除import语句,并替换所有出现的[ C0]和Bar,文件也一样。

因此,将

文件名放在导入语句中不是合法的Java。

也请注意,如果在文件中放入

non

公共类,即使该文件与该类也不具有相同的名称,也可以,并且仍然导致该类单独存在。自己的文件,如果您对其进行编译(编译1个Java文件可能会产生1个以上的类文件!)[如果我们不得不猜测为什么有人在Java规范中写道,公共类必须位于同名文件中……谁知道,真的。没有真正的理由。您发现要寻求的虚假答案是,如果您使用javac来查找也必须进行编译的源文件的能力非常有限(使用com.foo.Bar选项,我想这的确可能会更容易,但是请注意,没有什么可以阻止您编写引用同一包中另一个非公共,尚未编译类的代码并仅运行-sourcepath的结果,从而导致相同的“现在很难找到需要编译的源文件”的问题因此,为什么找到的答案是虚假的。
© www.soinside.com 2019 - 2024. All rights reserved.