Kotlin 零基础完整版实战教程|从语法入门到Android工程实战

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. 企业级编码规范与最佳实践

  1. 优先使用 val,仅动态可变数据使用 var

  2. 空安全优先使用 ?.let、?:,严禁滥用 !!

  3. 网络、IO 任务统一使用 suspend 协程 + Dispatchers.IO

  4. UI 状态统一使用密封类 + StateFlow 管理

  5. 工具方法统一封装为扩展函数,精简代码

  6. 对外暴露不可变集合,内部使用可变集合,保证数据安全

  7. 高频 Lambda 方法使用 inline 优化性能

  8. 避免多层嵌套 if,优先使用 when 语句


相关推荐
jimy11 小时前
C++ 的 “移动语义”——Move Semantics
开发语言·c++
码云数智-园园1 小时前
C++ STL 容器怎么选?vector、list、map、unordered_map 优缺点对比
java·开发语言
en.en..2 小时前
竖线 |:管道、按位或、掩码组合
java·开发语言
律宏阔2 小时前
Android 车载 USB 开发笔记:USB Host、USB 串口、USB-CAN、HID 与系统 API
android
techdashen2 小时前
Go Map 详解:键值对实际上是如何存储的
开发语言·后端·golang
律宏阔2 小时前
Android 车载串口开发笔记:UART、RS232、RS485、串口配置与数据通信
android
程序猿乐锅2 小时前
【计算机组成原理 | 第六章】中央处理器 CPU
java·开发语言
Terra.K2 小时前
ThreadLocal解决一个线程里面跨层传递问题
java·开发语言·后端
YF02113 小时前
遥控器APP端自动重连方案
android