4

这是“SCJP 模拟考试”中的一个示例问题:

给定默认的类路径:

/foo

而这个目录结构:

foo
  |
 test
    |
   xcom
     |--A.class
     |--B.java

而这两个文件:

package xcom;
public class A { }
package xcom;
public class B extends A { }

哪个允许 B.java 编译?(选择所有适用的。)

A.设置当前目录xcom然后调用

javac B.java

B.设置当前目录xcom然后调用

javac -classpath . B.java

C. 设置当前目录进行测试然后调用

javac -classpath . xcom/B.java

D. 设置当前目录进行测试然后调用

javac -classpath xcom B.java

E. 设置当前目录进行测试然后调用

javac -classpath xcom:. B.java

答案是C,我不明白.那里的操作符的使用。请解释。

书上说:

为了B.java编译,编译器首先需要能够找到B.java. 一旦找到B.java,就需要找到A.class因为A.classxcomA.class包中,如果从xcom目录中调用它,编译器将找不到。请记住,它-classpath不是在寻找B.java,而是在寻找任何 B.java需要的类(在这种情况下A.class)。

我不明白,如果两个文件都在同一个包上,为什么编译器找不到 A?

4

4 回答 4

5

点表示“当前目录”。如果你从 inside 调用 javac xcom,那么它会A.class在 in 中xcom/xcom/A.class查找,但不会找到它。

于 2009-12-13T17:51:08.810 回答
3

为了B.java编译,编译器首先需要能够找到B.java.

这就是为什么 D. 和 E. 是错误的。

一旦找到B.java,就需要找到A.class。因为 A.class 在包中,所以如果从目录中调用它xcom,编译器将找不到。(...)A.classxcom

您错过了这里的重要部分,即如果它是从xcom目录中调用的。A.class位于xcom包中,因此预计可以在xcom/A.class(相对于您运行 javac 的位置)中找到它。

这就是为什么 A. 和 B. 是错误的。这让 C. 作为正确答案。

于 2009-12-13T20:13:52.597 回答
1

没有 operator ..表示当前目录。由于类Axcom包中javac,并且目录层次结构反映了包层次结构,因此您需要在类路径中有一个目录,xcom/A.class可以从中找到文件。在您的情况下,这就是test目录,因此当您javac在该目录中调用时,在类路径中给出当前目录,将从目录中javac找到该类。xcom.Axcom

于 2009-12-13T17:52:27.630 回答
0

在阅读您对这本书的引用时,我也感到困惑。

无论如何,编译器会查找A.class并且因为它与 位于同一个包中B.java,所以它会查找xcom/A.class. 这意味着您必须告诉编译器在哪里可以找到您的包,然后您使用-classpath.

在您的示例中,您的包(可能不止一个)在其中test,这是您在测试中用点告诉编译器的内容。

简而言之,编译器通过将包名作为目录前缀来查找类。

于 2009-12-13T17:54:13.047 回答