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

相关推荐
大白同学42139 分钟前
初识Qt——创建第一个Qt项目
开发语言·qt
祈禾41 分钟前
计算机组成原理之编译、汇编、链接、解释
开发语言·汇编·笔记·学习
工会代表1 小时前
安卓手机搭建SOCKS5代理教程
android
吴声子夜歌1 小时前
正则指引——Ruby
开发语言·正则表达式·ruby
nnerddboy1 小时前
Rust教程06:ESP32-rust环境搭建
开发语言·后端·rust
雨白1 小时前
Android AOP 切面编程实战:优雅地处理全局断网拦截
android·架构
nnerddboy1 小时前
Rust教程03:函数,控制流与所有权
开发语言·后端·rust
linux修理工1 小时前
内存占用 99% 且 Java 程序较多的优化建议
java·开发语言
weixin_460443561 小时前
企业考试系统如何对接OA、钉钉和企业微信?SSO单点登录、组织同步与权限一致性设计
java·开发语言·数据库
nnerddboy2 小时前
Rust教程05:结构体,枚举与模式匹配
开发语言·网络·rust