1. 变量与常量
使用 val
声明不可变的常量,var
声明可变变量。
val name = "Alice" // 不可更改
var age = 25 // 可更改
注意事项:修改 val
会导致编译错误。
2. 数据类型
Kotlin 是强类型语言,支持基础数据类型。
val height: Double = 1.75
val isStudent: Boolean = true
易错点:变量默认不可为 null,使用可空类型时需显式声明 String?
。
3. 条件语句
if
和 else
是表达式,可以有返回值。
val max = if (a > b) a else b
注意事项:所有分支需返回一致类型。
4. 循环
Kotlin 支持 for
、while
、do-while
。
for (i in 1..5) {
println(i)
}
注意事项:使用 until
排除上限值。
5. 函数
使用 fun
定义函数,支持单表达式函数。
fun greet(name: String): String = "Hello, $name!"
注意事项:参数支持默认值,可省略调用。
6. 类与对象
类默认 final
,使用 open
才能被继承。
open class Person(val name: String, var age: Int)
注意事项:构造函数可以在 init
块中初始化逻辑。
7. 扩展函数
扩展函数允许为已有类添加功能而不改变其源代码。
fun String.addHello() = "Hello $this"
注意事项:扩展函数无法修改原类,只能访问公开成员。
8. 泛型
泛型增强代码灵活性,允许在类和函数中使用类型参数。
fun singletonList(item: T): List = listOf(item)
注意事项:泛型类型在运行时被擦除,无法检测类型。
9. 协程
协程为异步编程提供支持,简化回调处理。
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(1000L)
println("World!")
}
println("Hello")
}
注意事项:适当使用 runBlocking
和 launch
控制协程作用域。
10. 错误处理
使用 try-catch
进行错误捕获,支持 finally
块。
try {
val result = riskyFunction()
} catch (e: Exception) {
println("Error: ${e.message}")
}
注意事项:捕获具体异常以便定位问题。
高级与小众用法
数据类中的解构声明
数据类可以直接解构为多个变量。
data class User(val name: String, val age: Int)
val user = User("Alice", 25)
val (name, age) = user
易错点:解构声明顺序必须与类定义顺序一致。
Elvis 操作符
用于空安全操作,指定默认值。
val name: String? = null
val displayName = name ?: "Unknown"
易错点:使用过多 ?:
可能隐藏 null 检查问题。
Infix 函数
一种不使用圆括号的调用方式。
infix fun Int.times(str: String) = str.repeat(this)
println(3 times "Hello ")
注意事项:Infix 函数只能接收一个参数,需保证可读性。
高阶函数与 Lambda
以函数作为参数或返回值。
val list = listOf(1, 2, 3, 4)
val doubled = list.map { it * 2 }
易错点:避免在性能敏感的地方使用频繁创建对象的 Lambda。
对象表达式与单例
使用 object
创建单例。
object Singleton {
val name = "OnlyInstance"
}
println(Singleton.name)
注意事项:对象表达式默认线程安全,适用于全局资源。
型变与协变、逆变
定义泛型的协变和逆变。
class Box(val value: T)
注意事项:协变只允许使用类型为输出,逆变用于输入参数。
属性委托 (Delegates)
使用 lazy
和 observable
进行延迟初始化和属性观察。
val lazyValue: String by lazy {
println("Computed!")
"Hello"
}
println(lazyValue)
注意事项:by lazy
仅在首次访问时计算,适用于单例模式。