Kotlin 访问修饰符
在 Kotlin 中,我们使用可见性修饰符来控制类、对象、接口、构造函数、属性以及它们的 setter 方法的访问权限。Kotlin 提供了四种可见性修饰符:private
,protected
,internal
和 public
。
四种可见性修饰符
修饰符 | 含义 |
---|---|
private | 声明的元素仅在声明它的文件内可见,即使是子类也无法访问。 |
protected | 声明的元素在其声明的类和所有子类中可见,但在其他地方不可见,包括同一个包下的其他类。 |
internal | 声明的元素在同一个模块内可见。模块是指一组一起编译的 Kotlin 文件,例如 IntelliJ IDEA 中的一个模块。 |
public | 默认修饰符,声明的元素在任何地方都可见。 |
默认修饰符: public
如果没有为声明的元素指定任何可见性修饰符,那么默认使用 public
修饰符,这意味着该元素在任何地方都可见。
私有访问控制: private
使用 private
修饰符声明的元素只能在声明它的文件中访问。即使是子类也无法访问父类的 private
成员。
class Person {
private var age = 0 // private 属性,只能在 Person 类内部访问
fun growOld() {
age++
}
}
fun main() {
val person = Person()
// person.age++ // 错误:无法访问 private 属性 'age'
person.growOld()
}
受保护的访问控制: protected
使用 protected
修饰符声明的元素在其声明的类和所有子类中可见,但在其他地方不可见,包括同一个包下的其他类。
open class Animal {
protected var name = "" // protected 属性,可以在 Animal 类及其子类中访问
}
class Dog: Animal() {
fun bark() {
println("Woof! My name is $name") // 可以访问父类的 protected 属性
}
}
内部访问控制: internal
使用 internal
修饰符声明的元素在同一个模块内可见。模块是指一组一起编译的 Kotlin 文件,例如 IntelliJ IDEA 中的一个模块。
// 文件名:Utils.kt
internal fun printMessage(message: String) { // internal 函数,只能在同一个模块内调用
println(message)
}
// 文件名:Main.kt (假设与 Utils.kt 在同一个模块内)
fun main() {
printMessage("Hello from internal function")
}
总结
可见性修饰符是 Kotlin 中非常重要的概念,合理的运用它们可以帮助我们编写更加安全、易于维护的代码。在实际开发过程中,建议尽量将类的成员声明为 private
或 protected
,只将必要的接口暴露给外部。