访问限制
Kotlin官网:Classes and Objects-Visibility Modifiers
类、对象、接口、构造函数、函数、属性和属性setter都可以加访问限制。
属性getter默认和属性的访问限制一致。
4种:private, protected, internal, public
不声明时默认为public
包
顶级元素,直接声明在包中的
* 不声明访问限制默认为public,均可见
* 声明为private的本文件内可见
* internal本module内可见
* 顶级元素不支持protect级别的访问限制
注意:在其他包中使用,即使访问限制可见,也需要声明导入
// file name: example.kt
package foo
private fun foo() {} // 本文件内可见
public var bar: Int = 5 // 公开的属性
private set // 私有setter
internal val baz = 6 // 同一module可见
类和接口
对于类中的成员:
* private:本类内部可见
* protected:本类和子类
* internal:同module
* 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 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
}
构造函数
如果要给构造函数添加访问限制,需要显式地声明construtor关键字
class C private constructor(a: Int) { ... }
局部成员
局部变量、函数、类不能加访问限制
module
internal限制同一module可见
module的定义:
* an IntelliJ IDEA module;
* a Maven project;
* a Gradle source set;
* a set of files compiled with one invocation of the Ant task.
总结
关键字 | 包 | 类 |
---|---|---|
private | 本文件 | 本类 |
protected | 不支持 | 本类和子类 |
internal | 本模块 | 本模块 |
public | 公开 | 公开 |