2012-05-04 56 views
17

可能重複:
Why filename in java should be same as class name?爲什麼Java文件必須與其公共類相同?

我有一個文件名爲temp.java。我寫了下面的代碼。爲什麼這個工作?

class demo //not public keyword and not same as filename 
{ 
    public static void main(String []args) 
    { 
     System.out.println("this is Main method"); 
    } 
} 

爲什麼這不起作用?

public class demo 
{ 
    public static void main(String []args) 
    { 
     System.out.println("this is Main method"); 
    } 
} 
+9

因爲這是*法*! –

+0

請看下面的鏈接http://wiki.answers.com/Q/Why_do_file_name_and_class_name_always_coincide_in_Java –

+1

這個問題如何被標記爲重複而沒有鏈接到dup?這是一些傳統的2012年魔術? – Zsw

回答

21

在你的第一個例子,你的類實際上是宣佈爲「包私人」(無修飾),這意味着在同一封裝內只有類可以訪問它。在你的第二個例子中,你宣稱它是公開的。

這是一個編譯器很好地符合JLS的場景。

The JLS states:

當包存儲在文件系統(第7.2.1節),主機系統可以選擇強制執行,這是一個編譯時錯誤,如果一個類中找不到的限制下類型名稱加上擴展組成名稱的文件(例如名爲.java或.jav)如果下面的任一爲真:

  • 類型由在封裝的其它編譯單元的代碼稱爲其中聲明瞭該類型。
  • 該類型被聲明爲public(因此可以從其他包中的代碼進行訪問)。

此限制意味着每個編譯單元最多隻能有一個這樣的類型。這個限制使Java編程語言的編譯器或Java虛擬機的實現可以輕鬆地在包中找到指​​定的類;例如,公共類型wet.sprocket.Toad的源代碼可以在wet/sprocket目錄中的Toad.java文件中找到,相應的目標代碼將在同一目錄中的Toad.class文件中找到。

這意味着,對於方案1,因爲你只有temp.java與包私有類demo,它不被在包的任何其他編譯單元提到了代碼,因此它會編譯沒有問題。

你的第二個場景已經聲明這個類是公共的 - 這意味着它可能從其他包中的代碼訪問 - 所以它必須符合類名稱等於文件名的標準。

如果您在第一個場景中創建了另一個類(在同一個包中),然後嘗試引用類demo,則應該會收到編譯錯誤。

相關問題