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