類,對象,接口,構(gòu)造函數(shù),函數(shù),屬性及其設(shè)置器可以具有可見性修飾符。 (Getter總是具有與屬性相同的可見性。)Kotlin中有四個可見性修飾符:
private, protected, internal 和 public。如果沒有顯式修飾符,則使用的默認可見性是public。
下面請查看不同類型聲明范圍的說明。
函數(shù),屬性和類,對象和接口可以在“頂層”上聲明,即直接在包中:
// file name: example.kt
package foo
fun baz() {}
class Bar {}
public,這意味著聲明將在任何位置都可見;private,那么它只會在包含聲明的文件中可見;internal,則在同一模塊中的任何地方可見;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
對于在類中聲明的成員:
private只有在這個類才能看到(包括其所有成員);protected - 相同于private + 在子類中可見;internal - 模塊中的任何看到聲明類的客戶端都看到其內(nèi)部成員;public - 聲明類的任何客戶看到它的公共成員。注意Java用戶:外部類不會在Kotlin中看到其內(nèi)部類的私有成員。
如果覆蓋protected的成員,并且不明確指定可見性,則覆蓋成員也將具有protected的可見性。
例子
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ù)的可見性,請使用以下語法(請注意,需要添加一個顯式constructor關(guān)鍵字):
class C private constructor(a: Int) { ... }
這里的構(gòu)造函數(shù)是:private。 默認情況下,所有構(gòu)造函數(shù)都是public,它們有效地相當于在類可見的地方可見(即internal類的構(gòu)造函數(shù)只能在同一模塊中可見)。
局部的變量,函數(shù)和類不能有可見性修飾符。
內(nèi)部可見性修飾符意味著該成員可以使用相同的模塊。 更具體地說,一個模塊是一組編譯的Kotlin文件: