可见性修饰符是用于设置类、对象、接口、构造函数、函数、属性及其 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 中,局部函数、变量和类不能具有可见性修饰符。