Kotlin 可見(jiàn)性修飾符

在本文中,您將了解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)。

包內(nèi)的可見(jiàn)性修飾符

包組織一組相關(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)

類(lèi)和接口內(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)
}

更改構(gòu)造函數(shù)的可見(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)性修飾符。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清