簡體   English   中英

同一.java文件中任何其他頂級類的可訪問性是什么?

[英]What is the accessibility of any other top-level class in the same .java file?

我聽說一個.java文件只能有一個公共頂級類。

同一.java文件中其他任何頂級類的可訪問性是否必須是privateprotected

為什么

public class MyClass {
    public static void main(String args[]) {
    }
}

 private class C{}

有錯誤

/MyClass.java:6: error: modifier private not allowed here
 private class C{}
         ^
1 error

謝謝。

一個Java文件只能有一個頂級類,這意味着您可以嵌套類。 您當前正在嘗試創建兩個頂級類。 嵌套類看起來像

public class MyClass {
    public static void main(String args[]) {
    }
    private class C{}
}

並具有名稱MyClass.C (此處MyClass是頂級類,而C是內部類)。 對於頂級類,源文件名必須與頂級類的聲明名稱匹配。 這與C語言(不強制執行源文件的命名方案)形成對比。

正如@Erwin Bolwidt評論中指出的那樣,您可以(盡管這是一個壞主意)

public class MyClass {
    public static void main(String args[]) {
    }
}
class C{}

但是只有與MyClass相同的程序包中的類才能訪問它。

同一.java文件中其他任何頂級類的可訪問性是否必須是privateprotected

顯然不是,因為您的問題編譯錯誤已經告訴您private對於頂級類無效。

Java語言規范7.6頂級類型聲明回答了您的問題:

在沒有訪問修飾符的情況下,頂級類型具有包訪問權限:只能在聲明該包的包的編譯單元中對其進行訪問(第6.6.1節 )。 可以將某個類型聲明為public類型,以授予從其他包中的代碼對該類型的訪問權限。

如果頂級類型聲明包含以下任何一種訪問修飾符,則是編譯時錯誤: protectedprivatestatic

因此,頂級類甚至不允許 privateprotected

規范繼續說:

當且僅當包存儲在文件系統中(第7.2節 ),如果在文件中未找到由類型名組成的名稱的類型,則主機系統可以選擇強制執行限制,即它是編譯時錯誤。如果滿足以下任一條件,則加上擴展名(例如.java.jav ):

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

  • 該類型被聲明為public (因此可以從其他包中的代碼訪問)。

這種限制意味着每個編譯單元最多只能有一個這樣的類型。 此限制使Java編譯器可以輕松地在包中查找命名的類。 實際上,許多程序員選擇將每個類或接口類型放入其自己的編譯單元中,無論該類或接口類型是公共的還是由其他編譯單元中的代碼引用的。

如您所見, public頂級類的名稱必須與源文件相同。 那么,每個文件當然只能有一個public頂級類。

任何非public頂級類都必須是通常稱為package-private的類 ,即它必須沒有訪問修飾符。

訪問修飾符在第6章中定義。名稱

在沒有訪問修飾符的情況下,大多數聲明都具有包訪問權限 ,從而允許訪問包中包含其聲明的任何位置; 其他可能性是publicprotectedprivate

內部類可以具有任何訪問修飾符,但是外部類只能具有public或default修飾符。

例如:- public class A class Aclass A

要了解有關Java中訪問修飾符的更多信息,可以查看此鏈接。 在Java中,默認,公共,受保護和私有之間的區別

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM