在本文中,您將了解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ù),變量和類不能具有可見性修飾符。