kotlin的修饰符

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 必写 必须 可选

相关推荐
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁2 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
孙启超2 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust