Kotlin 零基础完整版实战教程|从语法入门到Android工程实战
适配环境:Kotlin 2.0、Android Studio、IDEA、Gradle 最新版本
📋 目录
1. Kotlin 简介与环境搭建
1.1 什么是 Kotlin?
Kotlin 是 JetBrains 公司研发的静态类型、跨平台编程语言,完全兼容 Java,是 Google 官方指定的 Android 首选开发语言。
相较于 Java,Kotlin 代码更简洁、安全、高效,解决了 Java 空指针泛滥、代码冗余等痛点,原生支持函数式编程、异步协程、空安全等高级特性。
核心特性
-
✅ 空安全:从语法层面杜绝空指针异常
-
✅ 代码极简:大幅精简模板代码
-
✅ 函数式编程:Lambda、高阶函数、流式集合
-
✅ 原生协程:优雅处理异步任务
-
✅ 全平台适配:支持 JVM、JS、Native、多端开发
-
✅ 100% 兼容 Java:可无缝混合开发
1.2 开发运行环境
无需复杂配置,任意主流开发工具均可直接运行:
-
IntelliJ IDEA(原生支持)
-
Android Studio(默认内置)
-
Kotlin Playground(在线运行,无需安装)
-
Gradle / Maven 工程项目
1.3 首个 Kotlin 程序:Hello World
Kotlin 省略了类包裹、main 方法模板,代码极度精简:
kotlin
// 最简入口函数
fun main(){
println("Hello Kotlin!")
}
带参数标准写法:
kotlin
fun main(args: Array<String>){
println("程序启动成功,参数:${args}")
}
2. 变量、常量与类型推导
Kotlin 严格区分可变变量 和只读常量,是代码安全的基础,也是企业编码规范的核心要点。
2.1 核心关键字 val / var
-
val :只读常量,等同于 Java
final,赋值后不可修改,开发优先使用 -
var:可变变量,运行过程中可重复赋值修改
2.2 基础写法与类型推导
Kotlin 支持自动类型推导,无需手动声明类型,精简代码:
kotlin
// 手动声明类型(规范严谨)
val userName: String = "码农教程"
var userAge: Int = 22
// 自动类型推导(常用写法)
val height = 175.5
val isStudent = false
💡 最佳实践:全局变量、业务常量、状态数据一律用 val;仅动态变化的数据使用 var,减少程序异常风险。
3. 核心特性:空安全机制
空安全是 Kotlin 最核心、最实用的特性,彻底解决 Java 开发中最常见的 NPE 空指针异常。
3.1 默认非空类型
Kotlin 中所有类型默认禁止为 null,直接赋值 null 会编译报错:
kotlin
var content: String = "正常文本"
// content = null // 编译报错,非空类型不允许赋值null
3.2 可空类型 ?
如需接收 null 值,必须手动添加 ? 标记为可空类型:
kotlin
var content: String? = null
3.3 四大空安全操作符
1)安全调用 ?. (最常用)
对象为 null 时直接返回 null,不执行方法、不抛异常:
kotlin
val length = content?.length
2)空合并 ?: (默认值)
对象为空时,返回指定默认值,避免返回 null:
kotlin
val length = content?.length ?: 0
3)强制非空 !! (慎用)
强制断言对象非空,若为 null 直接抛出 NPE,业务开发尽量避免使用:
kotlin
val length = content!!.length
4)空判断 + let 安全作用域
非空时执行逻辑,为空直接跳过,是项目标准写法:
kotlin
content?.let {
// it 代表非空的content对象
println("文本长度:${it.length}")
}
4. 基础数据类型与类型转换
4.1 基础数据类型大全
Kotlin 无基本类型、全部为包装类型,底层自动优化性能:
| 数据类型 | 取值范围/说明 |
|---|---|
| Byte | 字节型,-128 ~ 127 |
| Short | 短整型,-32768 ~ 32767 |
| Int | 整型,日常开发默认使用 |
| Long | 长整型,数值后缀加 L |
| Float | 单精度浮点,后缀加 f |
| Double | 双精度浮点,默认小数类型 |
| Boolean | 布尔值,true / false |
| Char | 单个字符,单引号包裹 |
4.2 字符串高级用法
kotlin
// 普通字符串
val text = "Kotlin 教程"
// 多行字符串(自动换行,无需转义)
val multiText = """
第一行内容
第二行内容
第三行内容
""".trimIndent() // 去除首尾缩进空格
// 字符串模板(核心用法,替代字符串拼接)
val name = "Android"
val tip = "开发语言:$name,字符串长度:${name.length}"
4.3 类型转换规则
Kotlin 不支持隐式类型转换,所有类型转换必须手动调用方法,避免精度丢失:
kotlin
val numInt: Int = 10
val numLong: Long = numInt.toLong()
val numDouble: Double = numInt.toDouble()
val str: String = numInt.toString()
常用转换方法:toInt()、toLong()、toFloat()、toDouble()、toString()
5. 函数、默认参数、高阶函数与Lambda
5.1 基础函数定义
kotlin
// 完整写法
fun add(a: Int, b: Int): Int {
return a + b
}
// 单行简写(省略return和大括号,高频使用)
fun addShort(a: Int, b: Int) = a + b
5.2 默认参数 & 命名参数
无需重载方法,通过默认参数即可实现多参数适配,精简代码:
kotlin
// 默认参数
fun greet(name: String = "游客"){
println("你好,$name")
}
greet() // 不传参,使用默认值
greet("开发者")
// 命名参数,无视参数顺序
fun createUser(id: Int, name: String){}
createUser(name = "张三", id = 1001)
5.3 Unit 无返回值
无返回值函数默认返回 Unit,可直接省略:
kotlin
fun logMsg(msg: String): Unit {
println(msg)
}
// 简化写法(项目通用)
fun logMsg(msg: String) {
println(msg)
}
5.4 高阶函数 & Lambda
高阶函数:参数或返回值为函数,是函数式编程的核心:
kotlin
// 定义高阶函数
fun calculate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
return op(a, b)
}
// Lambda调用
val sum = calculate(5, 3) { x, y -> x + y }
val sub = calculate(5, 3) { x, y -> x - y }
// 单参数Lambda简写(it关键字)
val list = listOf(1,2,3)
list.forEach { println(it) }
6. 流程控制:if / when / 循环
6.1 if 表达式(可直接赋值)
Kotlin 中 if 是表达式,可直接返回结果赋值,无需冗余代码:
kotlin
val age = 20
val userType = if (age >= 18) "成年人" else "未成年人"
6.2 when 条件语句(升级版switch)
when 完全替代 Java switch,支持范围判断、多条件匹配,更灵活:
kotlin
// 带参数匹配
val level = when(age) {
in 0..17 -> "青少年"
18 -> "刚成年"
else -> "成年人"
}
// 无参数多条件判断(推荐替代多层if-else)
when {
age < 0 -> println("年龄非法")
age > 100 -> println("高龄用户")
else -> println("年龄正常")
}
6.3 循环语句
kotlin
// 闭区间 1~10
for (i in 1..10) println(i)
// 开区间 1~9(不包含结束值)
for (i in 1 until 10) println(i)
// 步长循环
for (i in 1..10 step 2) println(i)
// 倒序循环
for (i in 10 downTo 1) println(i)
// 集合遍历+下标
val arr = listOf("A", "B", "C")
for ((index, item) in arr.withIndex()) {
println("下标$index:$item")
}
// while / do-while
var count = 0
while (count < 5) count++
do {
count++
} while (count < 10)
7. 面向对象:类、构造器、属性封装
7.1 极简类定义(主构造器)
Kotlin 主构造器可直接声明属性,一行代码完成 Java 数十行逻辑:
kotlin
// 最简实体类
class User(val id: Int, var name: String)
7.2 完整构造器写法
kotlin
class Person {
var name: String = ""
var age: Int = 0
// 次级构造器
constructor(name: String, age: Int) {
this.name = name
this.age = age
}
}
7.3 初始化块 init
类实例化时自动执行,用于初始化数据:
kotlin
class Car(val brand: String) {
init {
println("初始化车辆品牌:$brand")
}
}
7.4 自定义 getter / setter 封装
实现属性监听、数据校验、字段封装,field 代表底层字段:
kotlin
class Student {
var score: Int = 0
get() = field
set(value) {
// 分数校验
field = if (value > 100) 100 else if (value < 0) 0 else value
}
}
8. 数据类、枚举类、密封类
8.1 数据类 data class(实体类首选)
自动生成 equals、hashCode、toString、copy、解构方法,专门用于数据承载:
kotlin
data class User(val id: Int, val name: String)
// 快速拷贝修改属性
val user1 = User(1001, "张三")
val user2 = user1.copy(name = "李四")
8.2 枚举类 enum class
用于固定状态、类型定义,支持自定义属性:
kotlin
// 基础枚举
enum class NetStatus {
LOADING, SUCCESS, ERROR
}
// 带参数枚举
enum class Color(val code: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
8.3 密封类 sealed class(状态管理神器)
限制子类范围,when 分支可穷举校验,UI状态、网络状态首选:
kotlin
sealed class Result<out T> {
object Loading : Result<Nothing>()
data class Success<T>(val data: T) : Result<T>()
data class Fail(val msg: String) : Result<Nothing>()
}
9. 继承、接口、抽象类
9.1 类继承(open 关键字)
Kotlin 类、方法默认不可继承,必须添加open 开放权限:
kotlin
open class Animal
class Dog : Animal()
9.2 接口 interface
接口支持抽象方法 + 默认方法实现,无需抽象类即可实现复用:
kotlin
interface Flyable {
// 抽象方法(必须重写)
fun fly()
// 默认实现方法(可选重写)
fun logFly() {
println("飞行器启动")
}
}
class Bird : Flyable {
override fun fly() {
println("小鸟飞翔")
}
}
9.3 抽象类 abstract
kotlin
abstract class Shape {
abstract fun draw()
}
class Circle : Shape() {
override fun draw() {
println("绘制圆形")
}
}
10. 五大作用域函数全方位解析
作用域函数是 Kotlin 高频用法,用于简化对象操作、空安全处理、对象初始化。
| 函数 | 参数指代 | 返回值 | 核心使用场景 |
|---|---|---|---|
| let | it | Lambda结果 | 空安全处理、数据转换 |
| run | this | Lambda结果 | 对象内批量逻辑处理 |
| apply | this | 对象自身 | 对象初始化、属性赋值 |
| also | it | 对象自身 | 日志打印、附加副作用 |
| with | this | Lambda结果 | 已有对象批量操作 |
实战示例
kotlin
// apply 初始化对象(最常用)
val user = User(1002, "测试用户").apply {
name = "新用户名"
}
// also 附加日志
user.also {
println("用户初始化完成:${it.name}")
}
// let 空安全转换
val nameLength = user.name?.let { it.length }
11. 集合框架与函数式流式操作
11.1 常用集合创建
kotlin
// 不可变集合
val list = listOf(1,2,3,4,5)
val set = setOf(1,2,2,3) // 自动去重
val map = mapOf(1 to "安卓", 2 to "IOS")
11.2 流式高阶操作(项目核心用法)
kotlin
val result = list
.filter { it > 2 } // 过滤:保留大于2的元素
.map { it * 10 } // 转换:元素乘10
.sortedDescending() // 倒序排序
.distinct() // 去重
.forEach { println(it) }
高频集合API:filter、map、flatMap、any、all、firstOrNull、fold、reduce
12. 可变/不可变集合规范
Kotlin 严格区分集合可变性,规避集合篡改引发的异常:
| 不可变(只读) | 可变(可增删改) |
|---|---|
| listOf | mutableListOf |
| setOf | mutableSetOf |
| mapOf | mutableMapOf |
💡 企业规范 :内部逻辑使用可变集合,对外暴露返回不可变集合,保证数据安全。
13. 扩展函数与扩展属性
无需继承、无需修改源码,即可为任意系统类、自定义类新增方法/属性,是 Android 开发封装工具类的核心方案。
13.1 扩展函数
kotlin
// 为String新增邮箱校验方法
fun String.isEmail(): Boolean {
return this.contains("@")
}
// 调用
val email = "test@163.com"
println(email.isEmail()) // true
13.2 扩展属性
kotlin
val String.wordCount: Int
get() = this.split(" ").size
// 调用
println("Kotlin 教程".wordCount)
14. 委托属性与懒加载机制
14.1 by lazy 懒加载(最常用)
延迟初始化,首次使用时才赋值,线程安全,节省内存:
kotlin
val lazyData: String by lazy {
println("首次初始化加载")
"懒加载数据内容"
}
14.2 属性监听委托
kotlin
import kotlin.properties.Delegates
var count: Int by Delegates.observable(0) { oldValue, newValue ->
println("数值变化:$oldValue -> $newValue")
}
15. 异常处理机制
Kotlin 摒弃 Java 受检异常,语法更简洁,try 支持表达式赋值。
15.1 try-catch-finally
kotlin
val result = try {
"123".toInt()
} catch (e: NumberFormatException) {
0
} finally {
println("解析执行完毕")
}
15.2 主动抛异常
kotlin
fun checkAge(age: Int) {
if (age < 0) {
throw IllegalArgumentException("年龄数值非法")
}
}
16. 泛型基础与型变
16.1 泛型类 & 泛型函数
kotlin
// 泛型类
class Box<T>(val value: T)
val strBox = Box<String>("泛型测试")
// 泛型函数
fun <T> printData(data: T) {
println(data)
}
16.2 协变 out / 逆变 in
-
out T:协变,只读生产者,只能输出数据
-
in T:逆变,写入消费者,只能接收数据
kotlin
interface Producer<out T> {
fun get(): T
}
16.3 reified 具体化泛型
结合 inline 实现运行时泛型类型判断:
kotlin
inline fun <reified T> isType(obj: Any): Boolean {
return obj is T
}
17. 协程 Coroutine 实战入门
协程是 Kotlin 异步编程核心,替代线程、Handler、RxJava,简洁高效。
17.1 依赖引入(Android)
gradle
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0"
17.2 挂起函数 & 协程启动
kotlin
import kotlinx.coroutines.*
// 挂起函数:异步任务
suspend fun fetchNetData(): String {
delay(1000) // 非阻塞延时
return "网络请求成功数据"
}
// 启动协程
fun main() = runBlocking {
launch {
val data = fetchNetData()
println(data)
}
}
17.3 四大调度器
-
Dispatchers.Main:Android UI主线程,更新界面
-
Dispatchers.IO:网络、文件、数据库IO任务
-
Dispatchers.Default:CPU密集型计算任务
-
Dispatchers.Unconfined:无固定线程绑定
17.4 并发 & 超时
kotlin
// 多任务并发
val task1 = async { delay(1000); "任务1结果" }
val task2 = async { delay(1000); "任务2结果" }
val result = "${task1.await()} + ${task2.await()}"
// 超时自动取消
withTimeout(3000) {
fetchNetData()
}
18. Flow / StateFlow / SharedFlow 状态管理
Flow 是 Kotlin 官方数据流方案,用于异步数据流分发,是 Compose/ViewModel 状态管理核心。
18.1 Flow 冷流(订阅即触发)
kotlin
fun countFlow() = flow {
emit(1)
emit(2)
delay(1000)
emit(3)
}
18.2 StateFlow 状态流(UI状态首选)
热流、保存最新状态、页面订阅刷新,替代 LiveData:
kotlin
private val _uiState = MutableStateFlow(0)
val uiState: StateFlow<Int> = _uiState // 只读对外暴露
18.3 SharedFlow 事件流
用于一次性事件:Toast、弹窗、页面跳转,避免状态复用。
高频操作符:map、filter、debounce、distinctUntilChanged、combine
19. Kotlin 与 Java 双向互操作
Kotlin 可无缝调用 Java 代码,也可适配 Java 调用 Kotlin。
19.1 @JvmStatic 静态方法
kotlin
object Utils {
@JvmStatic
fun testStatic() {}
}
19.2 @JvmField 直接访问字段
kotlin
class Config {
@JvmField
val SUCCESS_CODE = 200
}
19.3 @JvmOverloads 重载适配
自动生成多个重载构造方法,适配 Java 默认参数调用。
20. 内联函数性能优化
通过 inline 消除 Lambda 匿名类创建,优化高频调用性能。
-
inline:代码直接嵌入调用处,减少对象创建
-
noinline:禁止单个 Lambda 内联
-
crossinline:禁止 Lambda 外部返回
kotlin
inline fun safeRun(block: () -> Unit) {
try {
block()
} catch (e: Exception) {
println("执行异常:${e.message}")
}
}
21. Compose 高频 Kotlin 实战写法
Jetpack Compose 基于 Kotlin 语法,掌握以下写法即可完成绝大部分UI开发:
kotlin
// 组合函数
@Composable
fun CounterUI(count: Int, onCountChange: () -> Unit) {
Button(onClick = onCountChange) {
Text("当前计数:$count")
}
}
// 状态保存
val countState = remember { mutableIntStateOf(0) }
// 密封类UI状态管理
sealed class UiEvent {
object SubmitClick : UiEvent()
object RefreshClick : UiEvent()
}
22. 企业级编码规范与最佳实践
-
优先使用 val,仅动态可变数据使用 var
-
空安全优先使用
?.let、?:,严禁滥用!! -
网络、IO 任务统一使用 suspend 协程 + Dispatchers.IO
-
UI 状态统一使用密封类 + StateFlow 管理
-
工具方法统一封装为扩展函数,精简代码
-
对外暴露不可变集合,内部使用可变集合,保证数据安全
-
高频 Lambda 方法使用 inline 优化性能
-
避免多层嵌套 if,优先使用 when 语句