类,object,接口,构造函数,方法,属性以及他们的setters都拥有可见性修饰符(属性的getters拥有和属性相同的可见性)。Kotlin中有四种可见性修饰符:private
, protected
, internal
和 pulibc
。
包
方法、属性、类、object 和 接口能在顶层中声明,即直接声明在包中。
package foo
fun baz() {}
class Bar {}
- 如果不指定可见性修饰符,那么可见性将默认为
public
,意味着你的声明在任何地方可见; - 如果你声明为
private
,那么它只在包含此声明的文件中可见; - 如果你声明为
internal
,那么它在整个模块(module)中可见; protected
修饰符无法用于顶层声明。
类和接口
对于类中的成员来说:
private
意味着仅在该类中可见protected
在该类中可见 + 在该类的子类中也可见internal
在本模块(module)内可以声明该类的地方都可见public
可以声明该类的地方都可见
注意,对于Java用户:Kotlin的外部类不能访问内部类的private
成员
如果你重写一个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' 可见性为 protected
}
class Unrelated(o: Outer) {
// o.a, o.b 都不可见
// o.c 和 o.d 都可见 (同一个模块)
// Outer.Nested 不可见, Nested::e 也不可见
}
(1). 构造函数
要指明一个类主构造函数的可见性,可以使用以下语法:
class C private constructor(a: Int) { ... }
上面这个构造函数声明为private
。默认地(如果没有明确指定可见性),所有构造函数都为public
,相当于凡是在类可见的地方构造函数均可见。(例如:internal类的构造函数只在相同的模块中可见)
(2). 局部声明
局部的变量、方法和类没有可见性修饰符。
模块
internal可见性修饰符意味着成员在同一个模块中可见。一个模块(module)是一起编译的一套kotlin文件。