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

相关推荐
00后程序员张1 天前
从审核被拒到稳定过审,iOS 上架技术优化
android·ios·小程序·https·uni-app·iphone·webview
房开民1 天前
c++总结
java·开发语言·c++
毕设源码-赖学姐1 天前
【开题答辩全过程】以 基于Java的医院器材管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
float_com1 天前
【java常用API】----- Arrays
java·开发语言
不会写DN1 天前
PHP 中的文件读写与上传
android·开发语言·php
LuckyTHP1 天前
迁移shibboleth java获取shibboleth用户信息
java·开发语言
客卿1231 天前
数论===质数统计(暴力法,)
java·开发语言
Σίσυφος19001 天前
C++ 多肽经典面试题
开发语言·c++·面试
csdn_aspnet1 天前
C# 求n边凸多边形的对角线数量(Find number of diagonals in n sided convex polygon)
开发语言·算法·c#
qq_254674411 天前
Docker 中的 镜像(
开发语言