Java类路径中点(。)的影响是什么?

时间:2009-12-13 17:37:15

标签: java classpath javac scjp

这是“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?

4 个答案:

答案 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中,这就是您在测试时使用点告诉编译器的内容。

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