这是“SCJP模拟考试”中的一个示例问题:
给定默认的类路径:
/富
这个目录结构:
foo | test | xcom |--A.class |--B.java
这两个文件:
package xcom; public class A { } package xcom; public class B extends A { }
哪个允许B.java编译? (选择所有适用的选项。)
一个。将当前目录设置为
xcom
,然后调用javac B.java
B中。将当前目录设置为
xcom
,然后调用javac -classpath . B.java
℃。将当前目录设置为test然后调用
javac -classpath . xcom/B.java
d。将当前目录设置为test然后调用
javac -classpath xcom B.java
电子。将当前目录设置为test然后调用
javac -classpath xcom:. B.java
答案是C,我不明白在那里使用运算符.
。请解释一下。
这本书说:
为了编译
B.java
,编译器首先需要能够找到B.java
。 找到B.java
后,需要找到A.class
。 因为A.class
在xcom
包,如果从A.class
目录调用,编译器将找不到xcom
。 请记住,-classpath
并不是在寻找B.java
,它正在寻找任何类别B.java
需要A.class
。
我不明白,如果两个文件都在同一个包中,为什么编译器找不到A?
答案 0 :(得分:5)
点表示'当前目录'。
如果您从xcom
内拨打javac,则会在A.class
中查找xcom/xcom/A.class
,但无法找到它。
答案 1 :(得分:3)
为了编译
B.java
,编译器首先需要能够找到B.java
。
这就是D.和E.错误的原因。
找到
B.java
后,需要找到A.class
。因为A.class在xcom
包中,所以如果从A.class
目录调用它,编译器将找不到xcom
。 (...)
如果从xcom
目录 调用 ,那么您错过了重要部分。 A.class
包含在xcom
包中,因此预计会在xcom/A.class
中找到(相对于运行javac的位置)。
这就是A.和B.错误的原因。 这让C.留下了正确的答案。
答案 2 :(得分:1)
没有运算符.
,.
表示当前目录。由于类A
位于xcom
包中,因此,使用javac
,目录层次结构镜像包层次结构,您需要在类路径中有一个目录,文件{{ 1}}可以找到。在您的情况下,这是xcom/A.class
目录,因此当您在该目录中调用test
,在类路径中提供当前目录时,javac
将找到类javac
来自xcom.A
目录。
答案 3 :(得分:0)
在读这本书的引文时我也很困惑。
无论如何,编译器会查找A.class
,因为它与B.java
位于同一个包中,它会查找xcom/A.class
。这意味着您必须告诉编译器在哪里找到您的包,并使用-classpath
执行此操作。
在您的示例中,您的包(可能不止一个)位于test
中,这就是您在测试时使用点告诉编译器的内容。
简而言之,编译器通过将其包名称作为目录加前缀来查找类。