可见性修饰符
[TOC]
可见性修饰符
类、对象、接口、构造函数、方法、属性和它们的 setter 都可以有 _可见性修饰符_。
(getter 总是与属性有着相同的可见性。)
在 Kotlin 中有这四个可见性修饰符:private
、 protected
、 internal
和 public
。
如果没有显式指定修饰符的话,默认可见性是 public
。
以下解释了这些修饰符如何应用到不同类型的声明作用域。
包
函数、属性和类、对象和接口可以在顶层声明,即直接在包内:
1 | // 文件名:example.kt |
- 如果你不指定任何可见性修饰符,默认为
public
,这意味着你的声明将随处可见; - 如果你声明为
private
,它只会在声明它的文件内可见; - 如果你声明为
internal
,它会在相同模块内随处可见; protected
不适用于顶层声明。
注意:要使用另一包中可见的顶层声明,仍需将其导入进来。
例如:
1 | // 文件名:example.kt |
类和接口
对于类内部声明的成员:
private
意味着只在这个类内部(包含其所有成员)可见;protected
—— 和private
一样 + 在子类中可见。internal
—— 能见到类声明的 本模块内 的任何客户端都可见其internal
成员;public
—— 能见到类声明的任何客户端都可见其public
成员。
请注意在 Kotlin 中,外部类不能访问内部类的 private 成员。
如果你覆盖一个 protected
成员并且没有显式指定其可见性,该成员还会是 protected
可见性。
例子:
1 | open class Outer { |
构造函数
要指定一个类的的主构造函数的可见性,使用以下语法(注意你需要添加一个显式 constructor{:.keyword} 关键字):
1 | class C private constructor(a: Int) { …… } |
这里的构造函数是私有的。默认情况下,所有构造函数都是 public
,这实际上等于类可见的地方它就可见(即 一个 internal
类的构造函数只能在相同模块内可见).
局部声明
局部变量、函数和类不能有可见性修饰符。
模块
可见性修饰符internal意味着该成员只在相同模块内可见。更具体地说,
一个模块是编译在一起的一套 Kotlin 文件:
- 一个 IntelliJ IDEA 模块;
- 一个 Maven 项目;
- 一个 Gradle 源集(例外是 test源集可以访问main的 internal 声明);
- 一次
Ant 任务执行所编译的一套文件。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 麦溪·在路上!
评论
ValineDisqus