在 Kotlin 中,对于类、对象、接口、构造函数、方法、属性和属性的 setter 都可以使用可见性修饰符来标记(属性的 getter 与属性是相同的可见性)。
在 Kotlin 中有四种可见修饰符:private、protected、internal 和 public。相信大家有过一定编程基础都知道 private、protected 和 public 一般来说意味着什么,那么 Kotlin 中的 internal 又代表什么呢?一般是指相同模块可见,这里的模块指的是编译在一起的一套 Kotlin 文件,比如:一个 Intellij IDEA 模块、一个 Maven 项目、一个 Gradle 源集(例外:test 源集可以访问 main 的 internal 声明)、一次 <Kotlinc> Ant 任务执行所编译的一套文件。
因为 Kotlin 中函数、属性和类、对象和接口都可以在顶层声明(即直接在包内的文件里声明),所有当它们在顶层声明和在类、接口中声明,四个可见性修饰符的作用稍有差异,所以我们分开说明:
- 顶层声明:
private | 仅声明的文件内可见 |
protected | 不适用于顶层说明 |
internal | 相同模块内随处可见 |
public | 随处可见,而且不指定可见性修饰符则默认为 public |
- 类和接口内声明
private | 仅在这个类里面可见 |
protected | 仅在这个类和其子类中可见 |
internal | 能见到类声明的本模块中随处可见 |
public | 能见到类声明的地方随处可见 |
- 需要注意的是:
在 Kotlin 中外部类是不能访问内部类的 private 成员的。
而且如果子类覆盖父类的一个protected 成员,如果没有指定可见性修饰符,默认为 protected。
构造函数默认都是 public 的。
即使要使用别的包的成员变量是可见的顶层声明,也是要导包的。