Kotlin 可见性修饰符

在本文中,您将了解Kotlin中的4种可见性修饰符,以及它们在不同情况下的工作方式。

可见性修饰符是用于设置类,对象,接口,构造函数,函数,属性及其设置器的可见性(可访问性)的关键字。(不能设置 getters 的可见性修饰符,因为它们总是具有与属性相同的可见性)

Kotlin类和对象文章中,您简要了解了可见性修饰符 public 和 private。本文您将详细了解另外两个可见性修饰符 protected 和 internal(以及public 和 private)。

包内的可见性修饰符

包组织一组相关的函数、属性和类、对象和接口。

修饰符描述
public在任何地方都可见
private在包含声明的文件内可见
internal在同一模块内可见(一组一起编译的Kotlin文件)
protected不可用于包(用于子类)

注意:如果未指定可见性修饰符,则默认情况下为默认值 public 。

让我们举个实例:

//文件名: hello.kt
package test

fun function1() {}   //默认情况下是公共的,并且在任何地方都可见

private fun function2() {}   //在hello.kt内部可见

internal fun function3() {}   //在同一模块内可见

var name = "Foo"   //随处可见
    get() = field   //在hello.kt内可见(与其属性相同)
    private set(value) {   //在hello.kt内部可见
        field = value
    }

private class class1 {}   //在hello.kt内部可见

类和接口内的可见性修饰符

下面是可见性修饰符对类内声明的成员(函数、属性)的工作方式:

修饰符描述
public对任何可以看到声明类的客户端可见
private仅在类内部可见
protected在类及其子类内可见
internal对模块内可以看到声明类的任何客户端可见

注意:如果您在派生类中重写 protected 成员而不指定其可见性,则其可见性也将为 protected。

让我们举个实例:

open class Base() {
    var a = 1                 //默认情况下为公共
    private var b = 2         // Base 类私有
    protected open val c = 3  //对 Base 类和 Derived 类可见
    internal val d = 4        //在同一模块内可见

    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 不可见
}

更改构造函数的可见性

默认情况下,构造函数的可见性为 public。但是,你可以改变它。为此,您需要显式地添加 constructor 关键字。

在下面的示例中,构造函数默认为 public:

class Test(val a: Int) {
    // code
}

您可以通过以下方法更改其可见性。

class Test private constructor(val a: Int) {
    // code
}

这里的构造函数是 private。

注意:  在Kotlin中,局部函数,变量和类不能具有可见性修饰符。