使用错误的包名编译.java文件

时间:2017-12-05 13:39:11

标签: java compilation directory package

在书中" 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不正确,因为包名称区分大小写, 就像变量名和其他标识符一样。

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

  1. 我尝试使用javac /named/A/Bird.java从/ my /目录编译文件,代码可以成功编译上面的任何答案。此外,无论我在课程的第一行package之后写的是什么,代码都会编译。

  2. 让我们假设我完全错过了第1点(没有双关语)第1点,而不是我们从/ my /目录编译,然后我& #39;有这些问题:

    • 我们如何从/ my /目录编译

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

  3. 有人可以对这件事有所了解吗?

1 个答案:

答案 0 :(得分:2)

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

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

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