Android的Kotlin:语法基础和功能

作者: IT Sectr 发布日期: 2026-02-10 阅读时间: 8 分钟

Kotlin — JetBrains开发的静态类型编程语言,运行在JVM上,自2017年起获得Google官方支持用于Android开发。Kotlin完全兼容Java,语法简洁,内置空安全机制。 Kotlin Documentation — 语言和标准库的完整指南。

要点

  • Kotlin — JetBrains开发的静态类型JVM语言,语法简洁,具备空安全特性
  • Null safety — 编译器区分可空(String?)和非空(String)类型,消除空指针异常
  • Data classes — 自动生成equals、hashCode、toString、copy和componentN
  • Extension functions — 通过静态调用向现有类添加方法,无需继承
  • Coroutines — 通过挂起函数以顺序风格进行异步编程,不阻塞线程

什么是Kotlin?

Kotlin — 由JetBrains公司(IntelliJ IDEA的开发商)创建并于2016年以Apache 2.0许可证发布的静态类型编程语言。Kotlin可编译为JVM字节码、JavaScript和原生代码(通过Kotlin/Native)。主要应用领域——Android开发、服务器应用程序和跨平台项目。

Google在Google I/O 2017上宣布Kotlin为Android开发的官方语言。根据Google的数据(Android Developer Blog, 2026),Google Play中超过85%的新项目使用Kotlin。该语言还广泛应用于服务器开发(Spring Boot、Ktor)和多平台项目(Kotlin Multiplatform Mobile)。

Kotlin完全兼容Java——在同一项目中可以从Kotlin调用Java代码,反之亦然。构建工具(Gradle、Maven)支持两种语言,允许从Java逐步迁移到Kotlin,无需中断开发。

为什么Kotlin在Android开发中比Java更受欢迎

主要原因:简洁性——解决相同任务,Kotlin平均比Java少40%的代码行。空安全——编译器禁止未经检查就使用可空类型。函数式能力——高阶函数、lambda表达式、扩展函数和协程使代码更具表现力且更安全。

语法基础

基本的Kotlin语法将简洁性与明确性相结合。变量通过val(不可变)和var(可变)声明。编译器使用类型推断,但也支持显式指定类型。函数使用fun关键字声明。

kotlin
package com.example.intro

// 常量和变量
val appName: String = "KotlinApp"  // 不可变
var version = 1.0  // 可变,类型推断

// 带有表达式体的函数
fun sum(a: Int, b: Int) = a + b

// String templates
fun greet(name: String) = "你好,$name!版本 ${appName}_$version"

// Default and named arguments
fun createUser(
    name: String,
    age: Int = 18,
    email: String? = null
)

When表达式取代了Java中的switch,更加灵活:支持类型检查、范围、条件和无break的分支。编译器检查enum和密封类的穷尽覆盖。Smart casts在is检查后自动转换类型,消除了显式转换。

kotlin
fun analyzeValue(value: Any) = when (value) {
    is String -> "长度为${value.length}的字符串"  // smart cast
    is Int -> "整数:$value"
    in 1..10 -> "1-10范围内的数字"
    else -> "未知类型"
}

空安全和Elvis运算符

空安全——Kotlin的关键特性,在编译层面消除了空指针异常。在Kotlin中,类型默认不能为null。要允许null,请在类型后添加?:String?。编译器要求显式检查每个可空值。

kotlin
// 可空和非空类型
val nonNull: String = "始终非空"
val nullable: String? = null  // 允许

// 安全调用——仅在非空时执行
val length: Int? = nullable?.length

// Elvis运算符——默认值
val text: String = nullable ?: "Default text"

// Let——使用非空值执行代码块
nullable?.let { value ->
    println("值:$value")
}

安全调用运算符(?.)如果运算符前的对象为null则返回null,否则调用方法/属性。Elvis运算符(?:)在左侧为null时提供默认值。非空断言(!!)如果值为null则抛出空指针异常——仅在100%确定值存在时使用。

平台类型(platform types)——来自被调用的Java代码的Java类型,Kotlin无法将其标记为可空或非空。类型显示为String!(带感叹号)。开发者在与Java代码交互时自行负责空安全。

数据类和解构

数据类在Kotlin中自动生成equals()、hashCode()、toString()、copy()和componentN()。这消除了Java模型(POJO)的样板代码,使代码更简洁。声明一个data class只需一行,而在Java中需要20-30行。

kotlin
data class User(
    val id: Long,
    val name: String,
    val email: String,
    val age: Int? = null
)

// 使用
val user = User(1, "安娜", "anna@example.com")
val updatedUser = user.copy(age = 25)

// 解构
val (id, name) = user
println("用户 #$id: $name")

解构允许在一行中将数据类分解为变量。这在处理对、三元组和其他复合值时非常方便。解构支持数据类、标准集合(List、Map)以及任何具有operator fun componentN()的类。

扩展函数

扩展函数——Kotlin向现有类添加新方法而无需继承的机制。扩展编译为带有接收者参数的静态方法,因此不需要继承,也不支持多态。

