可見性修飾符
類、對象、接口、構(gòu)造函數(shù)、方法、屬性和它們的 setter 都可以有?可見性修飾符。 (getter 總是與屬性有著相同的可見性。) 在 Kotlin 中有這四個(gè)可見性修飾符:private、?protected、?internal?和?public。 如果沒有顯式指定修飾符的話,默認(rèn)可見性是?public。
在本頁可以學(xué)到這些修飾符如何應(yīng)用到不同類型的聲明作用域。
包
函數(shù)、屬性和類、對象和接口可以在頂層聲明,即直接在包內(nèi):
// 文件名:example.kt
packagefoo
?
funbaz() {……}
classBar{……}
如果你不指定任何可見性修飾符,默認(rèn)為?public,這意味著你的聲明將隨處可見;
如果你聲明為?private,它只會在聲明它的文件內(nèi)可見;
如果你聲明為?internal,它會在相同模塊內(nèi)隨處可見;
protected?不適用于頂層聲明。
注意:要使用另一包中可見的頂層聲明,仍需將其導(dǎo)入進(jìn)來。
例如:
// 文件名:example.kt
packagefoo
?
privatefunfoo() {……}// 在 example.kt 內(nèi)可見
?
publicvarbar:Int=5// 該屬性隨處可見
privateset// setter 只在 example.kt 內(nèi)可見
internalvalbaz=6// 相同模塊內(nèi)可見
類和接口
對于類內(nèi)部聲明的成員:
private?意味著只在這個(gè)類內(nèi)部(包含其所有成員)可見;
protected—— 和?private一樣 + 在子類中可見。
internal?—— 能見到類聲明的?本模塊內(nèi)?的任何客戶端都可見其?internal?成員;
public?—— 能見到類聲明的任何客戶端都可見其?public?成員。
請注意在 Kotlin 中,外部類不能訪問內(nèi)部類的 private 成員。
如果你覆蓋一個(gè)?protected?成員并且沒有顯式指定其可見性,該成員還會是?protected?可見性。
例子:
openclassOuter{
privatevala=1
protectedopenvalb=2
internalvalc=3
vald=4// 默認(rèn) public
protectedclassNested{
publicvale:Int=5
? ? }
}
?
classSubclass:Outer() {
// a 不可見
// b、c、d 可見
// Nested 和 e 可見
?
overridevalb=5// “b”為 protected
}
?
classUnrelated(o:Outer) {
// o.a、o.b 不可見
// o.c 和 o.d 可見(相同模塊)
// Outer.Nested 不可見,Nested::e 也不可見
}
構(gòu)造函數(shù)
要指定一個(gè)類的的主構(gòu)造函數(shù)的可見性,使用以下語法(注意你需要添加一個(gè)顯式?constructor?關(guān)鍵字):
classCprivateconstructor(a:Int) {……}
這里的構(gòu)造函數(shù)是私有的。默認(rèn)情況下,所有構(gòu)造函數(shù)都是?public,這實(shí)際上等于類可見的地方它就可見(即 一個(gè)?internal?類的構(gòu)造函數(shù)只能在相同模塊內(nèi)可見).
局部聲明
局部變量、函數(shù)和類不能有可見性修飾符。
模塊
可見性修飾符?internal?意味著該成員只在相同模塊內(nèi)可見。更具體地說, 一個(gè)模塊是編譯在一起的一套 Kotlin 文件:
一個(gè) IntelliJ IDEA 模塊;
一個(gè) Maven 項(xiàng)目;
一個(gè) Gradle 源集(例外是?test?源集可以訪問?main?的 internal 聲明);
一次?<kotlinc>?Ant 任務(wù)執(zhí)行所編譯的一套文件。