var
和 val
当标识符保存数据时,您必须决定它是否可以重新赋值。
您创建标识符来引用程序中的元素。对于数据标识符来说,最基本的决策是它是否可以在程序执行过程中更改其内容,或者是否只能被赋值一次。这由两个关键字控制:
var
,代表变量,意味着您可以重新赋值其内容。val
,代表值,意味着您只能初始化它;不能重新赋值。
您可以像这样定义一个var
:
var 标识符 = 初始化值
var
关键字后面是标识符,等号和初始化值。标识符以字母或下划线开头,后跟字母、数字和下划线。区分大小写(因此thisvalue
和thisValue
是不同的)。
这里是一些var
定义的示例:
// VarAndVal/Vars.kt
fun main() {
var whole = 11 // [1]
var fractional = 1.4 // [2]
var words = "Twas Brillig" // [3]
println(whole)
println(fractional)
println(words)
}
/* 输出:
11
1.4
Twas Brillig
*/
在本书中,我们使用带有注释的方括号标记行号,以便我们可以在文本中引用它们,如下所示:
- [1] 创建一个名为
whole
的var
,并将11
存储在其中。 - [2] 在
var fractional
中存储“分数”1.4
。 - [3] 在
var words
中存储一些文本(String
)。
请注意,println()
可以将任何单个值作为参数。
正如名称“变量”所暗示的那样,var
是可变的。也就是说,您可以更改存储在var
中的数据。我们说var
是可变的:
// VarAndVal/AVarIsMutable.kt
fun main() {
var sum = 1
sum = sum + 2
sum += 3
println(sum)
}
/* 输出:
6
*/
赋值语句sum = sum + 2
获取sum
的当前值,加上2,并将结果重新赋值给sum
。
赋值语句sum += 3
与sum = sum + 3
的意思相同。+=
运算符获取sum
中存储的先前值,并将其增加3,然后将新的结果赋值回sum
。
更改var
中存储的值是表示变化的一种有用方式。然而,当程序的复杂性增加时,如果您的标识符表示的值不能更改,即不能重新分配,您的代码将更清晰、更安全、更易于理解。我们使用val
关键字而不是var
来指定一个不可变的标识符。val
只能在创建时被赋值一次:
val identifier = initialization
val
关键字来自于"value",表示不可变的、不能改变的内容。选择使用val
而不是var
是一个很好的选择。在本节的开始处,Vars.kt
示例可以使用val
进行重写:
// VarAndVal/Vals.kt
fun main() {
val whole = 11
// whole = 15 // Error // [1]
val fractional = 1.4
val words = "Twas Brillig"
println(whole)
println(fractional)
println(words)
}
/* 输出:
11
1.4
Twas Brillig
*/
- [1] 一旦你初始化了一个
val
,你就不能重新分配它。如果我们尝试将whole
重新分配给一个不同的数字,Kotlin会报错,显示“Val cannot be reassigned.”(不能重新分配val
)。
选择描述性的名称作为你的标识符可以使你的代码更易于理解,并且通常减少了对注释的需求。在Vals.kt
中,你无法知道whole
代表什么。如果你的程序将数字11存储为表示喝咖啡的时间,那么如果你将其命名为coffeetime
,那么对其他人来说更明显,如果它是coffeeTime
(遵循Kotlin的风格,我们将首字母小写)。
var
在程序运行时数据必须发生变化时很有用。这听起来像是一个常见的要求,但实际上在实践中可以避免。通常情况下,如果你使用val
,你的程序更容易扩展和维护。然而,在极少数情况下,使用val
无法解决问题的复杂性。因此,Kotlin给你提供了使用var
的灵活性。然而,当你花费更多时间使用val
时,你会发现几乎不需要使用var
,而且没有var
的程序更安全可靠。
练习和解答可以在www.AtomicKotlin.com找到。