2010-02-19 124 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類的地方