1.val和var定义变量
在声明变量时,Scala 允许你决定该变量是不可变(只读)的,还是可变的(读写)。如下所示,不可变的“变量”用val 关键字声明:
val array: Array[String] = new Array(5)
Scala 的大部分变量事实上是指向堆内存对象的引用,这一点与Java 一致。所以,以上代码中的array 也是一个引用,它不能指向其他Array,但所指向的Array 中的元素是可变的,如下所示:
scala> val array: Array[String] = new Array(5) array: Array[String] = Array(null, null, null, null, null) scala> array = new Array(2) <console>:8: error: reassignment to val array = new Array(2) scala> array(0) = "Hello" scala> array res1: Array[String] = Array(Hello, null, null, null, null)
一个val 变量在声明时必须被初始化。
类似地,一个可变变量用关键字var 来声明。尽管由于该变量是可变变量,声明后可以再次对其赋值,也必须在声明的同时立即初始化:
scala> var stockPrice: Double = 100.0 stockPrice: Double = 100.0 scala> stockPrice = 200.0 stockPrice: Double = 200.0
这里要区分一下:这一次我们修改了stockPrice 本身,然而,stockPrice 所引用的“对象”没有被修改,因为在Scala 中Double 类型是不可变的。
2.变量类型与java的异同
在Java 中, 所谓的原生类型, 即char、byte、short、int、long、float、double 和boolean,与其他引用类型有着本质的不同。这些类型确实既不是对象,也没有引用,是“原始”值。Scala 尽力使其面向对象特性更加一致,因此这些类型在Scala 中是包含有方法的对象,这个java基本类型的包装类Double Integer等也很像,就像引用类型一样。然而,Scala 编译时将这些类型尽可能地转为原生类型,使你可以得到原生类型的运行效率。