kotlin
// String的扩展函数
fun String.isEmail(): Boolean {
    return this.contains("@") && this.contains(".")
}

// 扩展属性
val String.isPhoneNumber: Boolean
    get() = this.matches(Regex("^\\+?[\\d-]{10,15}$"))

// 集合的泛型扩展
fun List<Int>.sumOfEvens(): Int {
    return this.filter { it % 2 == 0 }.sum()
}

// 使用
println("test@mail.com".isEmail())  // true

扩展在Android SDK和库中被广泛使用。例如,Android KTX中的Activity扩展就是针对Activity、Fragment、View等类的扩展函数。扩展可以在文件中声明为顶层函数,或作为类的成员(成员扩展)。

用于异步编程的协程

Coroutines——Kotlin中的异步编程机制,允许以顺序风格编写非阻塞代码。协程在挂起函数上暂停执行而不阻塞线程,并在操作完成后恢复工作。这是RxJava回调链和AsyncTask的替代方案。

kotlin
import kotlinx.coroutines.*

// 挂起函数——可以暂停
suspend fun fetchUserData(userId: Int): User {
    // delay——挂起函数,不阻塞线程
    delay(500)
    return User(userId, "User $userId", "user@example.com")
}

// 在协程中启动
fun loadData() {
    CoroutineScope(Dispatchers.Main).launch {
        val user = fetchUserData(1)  // 在此暂停
        updateUI(user)  // 在主线程上继续
    }
}

Dispatchers决定协程的线程池:Dispatchers.Main(UI线程)、Dispatchers.IO(网络/磁盘操作)、Dispatchers.Default(CPU密集型任务)。Structured concurrency保证协程在作用域结束后不会保持活跃——这可以防止内存泄漏。

kotlin
// 通过async/await并行启动
suspend fun loadDashboard(): Dashboard = coroutineScope {
    val user = async { fetchUserData(1) }
    val orders = async { fetchOrders(1) }
    val stats = async { fetchStats() }
    
    Dashboard(user.await(), orders.await(), stats.await())
}

Kotlin与Java对比

为新Android项目选择Kotlin还是Java——这是一个基本的架构决策。Kotlin提供更现代的语法和内置安全机制,Java则有更广泛的开发人员群体和成熟的库。

特性KotlinJava
空安全内置(可空/非空)无(@Nullable注解)
代码量比Java少40%样板代码(getters/setters)
数据类data class(一行)使用Lombok的POJO或手动编写
异步编程协程(suspend/await)CompletableFuture, RxJava
扩展函数内置仅通过工具类实现
智能转换is检查后自动转换显式转换 (Type) obj
向后兼容性与Java 100%兼容

性能方面Kotlin和Java相当——两者都编译为JVM字节码。Kotlin有时会增加协程和内联的微开销,但对移动应用来说可以忽略不计。Google和JetBrains积极投资Kotlin:Kotlin Multiplatform、Kotlin/Wasm以及改进K2编译器性能。

常见问题

Kotlin与Java有何不同?

Kotlin比Java短40%——样板代码更少。Kotlin增加了空安全、数据类、扩展函数、协程、智能转换、when表达式。与Java完全兼容:两种语言都在JVM上运行,可以在同一项目中使用而不会冲突。

Kotlin的空安全是如何工作的?

类型默认是非空的。对于可空类型,使用?:String?。编译器禁止直接访问可空值。安全调用(?.)在接收者为空时返回null。Elvis运算符(?:)设置默认值。!!——强制提取,可能抛出异常。

什么是Kotlin中的协程?

协程——轻量级线程,允许顺序编写异步代码。挂起函数在不阻塞线程的情况下暂停。launch和async在CoroutineScope中启动协程。Dispatchers.IO用于网络请求,Dispatchers.Main用于UI更新。

什么是Kotlin中的数据类?

data class自动生成equals()、hashCode()、toString()、copy()和componentN()。示例:data class User(val name: String, val age: Int)。通过val (name, age) = user进行解构。类似于Java 14+中的record,但带有额外的copy()方法。

扩展函数是如何工作的?

扩展函数向现有类添加方法:fun String.isEmail(): Boolean。编译器将其替换为带有接收者参数的静态调用。不需要继承。扩展在Android KTX中被广泛使用:view.showToast()、activity.viewModels()。

总结

  • Kotlin — JetBrains开发的静态类型JVM语言,自2017年起成为Android官方语言
  • Null safety — 可空/非空类型、安全调用(?.)、Elvis(??)、let块用于安全处理可空值
  • Data classes — 自动生成equals、hashCode、toString、copy和解构
  • Extension functions — 无需继承即可向任何类添加方法,编译为静态调用
  • Coroutines — 通过挂起函数、launch/async和Dispatchers以顺序风格编写异步代码
  • 与Java对比 — 少40%代码、空安全、智能转换、when表达式和100%与Java兼容
  • Kotlin Multiplatform — Kotlin不仅用于Android,还用于iOS(KMM)和服务器(Ktor、Spring)

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读