Kotlin 可见性修饰符

时间:2022-09-05 10:37:33

地址:http://kotlinlang.org/docs/reference/visibility-modifiers.html
日期:2017-07-11
译者:Linky

可见性修饰符

类、对象、接口、构造器、函数、属性和他们的 setters 方法都可以用 可见性修饰符 修饰(Getters 通常
都和属性的可见性相同)。Kotlin 中有四个可见性修饰符:privateprotectedinternalpublic
如果没有显式添加,则默认为 public

函数、属性 和 类、对象以及接口都可以在 顶层 声明,例如,直接在包中声明

  package foo

fun baz() {
}
class Bar {}

—— 如果不指定可见性,默认是 public,也就是说你的声明可以在任何地方可见;
—— 如果用 private 修饰一个属性,那么该属性只能在包含该声明的文件内部可见;
—— 如果用 internal 修饰一个属性,那么该属性在相同的 module 中可见;
—— 在 顶层声明中,不能用 protected 修饰;

例如:

  package foo

private fun foo() {} // visible inside example.kt

public var bar: Int = 5 // property is visible everywhere
private set // setter is visible only in example.kt

internal val baz = 6 // visible inside the same module

类 和 接口

对于声明在 类 中的成员

—— private 意味着 只在类内可见
—— protected 意味着 类内 + 子类中可见
—— internal 在 module 内部的任意 client,如果可访问声明的 类,那么也可以访问该类的 internal 成员
—— public 任意 client,如果可访问声明的类,那么也可见它的 public 成员

注意:对于 Java 用户来说,外部类不能访问 Kotlin 内部类的私有成员。

如果你继承了一个 protected 成员,同时没有指定它的可见性,那么默认重载的成员也有 protected 的可见性

  open class Outer {
private val a = 1
protected open val b = 2
internal val c = 3
val d = 4 // 默认为 public

protected class Nested {
public val e: Int = 5
}
}

class Subclass : Outer() {
// a 不可见
// b,c 和 d 是可见的
// Nested类 和 e 是可见的

override val b = 5 // 'b' is protected
}

class Unrelated(o: Outer) {
// o.a, o.b 是不可见的
// o.c 和 o.d 是可见的(相同的 module)
// Outer.Nested 不可见,Nested::e 也不可见
}

构造器

为了声明一个类的基本构造器的可见性,使用下面的语法:(需要显式地使用 constructor 关键字)

  class C private constructor(a: Int) { ... }

在这里,构造器是 private 的。默认情况下,所有的构造器都是 public 的,
internal 声明的 class 只在相同的 module 中可见。

局部声明

局部变量,函数和类不能有 可见性修饰符

模块

internal 可见性修饰符意味着相同 module 中的成员可见。具体来说,
一个 module 就是一组 Kotlin 文件编译在了一起。

—— 一个 Intellij IDEA 模块;
—— 一个 Maven 项目;
—— 一个 Gradle 文件集合;
—— 一组被 Ant 任务编译的文件;