变量与数据类型
本教程共 100 篇 · 第 10 篇 · 更新于 2026-07-28 · 约 7 分钟阅读
10. 变量与数据类型
本节目标:学会声明变量(val 与 var 的区别)、认识 Kotlin 的基本类型、理解类型推断和可空类型、会用字符串模板。
val 与 var:两个关键字搞定变量
Kotlin 声明变量只用两个关键字:
val:只读变量,赋值后不能再改。相当于 Java 的final。var:可变变量,能反复赋值。
val name: String = "Android" // 只读
var count: Int = 0 // 可变
count = 1 // OK
// name = "iOS" // 编译报错,val 不能改
Tip默认用
val,只有确实需要改时才用var。这是 Kotlin 的好习惯,能减少意外修改导致的 bug。Android 里很多状态其实不需要变,用val让代码更安全。
注意 val 是「引用只读」,不是「对象不可变」。val 指向一个可变列表,列表内容还是能改:
val list = mutableListOf(1, 2, 3)
list.add(4) // OK,列表内容变了
// list = mutableListOf() // 报错,val 不能重新指向
类型推断:不用处处写类型
Kotlin 能根据初始值推断类型,大多时候不用显式写类型:
val name = "Android" // 推断为 String
var count = 0 // 推断为 Int
val price = 9.99 // 推断为 Double
val isActive = true // 推断为 Boolean
需要明确类型时(比如没初始值,或想用更具体的类型)才写:
val age: Int = 18
val Pi: Float = 3.14f // Float 要加 f
val id: Long = 1234567890L // Long 要加 L
基本数据类型
Kotlin 没有 Java 那种「基本类型(int)和包装类型(Integer)」的区分,统一用对象类型,但编译时会优化成基本类型(不装箱)。
数字类型
| 类型 | 位数 | 范围 | 用途 |
|---|---|---|---|
Byte | 8 | -128 ~ 127 | 字节数据 |
Short | 16 | -32768 ~ 32767 | 短整数,少用 |
Int | 32 | -2^31 ~ 2^31-1 | 普通整数,最常用 |
Long | 64 | -2^63 ~ 2^63-1 | 大整数 |
Float | 32 | 单精度浮点 | 加 f 后缀 |
Double | 64 | 双精度浮点 | 默认浮点类型 |
val i: Int = 100
val l: Long = 100L
val f: Float = 3.14f
val d: Double = 3.14
数字之间转换要显式调用方法,Kotlin 不隐式转换:
val a: Int = 10
val b: Long = a.toLong() // 显式转换
// val b: Long = a // 编译报错
Boolean
val enabled: Boolean = true
val disabled = false
支持 &&、||、!。
Char
单个字符,用单引号:
val letter: Char = 'A'
val digit = '9'
String
字符串,双引号:
val greeting = "Hello"
字符串模板
Kotlin 字符串里能直接插变量和表达式,这是写起来很爽的特性:
val name = "Android"
val version = 16
println("Welcome to $name") // Welcome to Android
println("Current version is $version") // Current version is 16
println("Name length: ${name.length}") // Name length: 7
println("Version next year: ${version + 1}") // Version next year: 17
$变量名直接插变量。${表达式}插任意表达式。
多行字符串用三个引号 """:
val json = """
{
"name": "Android",
"version": 16
}
""".trimIndent()
println(json)
trimIndent() 会去掉公共缩进,输出整洁。
NoteAndroid 里写 SQL、JSON、长文案经常用多行字符串,比拼接
+干净多了。
可空类型
Kotlin 的类型默认不接受 null。想让变量能存 null,类型后面加 ?:
var name: String = "Android"
// name = null // 编译报错
var nickname: String? = "Andy"
nickname = null // OK
可空类型用的时候要处理 null,本章先知道有这么个东西,第 16 章专门讲空安全怎么用。
val length = nickname?.length // 安全调用,nickname 为 null 时返回 null
val len = nickname?.length ?: 0 // Elvis 运算符,null 时用 0
类型转换
Kotlin 不允许隐式转换,要显式调 toXxx():
val i = 10
val l: Long = i.toLong()
val d: Double = i.toDouble()
val s: String = i.toString()
val str = "123"
val num: Int? = str.toIntOrNull() // 解析失败返回 null,不会抛异常
Tip
- 解析字符串到数字优先用
toIntOrNull()、toDoubleOrNull()这类带OrNull的方法,避免NumberFormatException崩溃。
数组
Kotlin 有 Array 类,但日常用得少,大多用集合(List、Set)。需要数组时:
val arr = arrayOf(1, 2, 3) // Array<Int>
val strs = arrayOf("a", "b")
val ints = intArrayOf(1, 2, 3) // 基本类型数组,不装箱
println(arr[0]) // 取值
println(arr.size) // 长度
Android 里的常见用法
// Compose 里存状态
var counter by remember { mutableStateOf(0) } // var,会变
val maxCount = 100 // val,常量
// 资源 ID
val colorRes = R.color.black
val stringRes = R.string.app_name
// Intent 传值取值
val userId: Long = intent.getLongExtra("user_id", 0L)
val name: String? = intent.getStringExtra("name")
注意 Android API 返回的可空类型,取出来要判空或用 Elvis。
小结
val 只读、var 可变,默认用 val。类型大多能推断不用写。基本类型统一为对象类型,转换要显式调用。字符串模板用 $ 和 ${} 插值。类型默认非空,加 ? 才能存 null。下一节学控制流。