可見性修飾符
類、對象、接口、構造函數、方法、屬性和它們的 setter 都可以有 可見性修飾符。 (getter 總是與屬性有着相同的可見性。) 在 Kotlin 中有這四個可見性修飾符:private
、 protected
、 internal
和 public
。 如果沒有顯式指定修飾符的話,默認可見性是 public
。
以下解釋了這些修飾符如何應用到不同類型的聲明作用域。
包
函數、屬性和類、對象和接口可以在頂層聲明,即直接在包內:
// 文件名:example.kt
package foo
fun baz() { ... }
class Bar { ... }
- 如果你不指定任何可見性修飾符,默認爲
public
,這意味着你的聲明將隨處可見; - 如果你聲明爲
private
,它只會在聲明它的文件內可見; - 如果你聲明爲
internal
,它會在相同模塊內隨處可見; protected
不適用於頂層聲明。
注意:要使用另一包中可見的頂層聲明,仍需將其導入進來。
例如:
// 文件名:example.kt
package foo
private fun foo() { …… } // 在 example.kt 內可見
public var bar: Int = 5 // 該屬性隨處可見
private set // setter 只在 example.kt 內可見
internal val baz = 6 // 相同模塊內可見
類和接口
對於類內部聲明的成員:
private
意味着只在這個類內部(包含其所有成員)可見;protected
—— 和private
一樣 + 在子類中可見。internal
—— 能見到類聲明的 本模塊內 的任何客戶端都可見其internal
成員;public
—— 能見到類聲明的任何客戶端都可見其public
成員。
注意 對於Java用戶:Kotlin 中外部類不能訪問內部類的 private 成員。
如果你覆蓋一個 protected
成員並且沒有顯式指定其可見性,該成員還會是 protected
可見性。
例子:
open class Outer {
private val a = 1
protected open val b = 2
internal val c = 3
val d = 4 // 默認 public
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a 不可見
// b、c、d 可見
// Nested 和 e 可見
override val b = 5 // “b”爲 protected
}
class Unrelated(o: Outer) {
// o.a、o.b 不可見
// o.c 和 o.d 可見(相同模塊)
// Outer.Nested 不可見,Nested::e 也不可見
}
構造函數
要指定一個類的的主構造函數的可見性,使用以下語法(注意你需要添加一個顯式 constructor 關鍵字):
class C private constructor(a: Int) { …… }
這裏的構造函數是私有的。默認情況下,所有構造函數都是 public
,這實際上等於類可見的地方它就可見(即 一個 internal
類的構造函數只能在相同模塊內可見).
局部聲明
局部變量、函數和類不能有可見性修飾符。
模塊
可見性修飾符 internal
意味着該成員只在相同模塊內可見。更具體地說, 一個模塊是編譯在一起的一套 Kotlin 文件:
- 一個 IntelliJ IDEA 模塊;
- 一個 Maven 項目;
- 一個 Gradle 源集(例外是
test
源集可以訪問main
的 internal 聲明); - 一次
<kotlinc>
Ant 任務執行所編譯的一套文件。