2011-10-03 118 views
3

考慮下面的代碼,其中HelloWorld類有違約或包私有訪問:.java文件中的包私有類 - 爲什麼可以訪問?

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

,並假設上面的代碼保存在一個名爲HelloWorld.java文件。所以我的問題是:因爲HelloWorld現在是一個包私人類,它是如何工作的?方法main()不應該是可見或跨包可訪問的,我是對的嗎?

這讓我感覺良好,如果該類HelloWorld聲明爲public。混淆只有在用默認的包私有訪問聲明時纔會出現。

+0

[Java編譯沒有公共類的.java文件]的可能重複(http://stackoverflow.com/questions/7633631/java-compilation-of-a-java-file-without-a-public-類) – Qwerky

回答

1

對於駐留在不同包中的其他類,主方法將不可見。但JVM可以看到這一切。它不會有任何困難找到你的主要方法,併爲你運行它。

如果要模擬訪問限制,請在另一個包中編寫另一個類,並嘗試調用HelloWorld.main並查看編譯器是否保持安靜。

+0

>但JVM可以看到這一切。它不會有任何困難找到你的主要方法,併爲你運行它。 爲什麼?它是主要方法的特殊屬性嗎? – anon1981

+0

是的,沒錯。 – adarshr

6

JVM啓動在§12.1 Virtual Machine Start-Up of the JLS說明。

請注意,本章說什麼都沒有關於對類的可見性檢查。它只有只有規定main方法必須是public

這意味着在類級別上沒有檢查可見性(哪種類型是有意義的,因爲沒有上下文來檢查可見性:其中「包」是「調用者」)? 。

+0

謝謝!這有助於很多! – anon1981

+0

這應該是被接受的答案。 –

1

你沒有說得很清楚,但我認爲你的問題是爲什麼當你在命令行鍵入java HelloWorld時可以運行主要方法。

的答案是:Java Language Specification根本不需要包含的主要方法是公共類。訪問修飾符是一種主要旨在通過封裝來幫助維護的語言機制。它們不是一個真正的安全功能,當然也不是不可動搖的物理定律。 JVM啓動機制簡單地忽略它們。

事實上,你甚至可以使用私有內部類,它仍然會運行。

1

也許JLS的設計者決定,如果你知道類名,就不需要限制對主要方法的訪問,而乍一看它看起來是違反直覺的;從另一側 - 訪問總是可以通過反射獲得,因此它不能被視爲安全漏洞... 無論如何,例如通過創建一個包裝 - 私人類的外觀,我們可以間接訪問那個包裝......因此,保護​​不是來自不正確的用法,而是允許進一步的變化。

相關問題