在Kotlin中,val和var是声明变量的两种方式,它们的核心区别在于可变性。
1.val
val声明的变量只能在初始化时赋值一次,后续不能修改其引用。相当于Java中的final变量。
val name = "Kotlin"
name = "Java" //报错!val不可重新赋值
然而,val定义的变量也并非完全不可变,例如:
val list = mutableListOf(1, 2, 3) // list 是 val,不可重新赋值
list.add(4) // 允许!修改对象内部状态
println(list) // 输出 [1, 2, 3, 4]
list = mutableListOf() // 编译错误!val 不可重新赋值
再举个例子:
val readOnlyList = listOf(1, 2, 3) // List 是只读的
readOnlyList.add(4) // 错误!List 没有 add 方法
对比以上两个例子,val定义的“不变”,是对于定义的变量整体而言,而变量中的对象是否可变,取决于该变量的类型。
2.var
var定义的变量允许重新赋值。var变量可以重新赋值,但类型在初始化时确定后不可更改。
对于var与val,都支持类型推断,var第一次赋值后,后面重新赋值需要类型一致,不一致会报错,如:
var a = "string"
a = 1 //报错!
同样,kotlin支持对于复杂类型的推断,如:
val result = someFunction() // 类型由函数返回值决定
val lambda = { x: Int -> x * 2 } // 推断为 (Int) -> Int