# Kotlin 可见性修饰符

> 原文： [https://www.programiz.com/kotlin-programming/visibility-modifiers](https://www.programiz.com/kotlin-programming/visibility-modifiers)

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

可见性修饰符是用于设置类，对象，接口，构造器，函数，属性及其设置程序的可见性（可访问性）的关键字。 （您无法设置获取器的可见性修饰符，因为它们始终具有与属性相同的可见性。）

在 [Kotlin 类和对象](/kotlin-programming/class-objects "Kotlin Class and Objects")文章中，您简要了解了可见性修饰符`public`和`private`。 您将详细了解另外两个可见性修饰符`protected`和`internal`（以及`public`和`private`）。

* * *

## 包内的可见性修饰符

程序包组织了一组相关的函数，属性和类，对象和接口。 **推荐阅读**： *Kotlin 包*

| 编辑 | 描述 |
| --- | --- |
| `public` | 声明随处可见 |
| `private` | 在包含声明的文件内可见 |
| `internal` | 在同一模块内可见（一组一起编译的 Kotlin 文件） |
| `protected` | 不适用于包（用于子类） |

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

让我们举个例子：

```kt
// 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`。

Let's take an example:

```kt
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`：

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

```

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

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

这里的构造器是`private`。

* * *

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