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