基本语法
var | val 变量名 [: 变量类型] = 变量值
var 是变量 ,val是常量
说明:在Scala中声明一个变量时,可以不指定类型,编译器根据值确定
Demo
(1)声明变量时,类型可以省略(编译器自动推导,即类型推导)
(2)类型确定后,就不能修改,说明Scala是强数据类型语言。
(3)变量声明时,需要初始值
object TestVar {
def main(args: Array[String]): Unit = {
//(1)声明变量时,类型可以省略(编译器自动推导,即类型推导)
var age = 18
age = 30
//(2)类型确定后,就不能修改,说明Scala是强数据类型语言。
// age = "tom" // 错误
//(3)变量声明时,需要初始值
// var name //错误
}
}
(4)在声明/定义一个变量时,可以使用var或者val来修饰,var修饰的变量可改变,val修饰的变量不可改。
object TestVar {
def main(args: Array[String]): Unit = {
var num1 = 10 // 可变
val num2 = 20 // 不可变
num1 = 30 // 正确
//num2 = 100 //错误,因为num2是val修饰的
}
}
(5)val修饰的变量在编译后,等同于加上final通过反编译看下底层代码
object TestVar {
var num1 = 10 // 可变
val num2 = 20 // 不可变
def main(args: Array[String]): Unit = {
num1 = 30 // 正确
//num2 = 100 //错误,因为num2是val修饰的
}
}
通过反编译软件,得到对应的底层的.class是
public final class TestVar$
{
public static final MODULE$;
private int num1;
private final int num2;
(6)var修饰的对象引用可以改变,val修饰的则不可改变,但对象的状态(值)却是可以改变的。(比如:自定义对象、数组、集合等等)
object TestVar {
def main(args: Array[String]): Unit = {
// p1是var修饰的,p1的属性可以变,而且p1本身也可以变
var p1 = new Person()
p1.name = "dalian"
p1 = null
// p2是val修饰的,则p2的属性可以变,但是p2本身不可变(即p2的内存地址不能变)
val p2 = new Person()
p2.name="xiaolian"
// p2 = null // 错误的,因为p2是val修饰的
}
}
class Person{
var name : String = "jinlian"
}