Kotlin 可见性修饰符
提示
- Kotlin 可见性修饰符的作用:可见性修饰符(如
public
,private
,protected
,internal
)用于定义类、函数、属性等的访问级别,即它们可以在哪些区域被访问或使用。 - 不同修饰符的访问范围:
public
(默认):可以在任何地方访问。private
:仅在声明它的类或文件内部可访问。internal
:在相同模块内可见。protected
:在声明它的类及其子类内可访问。
- 构造函数的可见性更改:默认情况下,Kotlin 中的构造函数是公开的(
public
),但可以通过显式添加constructor
关键字来更改其可见性(例如设为private
)。
可见性修饰符是用来设置类、对象、接口、构造函数、函数、属性及其设值函数的可见性(访问性)的关键字。(你不能为取值函数设置可见性修饰符,因为它们的可见性总是与属性相同。)
在 Kotlin 类和对象 文章中,你简要了解了 public
和 private
这两个可见性修饰符。你将会详细了解另外两个可见性修饰符 protected
和 internal
(以及 public
和 private
)。
在包内的可见性修饰符
包将一系列相关的函数、属性以及类、对象和接口组织在一起。推荐阅读: 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 中,本地函数、变量和类不能