编译包名不正确的.java文件
在Boyarsky和Selikoff的《OCA Oracle认证助理Java SE 8程序员我的学习指南考试1Z0-808》一书中,我在第一章的复习考试中遇到了一个令人困惑的问题: 十四,。给定文件/my/directory/named/A/Bird.java中的以下类:编译包名不正确的.java文件,java,compilation,directory,package,Java,Compilation,Directory,Package,在Boyarsky和Selikoff的《OCA Oracle认证助理Java SE 8程序员我的学习指南考试1Z0-808》一书中,我在第一章的复习考试中遇到了一个令人困惑的问题: 十四,。给定文件/my/directory/named/A/Bird.java中的以下类: 在此处插入代码 公共类鸟{} 如果我们从/my/目录编译,以下哪项将替换在此处插入代码?(选择所有适用项) A.打包my.directory.named.A B.打包my.directory.named.A C.名为.a的包
在此处插入代码
公共类鸟{}
如果我们从/my/目录编译,以下哪项将替换在此处插入代码
?(选择所有适用项)
A.打包my.directory.named.A代码>
B.打包my.directory.named.A代码>
C.名为.a的包代码>
D.名为.A的包代码>
E.a包代码>
F.A包代码>
G.不编译
书中指出正确答案仅为D(我们将忽略一个事实,即他们写了“选择所有适用的”,尽管他们在书中早些时候声明,只有当有超过1个答案时才会这样做),并解释如下:
D.包名称表示当前路径下的任何文件夹,即
在本例中命名为.A。选项B不正确,因为包名称区分大小写,
就像变量名和其他标识符一样
在各个层面上,我对这一点完全感到困惑:
我尝试使用javac/named/A/Bird.java
从/my/目录编译该文件,并且使用上述任何一个答案,代码编译成功。此外,无论我在类的第一行package
之后写什么,代码都会编译
让我们假设我完全错过了第1点(并非双关语)中的要点,而这不是我们从/my/directory编译的方式,那么我有以下问题:
- 如何从/my/目录编译
- 为什么选项B不正确?显然,他们对B.的解释毫无意义
有人能解释一下这件事吗?简单的回答是这个问题是错误的
可以从任何地方编译单个类,而不考虑包层次结构,如果它没有对其他自定义类的引用(因此可以使用String
等)。这是因为它不需要对其他类进行任何查找,因此在编译时类路径中不需要任何特殊的内容。一旦添加对classnamed.a.Rock
的引用,编译将不再工作,因为目录层次结构与包层次结构不匹配(除非将Bird
放入named.a
包中)
所以问题中的例子很糟糕。一旦您添加了对另一个类的引用并且包层次结构开始起作用,D
就是正确的答案。这个问题有点糟糕,因为您可以显式地设置编译时类路径,此时“当前目录”的概念一点都不重要,所有的答案都是有效的。好吧,因为这里没有人对此感兴趣……您不认为他们会在打印之前测试这些东西吗?为作者和技术评论员感到羞耻。还有什么废话?有多少人因为这样的错误问题而未能通过OCA?