Scala 变量:声明、特性与命名规则
变量是编程语言的基础构建块,Scala 作为一门多范式语言,其变量声明方式与 Java 有显著差异,尤其体现在不可变性和类型推断上。本文详细介绍 Scala 变量的核心特性。
变量声明语法
Scala 变量声明必须初始化,基本语法如下:
1 2
| var|val 变量名[: 变量类型] = 变量值
|
示例解析
1 2 3 4 5 6 7
| var age: Int = 10 val score: Double = 95.5
var name = "Alice" val pi = 3.14159
|
- 类型推导:Scala 编译器能根据初始值自动推断变量类型,通常无需显式声明,简化代码。
- 必须初始化:与 Java 不同,Scala 不允许声明未初始化的变量(如
var x: Int; 会报错),确保变量始终有明确的值。
var 与 val:可变与不可变
Scala 变量分为两种类型,核心区别在于是否可重新赋值:
var(可变变量)
- 允许后续重新赋值
- 类似 Java 中未用
final 修饰的变量
1 2 3
| var count = 10 count = 20 println(count)
|
val(不可变变量)
- 初始化后不可重新赋值(引用不可变,对象内容可能可变)
- 类似 Java 中用
final 修饰的变量
1 2 3 4 5 6 7
| val message = "Hello"
val list = ListBuffer(1, 2, 3) list += 4 println(list)
|
选择建议
- 优先使用 val:
- 线程安全:不可变变量在多线程环境中无需考虑同步问题。
- 代码可靠:避免意外修改导致的逻辑错误。
- 性能优化:JVM 对不可变变量的优化更充分。
- 必要时使用 var:明确需要修改变量值的场景(如计数器、循环变量)。
标识符命名规则
Scala 标识符的命名规则与 Java 类似,但更灵活,支持特殊字符和关键字转义:
常规标识符
- 以字母(A-Z、a-z)或下划线(
_)开头(不能单独用下划线作为标识符)。
- 后续可包含字母、数字、下划线或美元符号(
$)。
- 注意:美元符号
$ 是 Scala 保留字(用于编译器生成的名称),建议避免在自定义标识符中使用。
1 2 3 4
| var userName = "scala" var _temp = 100
|
操作符标识符
- 以操作符(
+、-、*、/、!、? 等)开头。
- 后续只能是操作符字符。
- 编译时会被转换为以
$ 开头的合法名称(避免与 JVM 命名冲突)。
1 2 3
| var + = 10 var +- = 20
|
关键字转义标识符
- 用反引号 ``` 包裹任意字符串(包括关键字),使其成为合法标识符。
1 2 3
| var `var` = 30 var `class` = "Scala" var `my variable` = 5
|
变量与内存模型
理解 var 和 val 的内存特性有助于写出更高效的代码:
- val 变量:存储的引用不可变,编译器可对其进行常量折叠(Constant Folding)优化。
- var 变量:引用可修改,需预留内存空间支持多次赋值,优化空间相对有限。
例如,循环中使用 val 定义的临时变量:
1 2 3 4
| for (i <- 1 to 10) { val square = i * i println(square) }
|