2010-02-19 126 views
1

任何人都可以请解释回答以下问题:Java包和类路径问题

给出一个正确编译类,它的源代码是:

package com.sun.test; 
public class Commander { 
    public static void main(String[] args) { 
    } 
} 

假设类文件位于/富/ com/sun/test /,当前目录是/ foo /,并且类路径包含“。” (当前目录)。哪个命令行正确运行Commander?

A. java的指挥官

B. java的com.sun.test.Commander

C. java的COM /太阳/测试/指挥官

D. java的-cp com.sun.test指挥官

E. java命令COM /阳光/测试指挥官

+2

为什么不尝试所有这些? – sfussenegger 2010-02-19 07:40:00

+0

你很幸运。显然,有些人为了声望而回答任何事情;) – sfussenegger 2010-02-19 08:01:59

+0

是的,他必须尝试找到解决方案。然而,他可能不明白为什么他们工作或不... – romaintaz 2010-02-19 08:08:00

回答

4

而最好的答案应该是B. C也工作在某些平台上,但不建议,是非常罕见的(至少我在Java编程超过10年的时间里并没有看到它)。


编辑

在Java初学者一个常见的误解是,类名是一样的东西 “MyClass的”。但这并不准确;如被看见在声明class MyClass命名“MyClass的”是真的,编译器与包声明相结合,创造了Java的指的是作为一个合格的类名,这是所有类名真的是到运行时的程序员提供了方便。 (在C#中,它们为此使用命名空间)。

这在许多情况下,如堆栈跟踪和方法签名,其总是包含,例如,java.lang.String中变得相当明显。因为“String”只是一个解析为java.lang.String的简短形式。你可以通过在你自己的包中创建你自己的字符串来证明这一点......但是要小心这样做会要求你显式地使用java.lang.String或my.package.String,无论是包或类都被导入。

一旦同化的事实,所有的类名是完全合格的,并且该编译器可以帮助您避免繁琐的工作,通过进口来解决短期形式完全合格的形式,事情变得更加清晰。

应该那么明显,为什么:

java命令COM /阳光/测试指挥官

不起作用。 cp选项在类路径中放置目录./com/sun/test(相对于当前目录),但没有名为Commander的类...它是com.sun.test.Commander。这意味着两件事:(a)命令行需要com.sun.test.Commander和(b)为了解决这个类,类路径必须包含一个包含“com”的目录条目,因为一个名为xyMyClass的类必须相对于某些类路径元素,位于x/y中。注:除非您受Sun的雇用,否则您不应将com.sun用作软件包名称,因为域名sun.com属于Sun。这个约定的存在是为了避免类包装和命名冲突。


PPS:有这样的事情作为默认的包,这是通过省略包装声明“指定” - 但它应该几乎从来没有被使用。我已经找到了一个合法的地方是它是希望能够做一个自包含“启动/类加载器”:

java -cp . Launcher com.xxx.yyy.TargetApp 

与Launcher.class在当前目录......而这仅仅是因为JAR文件在应用程序运行时保持锁定状态,而类文件不运行,这意味着Launcher.class可以自我更新,而Launcher.jar不能。

+0

谢谢软件猴。你能解释一下原因吗?我认为E也应该工作。 – Zacky112 2010-02-19 07:43:58

+0

E不起作用,因为该类是“com.sun.test.Commander”,并且它不能伪装成默认包(即“Commander”)。 – 2010-02-19 07:54:12

2

A.不工作,因为Java将找不到Commander

B.将工作,因为Java将找不到com.sun.test.Commander

下都可以工作,至少在Windows。平台。这就是为什么您必须使用.而不是/

d和E他们将无法正常工作,因为我们仍然要求Java来搜索类Commander而不是com.sun.test.Commander

+3

C至少在Windows上也可以工作 – Lauri 2010-02-19 07:53:26

+0

你是完全正确的。我编辑了我的答案。 – romaintaz 2010-02-19 07:57:09

2

假设CLASSPATH环境变量没有设置(因此当前工作目录是在默认情况下classpath中) ,答案如下:

A.不行的,没有指挥官类默认包

B.这一个工程

C.氏■一个作品也,而B优选

D.类路径是富/ com.sun.test其中存在默认包没有指挥官类

E.类路径是富/ COM /太阳/测试默认包中没有Commander类的地方