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 不正确,因为包名称区分大小写,就像变量名称和其他标识符一样。
我在各个层面上对此感到完全困惑:
我尝试使用javac /named/A/Bird.java上面的任何答案从 /my/directory 编译文件,并且代码成功编译。package此外,无论我在类的第一行后面写什么,代码都会编译。
假设我完全错过了第 1 点(没有双关语)中的要点,并且这不是我们从 /my/directory 进行编译的方式,那么我有以下问题:
我们如何从 /my/directory 进行编译?
为什么选项B不正确?显然,他们为 B. 提供的解释毫无意义。
有人可以解释一下这个问题吗?
简短的回答是这个问题是错误的。
如果单个类没有对其他自定义类的引用(因此您可以使用String等),则可以从任何地方编译单个类,而无需考虑包层次结构。这是因为它不需要对其他类进行任何查找,因此编译时类路径中不需要任何特殊的内容。一旦您添加对类的引用,named.A.Rock编译将不再起作用,因为目录层次结构与包层次结构不匹配(除非您也放入包中)Bird。named.A
所以问题中的例子很糟糕。一旦添加对另一个类的引用并且包层次结构开始变得重要,D这就是正确的答案。这个问题有点糟糕,因为您可以显式设置编译时类路径,此时“当前目录”的概念一点也不重要,所有答案都是有效的。