Kotlin Reference: Visibility Modifiers
类、object
、接口、构造器、函数、属性及其 setter 可以具有可见性修饰符(属性的 getter 始终与属性本身具有同样的可见性)。Kotlin 中有四种可见性修饰符:private
、protected
、internal
和 public
,如果没有使用显式的修饰符,则默认的可见性为 public
。
Packages
函数、属性、类、object
和接口可以声明在顶层,也就是直接在包内:
[code lang=”kotlin”]// file name: example.kt
package foo
fun baz() {}
class Bar {}[/code]
- 如果没有指定可见性修饰符,则默认为
public
,这意味着该声明在任何地方都可见。 - 如果把声明标记为
private
,则只在该声明所在的文件内可见。 - 如果把声明标记为
internal
,则在同一模块(Module)下可见。 protected
不能用于顶层声明。
例子:
[code lang=”kotlin”]// file name: example.kt
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[/code]
Classes and Interfaces
对于在类中声明的成员:
private
表示仅在该类内部可见(包括类的成员)。protected
—— 和private
相同,外加对子类可见。internal
—— 在同一模块下的客户端代码如果能够看到某个类的声明,则也能看到该类中的internal
成员。public
—— 客户端代码如果能看到某个类的声明的,则也能看到该类中的public
成员。
Java 使用者需要注意:在 Kotlin 中,外部类看不到内部类的私有(private
)成员。
如果覆盖了 protected
成员,而没有指定可见性修饰符,则该成员仍具有 protected
可见性。
例子:
[code lang=”kotlin”]open class Outer {
private val a = 1
protected open val b = 2
internal val c = 3
val d = 4 // public by default
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a is not visible
// b, c and d are visible
// Nested and e are visible
override val b = 5 // ‘b’ is protected
}
class Unrelated(o: Outer) {
// o.a, o.b are not visible
// o.c and o.d are visible (same module)
// Outer.Nested is not visible, and Nested::e is not visible either
}[/code]
Constructors
使用如下语法来指定主构造器的可见性(注意此时必须显式地使用 constructor
关键字):
[code lang=”kotlin”]class C private constructor(a: Int) { … }[/code]
这里的构造器是私有的。所有的构造器默认都是 public
的,相当于在类可见的地方构造器都可见(亦即 internal
的构造器仅在模块内可见)。
Local declarations
局部变量、方法和类不能具有可见性修饰符。
Modules
使用 internal
修饰的成员仅在模块内可见,具体来说,模块是一组在一起编译的 Kotlin 文件,如:
- 一个 IntelliJ IDEA 模块;
- 一个 Maven 或者 Gradle 项目;
- 一个 Gradle 源码集合(Source Set);
- 在一次 Ant 任务调用中一起编译的一组文件。