在Boyarsky和Selikoff撰写的“OCA Oracle认证Java SE 8程序员I研究指南考试1Z0-808”一书中,我在第一章的复习考试中遇到了一个令人困惑的问题:
14.在文件/my/directory/named/A/Bird.java中给出以下类:INSERT CODE HEREpublic 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
之后编写什么代码,代码都可以编译。 有人可以阐明这件事吗?
最佳答案
简短的答案是问题是错误的。
可以从任何地方编译单个类,而无需考虑包层次结构(如果没有对其他自定义类的引用)(因此可以使用String
等)。这是因为它不需要对其他类进行任何查找,因此在编译时类路径中不需要任何特殊的操作。一旦添加对类named.A.Rock
的引用,编译将不再起作用,因为目录层次结构与包层次结构不匹配(除非您也将Bird
放入named.A
包中)。
因此,问题中的示例很糟糕。一旦添加了对另一个类的引用,包层次结构就开始重要了,D
是正确的答案。这个问题有点糟糕,因为您可以显式设置编译时类路径,此时“当前目录”的概念无关紧要,所有答案都将是有效的。