Kotlin 77 个关键字怎么记:按硬关键字、软关键字和修饰符一次理清

Aria
Aria
发布时间:2026-08-25 | 19人浏览过
原创

前言

学 Kotlin 时,很多人不是不会写语法,而是总在“这个词到底是不是保留字、能不能拿来当名字、为什么这里必须这样写”这些细节上反复卡住。本文按官方分类把 77 个关键字拆成三组,并配上简短示例和使用提示,帮助你快速分清哪些是始终保留、哪些看上下文、哪些主要负责修饰声明,后续查表和写代码都会更稳。

学 Kotlin 时,很多人不是不会写语法,而是总在“这个词到底是不是保留字、能不能拿来当名字、为什么这里必须这样写”这些细节上反复卡住。本文按官方分类把 77 个关键字拆成三组,并配上简短示例和使用提示,帮助你快速分清哪些是始终保留、哪些看上下文、哪些主要负责修饰声明,后续查表和写代码都会更稳。

硬关键字:始终保留,不能直接拿来命名

硬关键字是 Kotlin 中最严格的一组。它们无条件保留,不能直接作为变量名、函数名或类名使用。实际开发里,最容易混淆的是流程控制、类型判断、对象声明和空安全相关词汇,这些关键字往往决定了一段代码的基本语义。

Kotlin 硬关键字的功能分组信息图
Kotlin 硬关键字的四类高频用途按使用场景拆分硬关键字,比单纯按表记忆更容易建立语法判断。

类型转换、类型判断与空值相关关键字

这一组经常一起出现,尤其是在处理 Any、可空类型和分支判断时。

Kotlin 软关键字在不同语境下生效的关系图
软关键字要放进语境里理解软关键字的关键不在数量,而在于只在特定语法位置才被识别。
  • as:强制类型转换,失败会抛异常;导入时也能起别名。
  • as?:安全类型转换,失败返回 null。
  • is / !is:类型检查与反向类型检查。
  • null:空引用常量。
  • in / !in:判断元素是否位于区间或集合中;in 还可用于泛型逆变。
val num = anyObj as Int
val str = anyObj as? String ?: "默认值"
val value: Any = "Kotlin"
if (value is String) println(value.length)
if (value !is Int) println("不是整数")
val s: String? = null
if (5 in 1..10) {}
if (3 !in 5..10) println("不在区间")
class Box<in T>

如果你不确定转换一定成功,优先考虑 as?,再配合 Elvis 操作思路处理默认值,这比直接强转更安全。

流程控制与分支表达式

Kotlin 的流程关键字覆盖了条件判断、循环和跳转控制。其中 if 和 when 都不只是语句,也可以直接作为表达式返回值。

Kotlin 修饰符关键字的能力边界对照图
修饰符关键字的四个判断维度修饰符关键字更适合按“它控制什么能力”来记,而不是逐个孤立记忆。
  • if / else:条件分支,可直接产出结果。
  • when:更灵活的分支表达式。
  • for、while、do:迭代与循环。
  • break、continue:中断循环或跳过当前轮次。
  • return:返回函数结果。
val result = if (score >= 60) "及格" else "不及格"
val max = if (a > b) a else b

val grade = when (score) {
    100 -> "满分"
    in 90..99 -> "优秀"
    else -> "及格"
}

for (i in 1..5) println(i)
for ((idx, item) in list.withIndex()) {}

var i = 0
while (i < 3) {
    println(i)
    i++
}

var j = 0
do {
    println(j)
    j++
} while (j < 2)

for (i in 1..5) {
    if (i == 3) continue
    println(i)
}

loop@ for (i in 1..3) {
    break@loop
}

和 Java 不同,Kotlin 更鼓励把分支直接写成表达式,因此 if、when 的返回值能力值得优先掌握。

声明、对象与基本结构

这组关键字定义了文件、类、函数、接口、变量和对象,是写 Kotlin 代码时最常见的基础词汇。

  • package、class、interface、fun
  • object:可用于单例、伴生对象、匿名对象。
  • val / var:只读变量与可变变量。
  • this / super:当前对象与父类引用。
  • typealias:类型别名。
package com.example.kotlin.keywords

class Person(val name: String) {
    fun sayHello() = println("Hi")
    fun intro() = println("我是$this.name")
}

