跳到主要内容

Kotlin 可见性修饰符

提示
  1. Kotlin 可见性修饰符的作用:可见性修饰符(如 public, private, protected, internal)用于定义类、函数、属性等的访问级别,即它们可以在哪些区域被访问或使用。
  2. 不同修饰符的访问范围
    • public(默认):可以在任何地方访问。
    • private:仅在声明它的类或文件内部可访问。
    • internal:在相同模块内可见。
    • protected:在声明它的类及其子类内可访问。
  3. 构造函数的可见性更改:默认情况下,Kotlin 中的构造函数是公开的(public),但可以通过显式添加 constructor 关键字来更改其可见性(例如设为 private)。

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

Kotlin 类和对象 文章中,你简要了解了 publicprivate 这两个可见性修饰符。你将会详细了解另外两个可见性修饰符 protectedinternal(以及 publicprivate)。

在包内的可见性修饰符

包将一系列相关的函数、属性以及类、对象和接口组织在一起。推荐阅读: Kotlin 包

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

注意: 如果没有指定可见性修饰符,则默认为 public

举个例子:

// 文件名:hello.kt

package test

fun function1() {} // 默认为 public,到处可见

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 // 默认为 public
private var b = 2 // 仅在 Base 类内可见
protected open val c = 3 // 对 Base 类和 Derived 类可见
internal val d = 4 // 在同一个模块内可见

protected fun e() { } // 对 Base 类和 Derived 类可见
}

class Derived: Base() {

// Base 类的 a、c、d 和 e() 可见
// 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) {
// 代码
}

下面展示了如何更改其可见性。

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

这里构造函数是 private 的。

注意: 在 Kotlin 中,本地函数、变量和类不能