在本文中,您將了解Kotlin中的4種可見性修飾符,以及它們在不同情況下的工作方式。
可見性修飾符是用于設(shè)置類,對象,接口,構(gòu)造函數(shù),函數(shù),屬性及其設(shè)置器的可見性(可訪問性)的關(guān)鍵字。(不能設(shè)置 getters 的可見性修飾符,因為它們總是具有與屬性相同的可見性)
在Kotlin類和對象文章中,您簡要了解了可見性修飾符 public 和 private。本文您將詳細了解另外兩個可見性修飾符 protected 和 internal(以及public 和 private)。
包組織一組相關(guān)的函數(shù)、屬性和類、對象和接口。
| 修飾符 | 描述 |
|---|---|
| public | 在任何地方都可見 |
| private | 在包含聲明的文件內(nèi)可見 |
| internal | 在同一模塊內(nèi)可見(一組一起編譯的Kotlin文件) |
| protected | 不可用于包(用于子類) |
注意:如果未指定可見性修飾符,則默認情況下為默認值 public 。
讓我們舉個實例:
//文件名: hello.kt
package test
fun function1() {} //默認情況下是公共的,并且在任何地方都可見
private fun function2() {} //在hello.kt內(nèi)部可見
internal fun function3() {} //在同一模塊內(nèi)可見
var name = "Foo" //隨處可見
get() = field //在hello.kt內(nèi)可見(與其屬性相同)
private set(value) { //在hello.kt內(nèi)部可見
field = value
}
private class class1 {} //在hello.kt內(nèi)部可見下面是可見性修飾符對類內(nèi)聲明的成員(函數(shù)、屬性)的工作方式:
| 修飾符 | 描述 |
|---|---|
| public | 對任何可以看到聲明類的客戶端可見 |
| private | 僅在類內(nèi)部可見 |
| protected | 在類及其子類內(nèi)可見 |
| internal | 對模塊內(nèi)可以看到聲明類的任何客戶端可見 |
注意:如果您在派生類中重寫 protected 成員而不指定其可見性,則其可見性也將為 protected。
讓我們舉個實例:
open class Base() {
var a = 1 //默認情況下為公共
private var b = 2 // Base 類私有
protected open val c = 3 //對 Base 類和 Derived 類可見
internal val d = 4 //在同一模塊內(nèi)可見
protected fun e() { } //對 Base 類和 Derived 類可見
}
class Derived: Base() {
// a, c, d, 和 e()Base 類的所有屬性都是可見的
// b 不可見
override val c = 9 // c 是 protected
}
fun main(args: Array<String>) {
val base = Base()
//base.a和base.d可見
// base.b, base.c 和 base.e() 不可見
val derived = Derived()
// derived.c 不可見
}默認情況下,構(gòu)造函數(shù)的可見性為 public。但是,你可以改變它。為此,您需要顯式地添加 constructor 關(guān)鍵字。
在下面的示例中,構(gòu)造函數(shù)默認為 public:
class Test(val a: Int) {
// code
}您可以通過以下方法更改其可見性。
class Test private constructor(val a: Int) {
// code
}這里的構(gòu)造函數(shù)是 private。
注意: 在Kotlin中,局部函數(shù),變量和類不能具有可見性修飾符。