【问题标题】:Compiling a .java file with incorrect package name使用错误的包名编译 .java 文件
【发布时间】:2018-05-19 04:42:39
【问题描述】:

在 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 ? (选择所有适用项)

答. 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. 提供的解释毫无意义。

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

【问题讨论】:

  • 好吧,既然没有人对这里感兴趣......

标签: java compilation directory package


【解决方案1】:

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

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

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

【讨论】:

  • 你不认为他们会在打印之前测试这些东西吗?对作者和技术审稿人感到羞耻。还有什么乱七八糟的?有多少人因为这样的错误问题而未能通过 OCA?
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 2021-12-07
  • 2022-01-12
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 2020-10-17
相关资源
最近更新 更多