编译包名不正确的 .java 文件

jov*_*993 6 java directory compilation package

在Boyarsky和Selikoff的《OCA Oracle Certified Associate Java SE 8 Programmer I Study Guide Exam 1Z0-808》一书中,我在第一章的复习考试中遇到了一个令人困惑的问题:

14. 在文件 /my/directory/named/A/Bird.java 中给出以下类:

INSERT CODE HERE public class Bird { }

如果我们从 /my/directory 编译,以下哪个会替换?INSERT CODE HERE (选择所有适用项)

A。 package my.directory.named.a;

B. package my.directory.named.A;

C。 package named.a;

D . package named.A;

E. package a;

F。 package A;

G。 Does not compile

书中指出正确答案就是 D。(我们将忽略他们写的“选择所有适用的”这一事实,尽管在本书前面指出他们只有在有超过 1 个答案时才会这样做),说明:

D. 包名称代表当前路径下的任何文件夹,在本例中名为.A。选项 B 不正确,因为包名称区分大小写,就像变量名称和其他标识符一样。

我在各个层面上对此感到完全困惑:

  1. 我尝试使用javac /named/A/Bird.java上面的任何答案从 /my/directory 编译文件,并且代码成功编译。package此外,无论我在类的第一行后面写什么,代码都会编译。

  2. 假设我完全错过了第 1 点(没有双关语)中的要点,并且这不是我们从 /my/directory 进行编译的方式,那么我有以下问题:

    • 我们如何从 /my/directory 进行编译

    • 为什么选项B不正确?显然,他们为 B. 提供的解释毫无意义。

有人可以解释一下这个问题吗?

Kay*_*man 4

简短的回答是这个问题是错误的。

如果单个类没有对其他自定义类的引用(因此您可以使用String等),则可以从任何地方编译单个类,而无需考虑包层次结构。这是因为它不需要对其他类进行任何查找,因此编译时类路径中不需要任何特殊的内容。一旦您添加对类的引用,named.A.Rock编译将不再起作用,因为目录层次结构与包层次结构不匹配(除非您也放入包中)Birdnamed.A

所以问题中的例子很糟糕。一旦添加对另一个类的引用并且包层次结构开始变得重要,D这就是正确的答案。这个问题有点糟糕,因为您可以显式设置编译时类路径,此时“当前目录”的概念一点也不重要,所有答案都是有效的。

  • 你不认为他们会在打印之前测试这些东西吗?作者感到羞耻,技术审稿人也感到羞耻。还有什么胡言乱语?有多少人因为这样的错误问题而未能通过OCA? (2认同)