2011-10-03 56 views
5

好的,所以一個java源文件必須至少有一個公共類,該文件應該被稱爲「class-name.java」。很公平。沒有公共類的.java文件的Java編譯

因此,如果我有一個類,那麼下面就編譯:

public class HelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 
} 

但我是什麼錯誤,如果我從上面的代碼中刪除了「公共」訪問修飾符,該代碼仍然編譯。我只是不明白。刪除它,代碼如下:

class HelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 
} 

在上面的代碼,因爲我刪除了「公共」訪問修飾符,我班有違約或包專用通道,即它不能從外界訪問,只能從包裝內購買。

所以我的問題是,上面的代碼是如何編譯的?在這種情況下,文件HelloWorld.java沒有'public'HelloWorld類(只有包 - 私有HelloWorld.class),因此我的理解不應該編譯。

感謝您回答我的問題!

問候, 匿名

+0

*「java源文件必須至少有一個公共類」*呃不,不需要任何東西。(http://stackoverflow.com/q/7791487/1134080) – ADTC

回答

1

您可以將文件中的非公共類,它是不是一個錯誤,但功能。

你的問題是在包裝層面,而不是編譯。因爲你可以編譯與非公共類這個文件,但你不能從外部調用它,所以它不工作作爲應用基礎類

像這樣:

// [+] single file: SomeWrapper.java 

public class SomeWrapper { 
    ArrayList<_PrivateDataType> pdt; 
} 
// [-] single file: SomeWrapper.java 

// [+] single file: _PrivateDataType.java 
class _PrivateDataType { 
    // members, functions, whatever goes here 
} 

// [-] single file: _PrivateDataType.java 
+0

謝謝,但我的觀點是不添加私人數據類型或任何東西。我的問題是,上面的代碼是如何編譯和/或工作的,因爲我有一個.java文件,但沒有任何公共類。其中唯一的類是一個包私人類,而不是公共類。 – anon1981

+0

問題在哪裏?您可以在同一個包中創建另一個類(具有相同的效果)並使用該包專用類。 –

+0

同樣,我的問題是不要在文件中添加任何新類。我只關心包私人訪問。 – anon1981

6

Java源文件必須至少有一個公共類,該文件應該叫做class-name.java

不正確,頂級類不必聲明爲public。 JLS說:

如果頂級類或接口類型未聲明爲public,那麼它只能從聲明它的包中訪問。

參見http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#104285第6.6.1節。

+0

謝謝!那麼你是說,誰調用main()從某種包裝上下文中調用它?也就是說,調用main()的調用者(可能是JVM)與我的HelloWorld類在同一個包中? 只是困惑!所以謝謝你抽空回答我的問題。 – anon1981

+0

另外,您可以在java文件中定義多個非公共類。 –

+0

所以現在我的問題是:HelloWorld是默認類中的包私有類,對嗎?所以它應該可以從默認包中訪問,但不能從默認包之外訪問,對嗎? 因此,進一步推斷,當main()被調用時,它必須從默認包中的*調用,對嗎?或者,調用main()的人與HelloWorld類在同一個包中。對 ? – anon1981

-1

如果您未指定類(或其字段或方法)的訪問修飾符,則會爲其分配「默認」訪問權限。這意味着它只能從相同的包中訪問(在這種情況下,是默認包)。

網站Javabeginner.com有關於此主題的文章 - 您應該熟悉Java中的訪問修飾符,無論是從本網站還是其他網站。

1

主要方法就像任何其他方法一樣。唯一的區別是它可以通過java命令從命令行調用可能。即使主方法在命令行中不可見,該類仍然可以像其他任何Java類一樣使用,並且您的主方法可能由同一個包中的另一個類調用。所以我覺得它編譯。

在Java中,主要功能在任何意義上都不是特殊的。只是存在一個終端命令,能夠調用靜態方法稱爲主...

+1

現在,HelloWorld類具有包 - 私有可訪問性。因此,現在調用main(JVM?)的人也必須在同一個包中,對嗎? – anon1981

+0

我直接從java類調用,然後是。然而,反思的規則稍有不同。通過反射,可以調用任何非私有方法。 JVM使用反射來調用你的主要方法。 –

1

這沒什麼好奇的。我想這種行爲類似於某個C/C++編譯器。

類似於「void main(){/ ... /}」的代碼將被這些編譯器正確編譯,儘管它不符合標準兼容代碼。簡單地說,編譯器將「void」與「int」進行交換。

我認爲類似的行爲是由java編譯器實現的。

問候, xong

+0

看來我錯了。 =) – xong

1

有一個非公共類的有效用途。因此編譯器在嘗試編譯文件時不會出錯。