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

相关推荐
chase_my_dream6 分钟前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
Cloud_Shy61829 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
天佑木枫1 小时前
15天Python入门系列 · 序
开发语言·python
ha_lydms1 小时前
AnalyticDB分区、分布键性能优化
android·大数据·分布式·性能优化·分布式计算·分区·analyticdb
星辰1 小时前
Ijkplayer重新编译支持h264裸流
android
测试开发-学习笔记2 小时前
Android studio安装
android·ide·android studio
宋拾壹2 小时前
同时添加多个类目
android·开发语言·javascript
凡人叶枫2 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
小小龙学IT3 小时前
Go 语言后端开发:从并发模型到生产落地的工程实践
开发语言·后端·golang
●VON3 小时前
AtomGit Flutter鸿蒙客户端:数据模型
android·服务器·安全·flutter·harmonyos·鸿蒙