在书中" OCA Oracle认证助理Java SE 8程序员I学习指南考试1Z0-808"通过Boyarsky和Selikoff我在第一章的复习考试中遇到了一个令人困惑的问题:
14。给出/my/directory/named/A/Bird.java文件中的以下类:
INSERT CODE HERE
public class Bird { }
如果我们从/ my /目录编译,以下哪项会替换 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 /目录编译文件,代码可以成功编译上面的任何答案。此外,无论我在课程的第一行package
之后写的是什么,代码都会编译。
让我们假设我完全错过了第1点(没有双关语)第1点,而不是我们从/ my /目录编译,然后我& #39;有这些问题:
我们如何从/ my /目录编译?
为什么选项B.不正确?他们为B.提供的解释显然毫无意义。
有人可以对这件事有所了解吗?
答案 0 :(得分:2)
简短的回答是问题是错误的。
可以从任何地方编译单个类,而不考虑包层次结构如果它没有引用其他自定义类(因此您可以使用String
等)。这是因为它不需要对其他类进行任何查找,因此在编译时类路径中不需要任何特殊的东西。一旦你添加一个引用,比如说类named.A.Rock
,编译将不再有效,因为目录层次结构与包层次结构不匹配(除非你将Bird
放在named.A
包中同样)。
所以问题中的例子很糟糕。只要添加对另一个类的引用并且包层次结构开始变得重要,D
就是正确的答案。问题有点差,因为你可以明确地设置编译时类路径,此时“当前目录”的概念无关紧要,所有答案都是有效的。