一、Kotlin语言声明变量格式
二、内置数据类型
在Kotlin中,基本数据类型在编译为Java字节码时,会根据是否可空和上下文环境转换为对应的Java类型。对于不可空类型(默认情况),Kotlin会优先使用Java的基本类型;若涉及泛型或可空类型(如Int?
),则会自动装箱为对应的包装类。以下是题目中列出的Kotlin类型在不可空情况
说明:
-
不可空类型 :直接映射为Java的基本类型(如
int
、float
等),无需装箱,性能更优。 -
可空类型或泛型 :自动装箱为Java的包装类(如
Integer
、Float
等),因为泛型在JVM中不支持基本类型。 -
String :始终对应Java的
String
类,因为它本身是引用类型,无需装箱。
kotlin
val a: Int = 42 // 对应 Java: int a = 42
val b: Int? = 42 // 对应 Java: Integer b = 42
val list: List<Int> // 对应 Java: List<Integer>
三、var
变量和 val
只读变量
3.1 主要区别
具体规则与示例
val
的不可变性
- 对象引用不可变 :
val
变量的引用地址不可变,但对象内部的属性可能可变。
scss
val list = mutableListOf(1, 2, 3)
list.add(4) // ✅ 允许(修改对象内容)
list = mutableListOf() // ❌ 编译错误(不可重新赋值)
- 编译时常量 :若需定义编译时常量,需用
const val
(仅支持基本类型和 String):
const val PI = 3.1415 // 必须位于顶层或 object 中
var
的可变性
- 允许重新赋值:
ini
var count = 0
count = 42 // ✅ 允许
- 类型推断:需确保类型一致:
ini
var name = "Kotlin"
name = 42 // ❌ 编译错误(类型不匹配)
3.2 使用场景
优先使用 val
的情况
- 避免意外修改 :
默认使用val
,确保变量仅在必要时才可变。
val user = getUser()// 后续无法意外修改 user 的引用
- 函数式编程 :
不可变变量更契合纯函数和链式调用。
val filteredList = list.filter { it > 0 }.map { it * 2 }
- 并发编程 :
减少共享可变状态,简化多线程同步。
val result = runBlocking { asyncTask() } // 结果不可变
必须使用 var
的情况
- 状态变化 :
如计数器、UI 组件的可见性等需要动态更新的场景。
kotlin
var isLoading = false
fun loadData() {
isLoading = true
// 发起网络请求...
}
循环控制 :
在 for
或 while
循环中修改循环变量。
css
for (var i in 0..10) {
/* Kotlin 的 for 循环默认用 val,此处仅为示例
*/ }