可见性修饰符是非常基本的知识,为什么还要单拿出来说呢?因为我们在使用Kotlin 时都会和Java 进行比较记忆或者互操作,但是在可见性修饰符这里就和Java 有一些不同,记录一下,避免出坑。
Kotlin 中 类、对象、接口、构造函数、方法、属性和它们的 setter 都可以有 可见性修饰符。 (getter 总是与属性有着相同的可见性。)
在 Kotlin 中有这四个可见性修饰符:private、 protected、 internal 和 public。 如果没有显式指定修饰符的话,默认可见性是 public,而Java 中默认可见性是包级。
包
函数、属性和类、对象和接口可以在顶层声明,即直接在包内:
// 文件名:example.kt
package foo
fun baz() {}
class Bar {}
-
如果你不指定任何可见性修饰符,默认为 public,这意味着你的声明将随处可见;
-
如果你声明为 private,它只会在声明它的文件内可见;
-
如果你声明为 internal,它会在相同 模块 随处可见;
-
protected 不适用于顶层声明。
注意:要使用另一包中可见的顶层声明,仍需将其导入来。
类和接口
对于类内部声明的成员:
-
private 意味着只在这个类内部(包含其所有成员)可见;
-
protected—— 和 private一样 + 在子类中可见,这一点和Java 不同,Java 中protected 成员在同一包内是可见的,而Kotlin 不可以;
-
internal —— 能见到类声明的 本模块内 的任何客户端都可见其 internal 成员,这种模块级可见和Java 中的包级可见不同,可见性范围要大于包级;
-
public —— 能见到类声明的任何客户端都可见其 public 成员。
注意 与Java 中的不同:Kotlin 中外部类不能访问内部类的 private 成员。
如果你覆盖一个 protected 成员并且没有显式指定其可见性,该成员还会是 protected 可见性。
上面提到了,一个模块是编译在一起的一套 Kotlin 文件,它可以是:
-
一个 IntelliJ IDEA 模块;
-
一个 Maven 项目;
-
一个 Gradle 源集(例外是 test 源集可以访问 main 的 internal 声明);
-
一次 <kotlinc> Ant 任务执行所编译的一套文件。
网友评论