0%

scala变量

Scala 变量:声明、特性与命名规则

变量是编程语言的基础构建块,Scala 作为一门多范式语言,其变量声明方式与 Java 有显著差异,尤其体现在不可变性和类型推断上。本文详细介绍 Scala 变量的核心特性。

变量声明语法

Scala 变量声明必须初始化,基本语法如下:

1
2
// 完整语法:关键字 变量名[: 类型] = 初始值
var|val 变量名[: 变量类型] = 变量值

示例解析

1
2
3
4
5
6
7
// 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 修饰的变量
1
2
3
var count = 10
count = 20 // 合法:var变量可修改
println(count) // 输出:20

val(不可变变量)

  • 初始化后不可重新赋值(引用不可变,对象内容可能可变)
  • 类似 Java 中用 final 修饰的变量
1
2
3
4
5
6
7
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 保留字(用于编译器生成的名称),建议避免在自定义标识符中使用。
1
2
3
4
var userName = "scala"  // 合法
var _temp = 100 // 合法(以下划线开头)
// var _ = 5 // 错误(单独使用下划线)
// var 123num = 10 // 错误(以数字开头)

操作符标识符

  • 以操作符(+-*/!? 等)开头。
  • 后续只能是操作符字符。
  • 编译时会被转换为以 $ 开头的合法名称(避免与 JVM 命名冲突)。
1
2
3
var + = 10    // 合法,编译后为 $plus
var +- = 20 // 合法,编译后为 $plus$minus
// var +a = 30 // 错误(操作符后不能跟字母)

关键字转义标识符

  • 用反引号 ``` 包裹任意字符串(包括关键字),使其成为合法标识符。
1
2
3
var `var` = 30    // 合法:用反引号包裹关键字var
var `class` = "Scala" // 合法:转义关键字class
var `my variable` = 5 // 合法:包含空格

变量与内存模型

理解 var 和 val 的内存特性有助于写出更高效的代码:

  • val 变量:存储的引用不可变,编译器可对其进行常量折叠(Constant Folding)优化。
  • var 变量:引用可修改,需预留内存空间支持多次赋值,优化空间相对有限。

例如,循环中使用 val 定义的临时变量:

1
2
3
4
for (i <- 1 to 10) {
val square = i * i // 每次迭代创建新的val,无性能问题
println(square)
}

欢迎关注我的其它发布渠道