Kotlin可見性修飾符
類,對象,接口,構造函數,函數,屬性及其設置器可以具有可見性修飾符。 (Getter總是具有與屬性相同的可見性。)Kotlin中有四個可見性修飾符:
private
, protected
, internal
和 public
。如果沒有顯式修飾符,則使用的默認可見性是public
。
下面請查看不同類型聲明範圍的說明。
包
函數,屬性和類,對象和接口可以在「頂層」上聲明,即直接在包中:
// 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
- 模塊中的任何看到聲明類的客戶端都看到其內部成員; -
public
- 聲明類的任何客戶看到它的公共成員。
注意Java用戶:外部類不會在Kotlin中看到其內部類的私有成員。
如果覆蓋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
}
構造函數
要指定類的主構造函數的可見性,請使用以下語法(請注意,需要添加一個顯式constructor
關鍵字):
class C private constructor(a: Int) { ... }
這裏的構造函數是:private
。 默認情況下,所有構造函數都是public
,它們有效地相當於在類可見的地方可見(即internal
類的構造函數只能在同一模塊中可見)。
局部聲明
局部的變量,函數和類不能有可見性修飾符。
模塊
內部可見性修飾符意味着該成員可以使用相同的模塊。 更具體地說,一個模塊是一組編譯的Kotlin文件:
- IntelliJ IDEA模塊;
- Maven或Gradle項目;
- 通過一次調用Ant任務編譯的一組文件。