27.md 3.5 KB
Newer Older
W
wizardforcel 已提交
1
# Kotlin 可见性修饰符
W
wizardforcel 已提交
2 3 4

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

W
wizardforcel 已提交
5
#### 在本文中,您将了解 Kotlin 中的所有 4 种可见性修饰符,以及它们在不同情况下的工作方式。
W
wizardforcel 已提交
6

W
wizardforcel 已提交
7
可见性修饰符是用于设置类,对象,接口,构造器,函数,属性及其设置程序的可见性(可访问性)的关键字。 (您无法设置获取器的可见性修饰符,因为它们始终具有与属性相同的可见性。)
W
wizardforcel 已提交
8

W
wizardforcel 已提交
9
[Kotlin 类和对象](/kotlin-programming/class-objects "Kotlin Class and Objects")文章中,您简要了解了可见性修饰符`public``private`。 您将详细了解另外两个可见性修饰符`protected``internal`(以及`public``private`)。
W
wizardforcel 已提交
10 11 12

* * *

W
wizardforcel 已提交
13
## 包内的可见性修饰符
W
wizardforcel 已提交
14

W
wizardforcel 已提交
15
程序包组织了一组相关的函数,属性和类,对象和接口。 **推荐阅读***Kotlin 包*
W
wizardforcel 已提交
16 17 18

| 编辑 | 描述 |
| --- | --- |
W
wizardforcel 已提交
19 20 21 22
| `public` | 声明随处可见 |
| `private` | 在包含声明的文件内可见 |
| `internal` | 在同一模块内可见(一组一起编译的 Kotlin 文件) |
| `protected` | 不适用于包(用于子类) |
W
wizardforcel 已提交
23

W
wizardforcel 已提交
24
**注意**:如果未指定可见性修饰符,则默认为`public`
W
wizardforcel 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

让我们举个例子:

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

* * *

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

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

| Modifier | Description |
| --- | --- |
| public | 任何可以看到声明类的客户都可以看到 |
| private | 仅在班级内部可见 |
| protected | 在类及其子类中可见 |
| internal | 对于模块内可以看到声明类的任何客户端可见 |

W
wizardforcel 已提交
61
**注意**:如果在派生类中覆盖`protected`成员而未指定其可见性,则其可见性也将为`protected`
W
wizardforcel 已提交
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

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
}

```

* * *

W
wizardforcel 已提交
97
## 更改构造器的可见性
W
wizardforcel 已提交
98

W
wizardforcel 已提交
99
默认情况下,构造器的可见性为`public`。 但是,您可以更改它。 为此,您需要显式添加`constructor`关键字。
W
wizardforcel 已提交
100

W
wizardforcel 已提交
101
在下面的示例中,构造器默认为`public`
W
wizardforcel 已提交
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117

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

```

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

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

W
wizardforcel 已提交
118
这里的构造器是`private`
W
wizardforcel 已提交
119 120 121

* * *

W
wizardforcel 已提交
122
**注意**:在 Kotlin 中,局部函数,变量和类不能具有可见性修饰符。