为什么javac接受使用不正确的树结构的包声明编译类

为什么javac接受使用不正确的树结构的包声明编译类,java,package,javac,Java,Package,Javac,我想知道为什么以下步骤有效 假设实际的文件结构是: - src - Toto.java 文件Toto.java包含 package myPackage; class Toto{} 美国 在反映源文件包的目录树中排列源文件 树。例如,如果所有源文件都在\workspace中,则 将com.mysoft.mypack.MyClass的源代码放入/workspace中 \workspace\com\mysoft\mypack\MyClass.java 我以为 $ cd src $ javac

我想知道为什么以下步骤有效

假设实际的文件结构是:

 - src
  - Toto.java
文件
Toto.java
包含

package myPackage;
class Toto{}
美国

在反映源文件包的目录树中排列源文件 树。例如,如果所有源文件都在\workspace中,则 将com.mysoft.mypack.MyClass的源代码放入/workspace中 \workspace\com\mysoft\mypack\MyClass.java

我以为

$ cd src
$ javac Toto.java
将输出一个错误相反,编译器不会产生错误并编译正确的文件。

显然,

cd src
javac PokerQ/Affichage.java


不编译。

原则上,您不需要将源文件放在与包层次结构匹配的树中。编译器将编译每个类并在内部存储包名。无论您如何组织源目录,每个生成的
.class
文件都将知道它对应的包

潜在的问题是,如果您正在编译多个类,那么其中一些类很可能会相互引用。当一个类引用另一个类时,编译器和JRE使用目录层次结构作为查找类的方法。默认情况下,编译器将编译的
.class
文件与其Java源文件放在同一目录中。如果源目录是乱七八糟的piggledy,那么最终会得到一组
.class
文件,这些文件本身并没有按照包进行结构,这将使查找它们变得很困难。通过在
javac
java
命令行中仔细设置类搜索路径,您可能仍然能够绕过这个问题

此外,如果您使用
-d
为编译器指定一个目录,那么它将构建一个与包层次结构匹配的编译类树,无论源代码多么混乱。我不确定是否有人使用默认方法,即将编译后的类作为源文件放在同一目录中,原则上,您可能可以构建一个相当复杂的多包Java应用程序,其中所有源文件都在同一目录中——假设您可以跟踪所有源文件

尽管如此,源代码树与包层次结构相匹配的思想在Java开发方法论中根深蒂固,无论它是否总是严格必要的。IDE工具和构建工具(如Ant和Maven)都假设这个组织,所以你必须有点胆小才能以其他方式工作

javac PokerQ/Affichage.java