![](/img/trans.png)
[英]In Java, why don't we need to mark a class as abstract when we define an interface in it?
[英]Why don't we use the .class extension with “java” command?
我們為什么不在java
命令之后給出filename.class
文件,而不是僅filename
?
假設我們要編譯test.java
程序,然后運行javac test.java
。 沒關系!
之后,它將生成test.class
文件,但是要運行該程序,我們運行java test
而不是java test.class
。 這是什么原因呢?
因為您沒有描述要運行的文件 。 您正在告訴Java哪個類包含main方法-並且該類的名稱是(在您的情況下) filename
而不是filename.class
。
字節碼幾乎總是包含在文件系統上的文件中這一事實是一個實現細節。 傳遞給java
命令的classpath告訴它在哪里尋找類,然后main class參數告訴它要使用哪個類。
(對於javac
來說是不同的,因為該程序確實會獲取源文件並將其編譯為字節碼。)
您也不會將文件名傳遞給java命令。 您為它傳遞了完全合格的類名稱。 像com.yourcompany.yourapp.Main
東西。 然后,Java通過查看類路徑中的所有目錄和jar文件來找到該類名稱的.class文件。
這是一個實現細節。 Java類加載器系統可以通過自定義代碼進行擴展,以使其行為有所不同。 例如,一些公司編寫了加密的類加載器,這些加載器能夠動態解密和加載加密的類文件。 假設您可以創建一個類似的系統,將一堆類捆綁在一起,類似於.NET程序集,而不是Jar文件(實際上只是一個zip文件)。
當您執行“ java test.class
”時
你得到
找不到或加載主類test.class
要么
線程“主”中的異常java.lang.NoClassDefFoundError:測試/類
這是因為“ java
java test.class
”中的“ java test.class
”是jvm
。 它在名為“ class
”的類中查找主要方法,而不是“ test
”。 “ java test.class
”中的點具有重要意義。 因此, jvm
如何查看“ java test.class
”,在名為“ test
”的包中查找名為“ class
”的java類。
*test.class*
*test* - package name
*class* - java filename
希望這可以幫助 !!
只是總結所有細節,
當一個人
java filename.java
他/她實際上運行了Java編譯器,並將代碼轉換為JVM可以理解的指令。
現在,當一個人跑
javac main_file
他/她調用JVM運行整個項目,該項目的主要方法在類main_file中
這個main_file實際上是該類的完全限定名稱,即,如果我有一個ProjectX並且該主類位於src.java.hello.main包中,
您應該運行命令
java src.java.hello.main.main_file
因此這個.
實際上是在JVM端保留的東西,我們不能將.class
作為java命令參數的一部分。
Javac編譯器創建一個名為Xyz.class的文件(此處Xyz為FileName),該文件包含程序的字節版本。Java字節碼不過是程序的中間表示形式,其中包含Java解釋程序將執行的指令。
因此,javac的輸出不是可以直接執行的代碼
簡而言之,如果我們將.class與javac一起使用(已編譯的文件.class文件),那么如何使用javac關鍵字來編譯Java程序,那么如何編譯已編譯的文件
因此有效語法為:Javac Xyz.java(編譯Java程序)java Xyz(運行Java程序)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.