基本语法

var | val 变量名 [: 变量类型] = 变量值

var 是变量 ,val是常量

说明:在Scala中声明一个变量时,可以不指定类型,编译器根据值确定

Demo

(1)声明变量时,类型可以省略(编译器自动推导,即类型推导)
(2)类型确定后,就不能修改,说明Scala是强数据类型语言。
(3)变量声明时,需要初始值

  1. object TestVar {
  2. def main(args: Array[String]): Unit = {
  3. //(1)声明变量时,类型可以省略(编译器自动推导,即类型推导)
  4. var age = 18
  5. age = 30
  6. //(2)类型确定后,就不能修改,说明Scala是强数据类型语言。
  7. // age = "tom" // 错误
  8. //(3)变量声明时,需要初始值
  9. // var name //错误
  10. }
  11. }

(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"
}