2013-07-17 55 views
7

爲什麼不在java命令後給filename.class文件,而不是隻有filename爲什麼我們不使用帶「java」命令的.class擴展名?

假設我們想編譯test.java程序,那麼我們運行javac test.java。沒關係!

之後它會產生test.class文件,但運行程序我們運行java test而不是java test.class。這是什麼原因?

+2

最後,因爲這是它的設計方式。它的設計可能是不同的,但是,正如下面的答案所暗示的那樣,在「.class」上加入會導致軟件包名稱解析困難,而且毫無疑問還有其他一些問題。對於這樣的事情,從來沒有一個「邏輯」設計,只是一些設計比其他設計更不合邏輯。 –

回答

20

因爲您沒有描述文件要運行。您正在告訴Java哪個包含主要方法 - 並且類的名稱是(在您的情況下)filename,而不是filename.class

字節碼幾乎總是包含在文件系統的文件中的事實是一個實現細節。您傳遞給java命令的類路徑告訴它其中要查找類,然後主類參數告訴它要使用哪個類。

(它是javac不同,因爲這個節目專門確實需要源文件並將其編譯成字節碼。)

+0

提到該代碼可能位於JAR或類路徑中的其他位置可能很有用。 – bstempi

6

你不通過文件名來java命令要麼。你傳遞一個完全合格的類名稱。像com.yourcompany.yourapp.Main。然後,Java通過查看類路徑中的所有目錄和jar文件來找到該類名稱的.class文件。

1

這是一個實現細節。 Java類加載器系統可以通過自定義代碼進行擴展以使其行爲不同。例如,一些公司已經編寫了加密類加載器,能夠即時解密和加載加密的類文件。你可以假設創建一個類似的系統,將一堆類捆綁在一起,形成類似於.NET程序集的東西,而不是Jar文件(這實際上只是一個zip文件)。

0
當你執行

java test.class

你得到任何

Could not find or load main class test.class

Exception in thread "main" java.lang.NoClassDefFoundError: test/class

這是因爲 「java」 在 「java test.class」 是jvm。它尋找類「class」而不是「test」的主要方法。點「java test.class」具有重要意義。那麼jvm如何查找「java test.class」,在名爲「test」的程序包中,它會查找名爲「class」的java類。

*test.class* 

*test* - package name 

*class* - java filename 

希望這有助於!

-1

javac編譯器創建文件名爲Xyz.class(這裏的XYZ是文件名) 包含該程序 的字節版本的Java字節碼是什麼,但你的程序包含指令Java解釋器將執行的中間表示。
因此,javac的輸出是不是可以直接執行

總之

代碼,javac的關鍵字用於編譯Java程序 如果我們使用的.class用javac(已編譯文件的.class文件),然後如何編譯已經編譯文件

所以有效語法是:javac的 Xyz.java(編譯Java程序) 的java的Xyz(運行Java程序)

+0

這不回答這個問題。你只是錯過了'java'沒有被調用來運行一個FILE,而是一個CLASS。類名不包含文件名的.class擴展名。 – GhostCat

相關問題