爲什麼不在java
命令後給filename.class
文件,而不是隻有filename
?爲什麼我們不使用帶「java」命令的.class擴展名?
假設我們想編譯test.java
程序,那麼我們運行javac test.java
。沒關係!
之後它會產生test.class
文件,但運行程序我們運行java test
而不是java test.class
。這是什麼原因?
爲什麼不在java
命令後給filename.class
文件,而不是隻有filename
?爲什麼我們不使用帶「java」命令的.class擴展名?
假設我們想編譯test.java
程序,那麼我們運行javac test.java
。沒關係!
之後它會產生test.class
文件,但運行程序我們運行java test
而不是java test.class
。這是什麼原因?
因爲您沒有描述文件要運行。您正在告訴Java哪個類包含主要方法 - 並且類的名稱是(在您的情況下)filename
,而不是filename.class
。
字節碼幾乎總是包含在文件系統的文件中的事實是一個實現細節。您傳遞給java
命令的類路徑告訴它其中要查找類,然後主類參數告訴它要使用哪個類。
(它是javac
不同,因爲這個節目專門確實需要源文件並將其編譯成字節碼。)
提到該代碼可能位於JAR或類路徑中的其他位置可能很有用。 – bstempi
你不通過文件名來java命令要麼。你傳遞一個完全合格的類名稱。像com.yourcompany.yourapp.Main
。然後,Java通過查看類路徑中的所有目錄和jar文件來找到該類名稱的.class文件。
這是一個實現細節。 Java類加載器系統可以通過自定義代碼進行擴展以使其行爲不同。例如,一些公司已經編寫了加密類加載器,能夠即時解密和加載加密的類文件。你可以假設創建一個類似的系統,將一堆類捆綁在一起,形成類似於.NET程序集的東西,而不是Jar文件(這實際上只是一個zip文件)。
「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
希望這有助於!
javac編譯器創建文件名爲Xyz.class(這裏的XYZ是文件名) 包含該程序 的字節版本的Java字節碼是什麼,但你的程序包含指令Java解釋器將執行的中間表示。
因此,javac的輸出是不是可以直接執行
代碼,javac的關鍵字用於編譯Java程序 如果我們使用的.class用javac(已編譯文件的.class文件),然後如何編譯已經編譯文件
所以有效語法是:javac的 Xyz.java(編譯Java程序) 的java的Xyz(運行Java程序)
這不回答這個問題。你只是錯過了'java'沒有被調用來運行一個FILE,而是一個CLASS。類名不包含文件名的.class擴展名。 – GhostCat
最後,因爲這是它的設計方式。它的設計可能是不同的,但是,正如下面的答案所暗示的那樣,在「.class」上加入會導致軟件包名稱解析困難,而且毫無疑問還有其他一些問題。對於這樣的事情,從來沒有一個「邏輯」設計,只是一些設計比其他設計更不合邏輯。 –