interface Flyable {
    fun fly()
}

class Bird : Flyable {
    override fun fly() {}
}

object Singleton {
    val app = "Kotlin"
}

class A {
    companion object {}
}

val age = 25
var count = 0
count += 1

typealias StringList = List<String>

val 并不等于绝对不可变,它表示“引用不可重新赋值”;而 object 则是 Kotlin 中非常高频的语言级单例方案。

布尔值与异常处理

剩下这组关键字数量不多,但基本都和运行时行为直接相关。

  • true / false:布尔字面量。
  • try、throw:异常处理和主动抛错。
val isSuccess = true
val isFail = false
if (isSuccess) println("完成")
if (!isFail) println("成功")

try {
    10 / 0
} catch (e: ArithmeticException) {
    println(e.message)
}

fun checkAge(age: Int) {
    if (age < 0) throw IllegalArgumentException("年龄非法")
}

这里需要顺带记住一点:catch 和 finally 在 Kotlin 中被归入软关键字,它们虽然常和 try 一起写,但分类上并不相同。

软关键字:只有在特定上下文里才生效

软关键字不会像硬关键字那样无条件占用名字。只有放进特定语法位置时,它们才会被编译器识别成关键字;离开对应上下文,它们通常可以当作普通标识符使用。这也是 Kotlin 在可读性和兼容性之间做出的平衡。

委托、构造与访问器相关

这一类常见于类定义和属性定义,是日常编码中最容易遇到的软关键字。

  • by:接口委托或属性委托。
  • constructor:主构造函数或次构造函数声明。
  • init:初始化代码块。
  • get / set:自定义属性访问器。
  • field:属性幕后字段,常在 setter/getter 或注解目标中出现。
class User(p: Printer) : Printer by p

var name: String by Delegate()

class Car constructor(val brand: String)

class Person(val name: String) {
    init {
        println("初始化:$name")
    }
}

var isAdult: Boolean
    get() = age >= 18

var score: Int = 0
    set(value) {
        field = if (value in 0..100) value else 0
    }

如果你刚接触 Kotlin,by 和 field 往往是第一批“看起来不熟、但项目里很常见”的词。前者常用来减少模板代码,后者则是写自定义访问器时的关键。

异常处理与导入语法

这一组虽然不多,但出现频率很高。

  • catch:捕获异常。
  • finally:无论异常与否都会执行的收尾块。
  • import:导入类型或函数。
try {
    10 / 0
} catch (e: ArithmeticException) {
    println("除零异常")
} finally {
    file.close()
}

import java.util.ArrayList

它们之所以被列为软关键字,是因为编译器只会在对应语法结构里把它们识别成关键字,而不是像 class、fun 那样始终保留。

注解目标、泛型约束与平台相关场景

这一组更偏进阶,平时不一定每天都会写到,但一旦碰上注解、多平台或 Kotlin/JS,就很难绕开。

  • delegate、file、param、property、receiver、setparam:注解目标。
  • where:给泛型追加约束。
  • dynamic:Kotlin/JS 中的动态类型。
@delegate:MyAnnotation
val name: String by Delegate()

@field:Nullable
var age: Int = 0

@file:JvmName("MyFile")
package com.example

fun test(@param:NotNull name: String) {}

@property:Deprecated
var age2: Int = 0

fun @receiver:NotNull String.printLen() = println(length)

var age3: Int = 0
    set(@setparam:Min(0) value) {
        field = value
    }

fun <T> printInfo(t: T) where T : CharSequence, T : Comparable<T> {
    println(t.length)
}

val jsObj: dynamic = js("{}")
jsObj.name = "Kotlin"

其中 where 很适合用来把复杂的泛型限制写得更清楚;而一长串注解目标关键字则主要服务于框架和平台互操作场景。

修饰符关键字:决定可见性、继承关系与能力边界

修饰符关键字主要用来修饰类、函数、属性或泛型参数。它们控制的不是“这段代码是什么”,而是“这段代码能被谁访问、能否继承、会以什么方式工作”。理解这组关键字,往往比单纯记住写法更重要。

可见性与继承控制

这部分最直接,关系到模块边界、封装和扩展能力。

  • public、private、protected、internal:可见性控制。
  • open、final、abstract、override:继承与重写控制。
