可见性修饰符用于其修饰对象的适用范围。在Kotlin中,存在private、protectedinternal以及 public等四种修饰符,它们可用于修饰类、对象、接口、构造器、函数、属性、以及属性的设值方法等。web
注:属性的取值方法永远与属性自己的可见度一致, 所以不须要修饰符修饰。
svg
在不一样的做用范围内,修饰符的意义有必定的差异,下面从包、类和接口、模块(Model)等三个范围内看:函数
在Kotlin中,包级别的定义称为top-level,即直接定义在包内,可定义函数、属性、类、对象及接口。code
示例:xml
// file name: example.kt package foo private fun foo() {} // 只在 example.kt 文件内可访问 public var bar: Int = 5 // 这个属性在任何地方均可以访问 private set // 但它的设值方法只在 example.kt 文件内能够访问 internal val baz = 6 // 在同一个模块(module)内能够访问
示例:对象
open class Outer { private val a = 1 protected 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 能够访问 } class Unrelated(o: Outer) { // o.a, o.b 不可访问 // o.c 和 o.d 能够访问(属于同一模块) // Outer.Nested 不可访问, Nested::e 也不可访问 }
通常在类的主构造器都不使用修饰符修饰,即默认使用public修饰符。但在实际开发时,主构造器可能被其余修饰符修饰。好比在建立单例模式时,为了防止在外部调用主构造器,主构造器就是使用private修饰符修饰。当使用其余修饰符修饰构造器时,须要明确添加一个constructor关键字。接口
class C private constructor(a: Int) { ... }
个模块(module)是指一块儿编译的一组 Kotlin 源代码文件:开发
局部变量, 局部函数, 以及局部类, 都不能指定可见度修饰符it