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

相关推荐
朱涛的自习室8 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
死磕音视频9 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
顽疲11 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog11 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
.Bryce.12 小时前
在智能体中使用A2A工具:让大模型自己决定“该找谁帮忙“
android·java·服务器·redis·后端·agent·a2a
方舟小孩13 小时前
开源办公软件海豹办公 1.9.15 实战 从模板异常到 Android WebView 资源回归
android
用户21816970493013 小时前
Kotlin 语法四 协程
android
程序喵大人13 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
出师牛13 小时前
Android - 再探Handler
android
高晶13 小时前
Android 物联网组网实战:NFC 从零到落地
android·java