[英]What is the accessibility of any other top-level class in the same .java file?
我聽說一個.java文件只能有一個公共頂級類。
同一.java文件中其他任何頂級類的可訪問性是否必須是private
或protected
?
為什么
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文件中其他任何頂級類的可訪問性是否必須是
private
或protected
?
顯然不是,因為您的問題編譯錯誤已經告訴您private
對於頂級類無效。
Java語言規范7.6頂級類型聲明回答了您的問題:
在沒有訪問修飾符的情況下,頂級類型具有包訪問權限:只能在聲明該包的包的編譯單元中對其進行訪問(第6.6.1節 )。 可以將某個類型聲明為
public
類型,以授予從其他包中的代碼對該類型的訪問權限。如果頂級類型聲明包含以下任何一種訪問修飾符,則是編譯時錯誤:
protected
,private
或static
。
因此,頂級類甚至不允許 private
或protected
。
規范繼續說:
當且僅當包存儲在文件系統中(第7.2節 ),如果在文件中未找到由類型名組成的名稱的類型,則主機系統可以選擇強制執行限制,即它是編譯時錯誤。如果滿足以下任一條件,則加上擴展名(例如
.java
或.jav
):
該類型由聲明該類型的包的其他編譯單元中的代碼引用。
該類型被聲明為
public
(因此可以從其他包中的代碼訪問)。這種限制意味着每個編譯單元最多只能有一個這樣的類型。 此限制使Java編譯器可以輕松地在包中查找命名的類。 實際上,許多程序員選擇將每個類或接口類型放入其自己的編譯單元中,無論該類或接口類型是公共的還是由其他編譯單元中的代碼引用的。
如您所見, public
頂級類的名稱必須與源文件相同。 那么,每個文件當然只能有一個public
頂級類。
任何非public
頂級類都必須是通常稱為package-private的類 ,即它必須沒有訪問修飾符。
在沒有訪問修飾符的情況下,大多數聲明都具有包訪問權限 ,從而允許訪問包中包含其聲明的任何位置; 其他可能性是
public
,protected
和private
。
內部類可以具有任何訪問修飾符,但是外部類只能具有public或default修飾符。
例如:- public class A
class A
或class A
要了解有關Java中訪問修飾符的更多信息,可以查看此鏈接。 在Java中,默認,公共,受保護和私有之間的區別
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.