Kotlin 编程教程
欢迎学习 Kotlin 编程!本教程将带你从零基础开始,逐步掌握 Kotlin 的核心知识和技能。
什么是 Kotlin?
Kotlin 是一种现代、简洁且安全的编程语言,由 JetBrains 开发(也就是 IntelliJ IDEA 的开发商)。它可以运行在 JVM(Java 虚拟机)上,也可以编译为 JavaScript 或 Native 代码(直接编译为机器码)。
Kotlin 的主要特性
Kotlin 设计之初就致力于解决 Java 中的一些痛点,同时保持与 Java 的完美互操作性:
- 简洁:Kotlin 代码比 Java 更加简洁,同样的功能往往只需要更少的代码行数
- 安全:Kotlin 在语言层面解决了空指针异常(NullPointerException)问题
- 互操作:Kotlin 与 Java 可以无缝互操作,你可以继续使用已有的 Java 库
- 工具友好:Kotlin 得到主流 IDE(IntelliJ IDEA、Android Studio 等)的良好支持
- 多平台:支持 JVM、Android、JavaScript、Native(iOS、Linux、Windows 等)
Kotlin 的应用场景
Kotlin 的应用范围非常广泛:
- Android 开发:Google 官方推荐的 Android 开发语言
- 后端开发:Spring Boot 官方支持 Kotlin,可以构建高性能的后端服务
- 全栈开发:通过 Kotlin/JS 可以开发 Web 前端
- 跨平台移动开发:Kotlin Multiplatform Mobile (KMM)
- 数据科学:与 Jupyter Notebook 集成,支持数据分析和机器学习
为什么学习 Kotlin?
- Google 官方支持:自 2017 年起,Google 官方推荐 Kotlin 作为 Android 开发首选语言
- 市场需求大:Kotlin 开发人才需求持续增长,薪资待遇优厚
- 学习曲线平缓:如果你有 Java 基础,可以很快上手 Kotlin
- 代码质量提升:Kotlin 的语言特性帮助你写出更安全、更简洁的代码
- 社区活跃:JetBrains 持续投入大量资源开发和完善 Kotlin
Kotlin 与 Java 的对比
下面通过一个简单的例子来对比 Kotlin 与 Java:
// Java 代码
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void sayHello() {
System.out.println("Hello, I am " + name);
}
}
// Kotlin 代码
class Person(var name: String, var age: Int) {
fun sayHello() {
println("Hello, I am $name")
}
}
可以看到,Kotlin 用一行代码就完成了 Java 中需要几十行代码才能实现的功能(属性、自动生成的 getter/setter、数据类等)。
Kotlin 体系架构
编译过程说明:
- Kotlin 编译器接收
.kt源文件 - 根据目标平台进行编译:
- JVM:编译为 Java 字节码(
.class文件) - JavaScript:编译为 JavaScript 代码
- Native:编译为原生二进制可执行文件
- JVM:编译为 Java 字节码(
- 编译后的代码可以与相应平台的库进行互操作
教程目录
本教程分为以下几个阶段:
第一阶段:基础入门
第二阶段:核心概念
第三阶段:高级特性
- 泛型 - 泛型类、泛型函数、类型约束
- lambda 表达式 - Lambda 表达式、高阶函数、内联函数
- 协程 - 异步编程、协程基础、并发
- 扩展 - 扩展函数、扩展属性
第四阶段:实战应用
知识速查
- 速查表 - Kotlin 常用语法一页纸
学习建议
- 动手实践:每学一个知识点,都要动手编写代码实践
- 循序渐进:按照教程顺序学习,不要跳跃
- 对照 Java:如果你有 Java 基础,可以对比学习,理解 Kotlin 的改进之处
- 多加练习:通过练习巩固所学知识
- 查阅文档:遇到问题多查阅 Kotlin 官方文档
Kotlin 版本说明
本教程基于 Kotlin 2.1.x 编写,重点介绍 Kotlin 2.0 引入的 K2 编译器带来的重大改进。
Kotlin K2 编译器
Kotlin 2.0 是 Kotlin 发展历程中的一个重要里程碑,引入了全新的 K2 编译器。K2 编译器带来了以下重大改进:
性能提升:
- 编译速度显著提升,大型项目编译时间可减少 2 倍
- 更好的增量编译支持
- 统一了所有目标平台(JVM、JS、Native、Wasm)的编译架构
智能类型转换增强: K2 编译器在更多场景下支持智能类型转换:
fun main() {
// Kotlin 2.0+ 支持跨作用域的智能类型转换
val message: String? = "Hello"
val isLong = message != null && message.length > 3
if (isLong) {
// K2 编译器知道 message 不为 null
println(message.length) // 无需 ?. 操作符
}
}
其他改进:
when表达式中||操作符的类型推断优化- 内联函数中的智能类型转换
- 异常处理块中的类型信息保持
Kotlin 2.1 新特性预览
Kotlin 2.1 引入了一些实验性的语言特性:
Guard 条件(when 守卫):
// 需要启用 -Xwhen-guards 编译选项
fun processAnimal(animal: Animal) {
when (animal) {
is Animal.Cat if animal.isHungry -> animal.feed()
is Animal.Dog if animal.breed == "Labrador" -> animal.play()
else -> println("Unknown animal")
}
}
非局部 break 和 continue:
// 需要启用 -Xnon-local-break-continue 编译选项
fun processList(items: List<Int>) {
for (item in items) {
val value = item.transform() ?: run {
continue // 在 lambda 中使用 continue
}
process(value)
}
}
多美元符号字符串插值:
// 需要启用 -Xmulti-dollar-interpolation 编译选项
val json = $$"""
{
"$schema": "https://example.com/schema",
"title": "Example"
}
"""
// $$ 表示需要两个美元符号才能触发插值
子类选择加入要求(@SubclassOptInRequired):
Kotlin 2.1 引入了 @SubclassOptInRequired 注解,允许库作者要求用户显式选择加入后才能实现实验性接口或继承实验性类:
// 定义需要选择加入的 API
@RequiresOptIn(
message = "此 API 是实验性的,可能会添加新的抽象方法",
level = RequiresOptIn.Level.WARNING
)
@Retention(AnnotationRetention.BINARY)
@Target(AnnotationTarget.CLASS)
annotation class ExperimentalCoreApi
// 要求子类选择加入
@SubclassOptInRequired(ExperimentalCoreApi::class)
interface CoreLibraryApi {
fun coreFunction()
}
// 用户必须显式选择加入
@OptIn(ExperimentalCoreApi::class)
class MyImplementation : CoreLibraryApi {
override fun coreFunction() { ... }
}
这对于设计稳定的 API 但未来可能添加新抽象方法的场景非常有用,比如 kotlinx.coroutines 库中的 SharedFlow 接口就使用了这个机制。
改进的 when 表达式穷尽性检查:
Kotlin 2.1 改进了对 sealed class 的 when 表达式穷尽性检查,即使类型参数有 sealed 上界,也不再需要多余的 else 分支:
// Kotlin 2.1 之前:需要 else 分支
fun <T : Seal> process(value: T) = when (value) {
is Seal.A -> "A"
is Seal.B -> "B"
else -> "Unknown" // 之前必须添加
}
// Kotlin 2.1:不再需要 else 分支
fun <T : Seal> process(value: T) = when (value) {
is Seal.A -> "A"
is Seal.B -> "B"
// 编译器知道已覆盖所有情况
}
sealed class Seal {
object A : Seal()
object B : Seal()
}
上述 Kotlin 2.1 特性目前处于预览阶段,需要在编译选项中显式启用。这些特性在未来版本中可能会有变化。
版本兼容性
Kotlin 遵循向后兼容原则,使用旧版本编写的代码通常可以在新版本中正常编译。但建议:
- 新项目使用最新稳定版
- 升级前查看官方迁移指南
- 使用
apiVersion和languageVersion控制语言特性
// build.gradle.kts
kotlin {
compilerOptions {
languageVersion.set(KotlinVersion.KOTLIN_2_1)
apiVersion.set(KotlinVersion.KOTLIN_2_1)
}
}
参考资料
准备好开始学习了吗?点击下一章开始你的 Kotlin 编程之旅!