Kotlin 的类与成员修饰符可以分为两大类:
- 继承相关修饰符(控制是否可被继承 / 重写)
- 可见性修饰符(控制访问范围)
open / final 属于第一类,private / protected / internal 属于第二类。
一、继承控制修饰符
1️⃣ final(默认)
在 Kotlin 中:
所有类默认都是
final
也就是说:不能被继承,成员函数也不能被重写。
kotlin
class Person
等价于:
kotlin
final class Person
同理:
kotlin
class Person {
fun speak() {}
}
speak() 也是默认 final,不能 override。
设计哲学
Kotlin 倾向于"默认安全封闭"(Closed by default)。
和 Java 相反(Java 默认可继承)。
2️⃣ open
如果你希望类可以被继承,或者方法可以被重写,必须显式加 open。
kotlin
open class Person {
open fun speak() {
println("Hello")
}
}
子类:
kotlin
class Student : Person() {
override fun speak() {
println("Hi")
}
}
注意:
- 类要被继承 → 类必须
open - 方法要被重写 → 方法必须
open - 子类重写必须加
override
这是 Kotlin 的强制显式继承模型。
二、可见性修饰符
Kotlin 有四种可见性:
| 修饰符 | 当前类 | 子类 | 同文件 | 同模块 | 其他模块 |
|---|---|---|---|---|---|
| public (默认) | ✔ | ✔ | ✔ | ✔ | ✔ |
| internal | ✔ | ✔ | ✔ | ✔ | ✘ |
| protected | ✔ | ✔ | ✘ | ✘ | ✘ |
| private | ✔ | ✘ | ✘ | ✘ | ✘ |
1️⃣ private
类中成员
kotlin
class Person {
private val age = 18
}
只能在当前类内部访问。
顶层(top-level)
Kotlin 可以写顶层函数:
kotlin
private fun helper() {}
这表示:
只能在当前文件内使用
注意:顶层没有 protected。
2️⃣ protected
只在:
- 当前类
- 子类
中可见。
kotlin
open class Person {
protected val age = 18
}
子类可以访问:
kotlin
class Student : Person() {
fun printAge() {
println(age)
}
}
但外部类不能访问。
3️⃣ internal
这是 Kotlin 特有的(Java 没有)。
表示:
当前 module 内可见
什么是 module?
- 一个 Gradle module
- 一个 Maven module
- 一个 IntelliJ module
例如 Android 中:
app module
network module
data module
internal 只能在当前 module 使用。
4️⃣ public
默认修饰符。
kotlin
fun test() {}
等价于:
kotlin
public fun test() {}
三、组合规则
1️⃣ open + private ❌
kotlin
open private class Person
不合法。
因为:
open意味着可以被继承private意味着只能当前类访问
逻辑冲突。
2️⃣ open + protected ❌(类不能 protected)
类不能是 protected。
protected 只能用于类成员。
3️⃣ open + internal ✔
kotlin
internal open class Person
表示:
- 当前 module 可见
- 且可以被继承
四、实战理解(设计思想)
Kotlin 的设计原则:
1️⃣ 封闭优先(closed by default)
避免意外继承,增强稳定性。
2️⃣ 显式 override
必须写:
kotlin
override fun speak()
避免意外重写。
3️⃣ internal 控制模块边界
在 Android / 多模块架构中特别重要。
五、和 Java 对比
| 概念 | Kotlin | Java |
|---|---|---|
| 默认继承 | final | 可继承 |
| 模块级访问 | internal | 无 |
| 顶层函数 | 支持 | 不支持 |
| override 必写 | 必须 | 可选 |