簡體   English   中英

為什么編譯器需要.java后綴,但解釋器不需要.class后綴?

[英]Why compiler needs .java suffix but interpreter doesn't need .class suffix?

編譯Foo.java:javac Foo.java

運行程序: java Foo

為什么編譯器需要.java后綴,但解釋器不需要.class后綴?

正如其他幾個答案所解釋的那樣,Java編譯器采用文件名作為參數,而解釋器采用類名。 因此,您將.java擴展名賦予編譯器,因為它是文件名的一部分,但不將其提供給解釋器,因為它不是類名的一部分。

但是,然后,您可能想知道,為什么他們不只是以不同的方式設計Java解釋器,以便采用文件名? 答案是,並非總是從.class文件中加載.class 有時它們來自JAR檔案,有時它們來自互聯網 ,有時它們是由程序動態構建的,依此類推。 一個類可以來自任何可以提供定義它的二進制數據的來源。 也許同一個類可能具有來自不同來源的不同實現,例如,程序可能嘗試從URL加載某個類的最新版本,但是如果失敗則將回退到本地文件。 Java的設計師認為,最好的是,當您嘗試運行程序時,不必擔心必須跟蹤定義正在運行的類的源。 您只需提供完全合格的類名,然后讓Java(或更確切地說,其ClassLoader )完成查找它的艱苦工作即可。

Java編譯器采用文件名作為輸入,因此采用Foo.java。

Java解釋器將使用完全限定的類名稱,並在類路徑和當前目錄中搜索該類。 如果您使用的是Java Foo.class,它將在包“ Foo”中搜索名為“ class”的類,如果該類在默認包中,則返回NoClassDefFoundError,據我從您的示例中了解

Foo.java是文件名,而簡單的“ Foo”是類名(不是文件名)。 默認的ClassLoader將在當前工作目錄中搜索文件Foo.class並加載它。

補充大衛·扎斯拉夫斯基的解釋:

Java源代碼也不一定來自.java文件。 我們可以擁有一個從差異字符流中獲取源代碼的編譯器,如API javax.tools.JavaCompiler

cmd行util javac恰好僅與文件源一起使用,因此需要文件路徑。

每種語言都將具有語法和語義,這些語法和語義將在相似各方之間建立規則和理解。 就像英語中的單詞,時態,動詞等如何簡化兩個英語會話之間的交流一樣。 Java規范建立了語法和語義,編譯器只能理解Java文件,而解釋器只能理解.class文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM