我理解 val 关键字确定基础变量是不可变类型(以后不能重新分配)。现在我在scala编程中遇到了一个段落(第3章,scala中的后续步骤 - 使用类型参数化数组),它声明了
val greetStrings: Array[String] = new Array[String](3)
greetStrings(0) = "Hello"
greetStrings(1) = ", "
greetStrings(2) = "world!\n"
这三行代码说明了这一点 一个要理解的重要概念 关于斯卡拉的意义 VAL。使用时定义变量 val,变量无法重新分配, 但它引用的对象 可能仍有可能改变。所以 在这种情况下,你无法重新分配 greetStrings到不同的数组; greetStrings总是指向 相同的Array [String]实例 它被初始化了。但你可以改变 该数组的元素[String] 随着时间的推移,所以数组本身就是 可变的。
因此它可以更改数组的元素。如果我们像这样定义
,它就无效greetStrings = Array("a","b","c")
满足以下声明
使用时定义变量 val,变量无法重新分配, 但它引用的对象 可能仍有可能改变。
但如果我宣布这样的话
val str = "immutable string"
根据书中给出的定义
在上面的代码行中它所指的对象可能仍然可能会被更改?
答案 0 :(得分:10)
声明 val 并不保证甚至暗示不可变类型。它只在Java中声明了一个 final 变量。无法重新分配标识符,但该值可能是可变类型。
在您的字符串值示例中,您既有 val 又有一个不可变类型String。所以这个标识符既不可重新分配也不可修改(不可变)。