Kotlin 可见性修饰符

可见性修饰符是用于设置类、对象、接口、构造函数、函数、属性及其 setter 的可见性(可访问性)的关键字。(您无法为 getter 设置可见性修饰符,因为它们始终具有与属性相同的可见性。)

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


包内的可见性修饰符

一个包组织了一组相关的函数、属性、类、对象和接口。推荐阅读:Kotlin 包

修饰符 描述
public 声明随处可见
private 在声明所在的文件中可见
internal 在同一模块(一组一起编译的 Kotlin 文件)内可见
protected 包不可用(用于子类)

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

我们来看一个例子

// file name: hello.kt

package test

fun function1() {}   // public by default and visible everywhere

private fun function2() {}   // visible inside hello.kt

internal fun function3() {}   // visible inside the same module

var name = "Foo"   // visible everywhere
    get() = field   // visible inside hello.kt (same as its property)
    private set(value) {   // visible inside hello.kt
        field = value
    }

private class class1 {}   // visible inside hello.kt

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

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

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

注意:如果在派生类中覆盖 `protected` 成员而不指定其可见性,则其可见性也将是 `protected`。

我们来看一个例子

open class Base() {
    var a = 1                 // public by default
    private var b = 2         // private to Base class
    protected open val c = 3  // visible to the Base and the Derived class
    internal val d = 4        // visible inside the same module

    protected fun e() { }     // visible to the Base and the Derived class
}

class Derived: Base() {

    // a, c, d, and e() of the Base class are visible
    // b is not visible

    override val c = 9        // c is protected
}

fun main(args: Array<String>) {
    val base = Base()

    // base.a and base.d are visible
    // base.b, base.c and base.e() are not visible

    val derived = Derived()
    // derived.c is not visible
}

更改构造函数的可见性

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

在下面的示例中,构造函数默认是 `public` 的。

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

下面是如何更改其可见性。

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

这里的构造函数是 `private` 的。


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

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战