类,对象,接口,构造器,函数,属性和他们的setters可以使用可见修饰符。(getters和属性有一样的可见性)。和java一样,kotlin一共有4个可见修饰符:private,protected,internal和public。和java不一样,kotlin默认是public。
包
函数,属性和类,对象和接口能在顶级被指定。例如,直接在包内。
// file name: example.kt
package foo
fun baz() {}
class Bar {}
(1)如果你没有指定任何可见修饰符,默认public,这意味着你的声明任何地方都可以访问;
(2)如果使用private,只有在声明文件中可用;
(3)如果使用internal,在同一个module中是可以访问的;
(4)protected不能在顶级声明中使用。
例子:
// 文件名: example.kt
package foo
private fun foo() {} // 在文件 example.kt 内访问
public var bar: Int = 5 // 属性到处都可以访问
private set // setter 在文件 example.kt 内访问
internal val baz = 6 // 在同一个 module 内访问
类和接口
类内的成员声明:
(1)如果使用private,只有类内部可以访问;
(2)如果使用protected,类的子类也能访问;
(3)如果使用internal,module中客户都能访问;
(4)如果使用public,任意客户都能访问。
java用户注意:外部类不能访问它内部类的private成员。
如果你覆盖了一个protected成员并且没有指定它的可见修饰符,这个被覆盖的变量也是protected的可见性。
例子:
(1)如果使用private,只有类内部可以访问;
(2)如果使用protected,类的子类也能访问;
(3)如果使用internal,module中客户都能访问;
(4)如果使用public,任意客户都能访问。
java用户注意:外部类不能访问它内部类的private成员。
如果你覆盖了一个protected成员并且没有指定它的可见修饰符,这个被覆盖的变量也是protected的可见性。
例子:
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 不可见
// b, c 和 d 可见
// Nested 和 e 可见
override val b = 5 // 'b' is protected
}
class Unrelated(o: Outer) {
// o.a, o.b 不可见
// o.c and o.d 可见 (同一 module)
// Outer.Nested 不可见, 和 Nested::e 也不可见
}
构造器:
指定主构造器的可见性,使用如下的语法(注意你需要增加constructor关键字):
class C private constructor(a: Int) { ... }
这里指定了一个private的构造器,默认,所有的构造器都是public的。