2013-07-05 25 views
-1

我的班級是的javac允許文件名比類名稱不同在某些系統

public class Foo {} 

和文件名是Test.java

但在我的系統中,當我編譯它顯示了以下錯誤

test.java:1: class Foo is public, should be declared in a file named Foo.java 
public class Foo { 
    ^
1 error 

但在我的朋友系統中它的編譯我們都使用oracle JDK

可以解釋爲什麼嗎?

+0

對你的「朋友系統」更具體。哦,並給我們'java -version'的輸出 – Ingo

+2

@Ingo。這不適用於任何Java版本。 –

+2

可能在你的朋友的系統上,這個班不是公開的。 –

回答

2

一定它仍然是市民朋友的系統上?這會讓我感到驚訝 - 如果你同時使用Oracle JDK中的javac進行編譯,我希望雙方都抱怨。

這就是說,它不是一個錯誤。這是可選的。從JLS section 7.6

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

  • 類型由碼在其它編譯單元稱爲在聲明類型的包中。

  • 的類型聲明的公共(和因此是從其他包代碼潛在訪問)。

強調的是我的,但要注意,它是一個可選限制。

+0

有沒有機會用我用openjdk說的話我沒有檢查我的朋友JDK實際上他告訴我它的Oracle jdk –

+0

@SarathSoman:也許,但我認爲他更可能讓這個類變得非公開。 –

+0

這是不公開的謝謝你的幫助 –

1

對於javac從Oracle JDK,你看到的是not possible

源代碼文件名必須具備的.java後綴,類文件名必須具有的.class後綴,以及源代碼和類文件必須有根名稱標識類。例如,一個名爲MyClass的類將被寫入名爲MyClass.java的源文件中,並被編譯成名爲MyClass.class的字節碼類文件。

因此,仔細檢查你是否使用完全相同的源代碼(Foo public?),並且確實使用Oracle JDK。

這個要求具體到Oracle JDK。其他實現可以違反這個,因爲它的每可選的JLS

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

  • 該類型由聲明類型的包的其他編譯單元中的代碼引用。

  • 的類型聲明的公共(和因此是從其他包代碼潛在訪問)。

該限制意味着,必須有在每編譯單元至多一個這樣的類型。這個限制使得Java編譯器可以輕鬆地在包中找到一個命名類。在實踐中,許多程序員選擇將每個類或接口類型放入其自己的編譯單元中,而不管它是否公開,或者是由其他編譯單元中的代碼引用。