public class PublicClass {
    public fun pubFun() {}
}

private val PWD = "123456"

abstract class Shape {
    abstract fun area(): Double
}

open class Animal {
    open fun eat() {}
}

class Dog : Animal() {
    override fun eat() {
        super.eat()
    }
}

final class FinalClass {
    final fun noOverride() {}
}

internal class Module {
    internal fun f() {}
}

protected val secret = "秘"

Kotlin 的类默认是 final,这一点和很多面向对象语言不同。只有显式写上 open,类和成员才允许被继承或覆盖。

数据建模与对象组织

当你在定义常量、数据结构或有限状态时,这组修饰符很常见。

  • data:数据类。
  • enum:枚举类。
  • sealed:密封类,适合有限分支建模。
  • annotation:注解类。
  • companion:伴生对象。
  • const:编译期常量。
  • inner:内部类。
  • lateinit:延迟初始化的 var 属性。
data class User(val id: Int, val name: String)

enum class Season { SPRING, SUMMER }

sealed class Result
class Success : Result()

@Target(AnnotationTarget.CLASS)
annotation class MyAnnotation

class A {
    companion object {
        val info = "伴生"
        fun show() = println(info)
    }
}

const val MAX = 100

class Outer {
    inner class Inner {}
}

lateinit var email: String

data、enum、sealed 这三者都和“建模”有关,但适用场景不同:前者偏数据承载,中间偏固定枚举值,后者偏受控分支结构。

泛型、函数能力与调用形式

这一组更偏语言高级特性,通常和性能、DSL、泛型表达力有关。

  • inline、noinline、crossinline:内联函数及 Lambda 行为控制。
  • reified:实化内联泛型。
  • infix:中缀函数。
  • operator:操作符重载。
  • vararg:可变参数。
  • tailrec:尾递归优化。
  • out:泛型协变。
  • suspend:挂起函数。
inline fun measureTime(action: () -> Unit) {
    action()
}

inline fun test(
    inlineAction: () -> Unit,
    noinline noInlineAction: () -> Unit
) {}

inline fun test2(crossinline action: () -> Unit) {
    action()
}

inline fun <reified T> isType(v: Any) = v is T

infix fun Int.add(n: Int) = this + n

operator fun plus(p: Point) = Point(x + p.x)

fun sum(vararg nums: Int): Int = nums.sum()

tailrec fun factorial(n: Int, r: Int = 1): Int {
    if (n <= 1) return r
    return factorial(n - 1, n * r)
}

class Box<out T>(val data: T)

suspend fun fetch(): String {
    return "data"
}

如果只是日常业务开发,最先要熟悉的通常是 vararg、inline、suspend;而 reified、crossinline、out 等更适合在理解泛型和高阶函数后再深入。

多平台与外部实现

这部分关键字出现频率相对较低,但在 Kotlin Multiplatform 或与外部平台互操作时非常关键。

  • expect / actual:多平台声明与实际实现。
  • external:声明实现来自 Kotlin 之外,例如 JavaScript 或本地平台。
expect fun getPlatform(): String
actual fun getPlatform() = "Android"

expect class PlatformFile(path: String)

external fun callJs(): String

这三个词虽然平时不一定常见,但只要项目跨平台,它们就会成为理解代码结构的入口。

怎么记这 77 个 Kotlin 关键字更高效

如果只按字母顺序硬背,记忆成本很高,也不容易形成语法判断。更实用的方式是先抓住分类边界:

  • 硬关键字 28 个:始终保留,不能作标识符。
  • 软关键字 17 个:只在特定语境下生效。
  • 修饰符关键字 32 个:主要用于修饰声明,决定可见性、继承、泛型和执行方式。

真正写代码时,可以按问题反查:遇到命名报错,先看是不是硬关键字;遇到注解目标、委托或泛型限制,优先想到软关键字;遇到访问范围、继承关系、协程、内联和数据建模,再回到修饰符关键字。这种记法比单纯背表更接近真实开发场景。

把这 77 个关键字分门别类搞清楚后,Kotlin 的核心语法轮廓也就基本搭起来了。后面无论是读源码、写业务逻辑,还是处理泛型、多平台和协程相关代码,判断都会更快。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表