類,對(duì)象,接口,構(gòu)造函數(shù),函數(shù),屬性及其設(shè)置器可以具有可見(jiàn)性修飾符。 (Getter總是具有與屬性相同的可見(jiàn)性。)Kotlin中有四個(gè)可見(jiàn)性修飾符:
private
, protected
, internal
和 public
。如果沒(méi)有顯式修飾符,則使用的默認(rèn)可見(jiàn)性是public
。
下面請(qǐng)查看不同類型聲明范圍的說(shuō)明。
函數(shù),屬性和類,對(duì)象和接口可以在“頂層”上聲明,即直接在包中:
// file name: example.kt
package foo
fun baz() {}
class Bar {}
public
,這意味著聲明將在任何位置都可見(jiàn);private
,那么它只會(huì)在包含聲明的文件中可見(jiàn);internal
,則在同一模塊中的任何地方可見(jiàn);protected
,則不可用于頂層聲明。示例
// file name: example.kt
package foo
private fun foo() {} // visible inside example.kt
public var bar: Int = 5 // property is visible everywhere
private set // setter is visible only in example.kt
internal val baz = 6 // visible inside the same module
對(duì)于在類中聲明的成員:
private
只有在這個(gè)類才能看到(包括其所有成員);protected
- 相同于private
+ 在子類中可見(jiàn);internal
- 模塊中的任何看到聲明類的客戶端都看到其內(nèi)部成員;public
- 聲明類的任何客戶看到它的公共成員。注意Java用戶:外部類不會(huì)在Kotlin中看到其內(nèi)部類的私有成員。
如果覆蓋protected
的成員,并且不明確指定可見(jiàn)性,則覆蓋成員也將具有protected
的可見(jiàn)性。
例子
open class Outer {
private val a = 1
protected open val b = 2
internal val c = 3
val d = 4 // public by default
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a is not visible
// b, c and d are visible
// Nested and e are visible
override val b = 5 // 'b' is protected
}
class Unrelated(o: Outer) {
// o.a, o.b are not visible
// o.c and o.d are visible (same module)
// Outer.Nested is not visible, and Nested::e is not visible either
}
要指定類的主構(gòu)造函數(shù)的可見(jiàn)性,請(qǐng)使用以下語(yǔ)法(請(qǐng)注意,需要添加一個(gè)顯式constructor
關(guān)鍵字):
class C private constructor(a: Int) { ... }
這里的構(gòu)造函數(shù)是:private
。 默認(rèn)情況下,所有構(gòu)造函數(shù)都是public
,它們有效地相當(dāng)于在類可見(jiàn)的地方可見(jiàn)(即internal
類的構(gòu)造函數(shù)只能在同一模塊中可見(jiàn))。
局部的變量,函數(shù)和類不能有可見(jiàn)性修飾符。
內(nèi)部可見(jiàn)性修飾符意味著該成員可以使用相同的模塊。 更具體地說(shuō),一個(gè)模塊是一組編譯的Kotlin文件: