2014-01-20 192 views
0

我知道在java文件中聲明的public類的名稱必須與其文件名相同。但我想知道這不是給我一個編譯錯誤,而是它運行成功。在java中省略訪問說明符

class Foo //<-- this can be any name... 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Hello World!"); 
    } 
} 

我知道默認訪問是package private。對於上述程序,類名和文件名不必相同。它正確執行,而不是編譯器錯誤。 任何人都可以拋出一些光?謝謝。

編輯:

現在我明白了!但另一個問題讓我感到震驚。當同一個文件中有兩個這樣的類時會發生什麼?

那麼,我認爲.class文件將生成的類已執行main方法。沒有任何編譯錯誤,但令我意外的是沒有任何生成的文件。爲什麼?

+0

在公共訪問說明符中保留兩個類在一個java文件中。一個與主要和一個沒有主要。你會得到警告或錯誤。 – Rahul

+2

@Rahul:我看不出與問題有關的問題。 –

回答

1

是的,這是絕對的罰款。即使對於公共類,這也是編譯器特定的可選的限制。

section 7.6 of the JLS

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

  • 類型由在其他彙編代碼稱爲聲明類型的包的單元。

  • 該類型被聲明爲public(因此可以通過其他包中的代碼進行訪問)。

注意第二個小點 - 如果你的類是不公開的,這種限制是不適用的。

編輯:從更新的問題...

當同一個文件中有兩個這樣的類時會發生什麼?

類文件是根據類名生成的。 main方法的存在是完全不相關對此,原始源文件名也是如此。如果編譯成功,肯定會生成一個類文件。如果沒有示例代碼來重現問題,我們無法確定發生了什麼。

+0

看看我更新的問題! – nitish712

+0

@ nitish712:查看我的編輯,但請儘量保留每個帖子的單個問題。這是危險地轉向「我一直在想別的東西我想問的領域......」 –

+0

我的不好。類文件已生成。 – nitish712

1

你的觀察是正確的。如果該類不公開,則該類的名稱不需要與文件名匹配。如果文件中沒有公開課,則可以根據需要命名文件。

如果說有一個源文件Test003.java,你定義它
兩個非公共類AAA和BBB,沒有編譯
錯誤和兩個類文件生成:AAA.classBBB.class

所以一切都很好。

01/20/2014 06:27 AM    238 AAA.class 
01/20/2014 06:27 AM    238 BBB.class 

enter image description here

+0

看看我更新的問題! – nitish712

+0

@ nitish712整個事情與主要方法的存在/缺失無關。我會檢查你更新的問題。 –

+0

@ nitish712查看我的更新回答。 –