在java中,咱们是这样定义变量的:java
String str = "hello"; int num = 1;
在Scala中,咱们是这样定义变量的:函数
val str: String = "hello" var num: Int = 1;
这两个的区别:spa
Scala变量类型定义后,就不能对类型进行修改,因此咱们下面注释掉的语句是编译不过去的,这个和java同样。scala
var obj1 = 1 println(obj1.getClass) //obj1 = "obj1" var obj2 = "obj2" println(obj2.getClass) //obj2 = 1
java的final和Scala的val雷同都是用来修饰不可变的变量,若是是值类型,那这个值不能改变,若是是对象类型,那这个对象的引用不可改变。
java的final,注释掉的语句是编译不过去的:code
final int fNum = 1; // fNum=2;//Cannot assign a value to final ariable 'fNum'
Scala的val,注释掉的语句是编译不过去的:对象
val fNum = 1 //fNum = 2
经过lazy val来定义一个懒加载get
lazy val lz = { println("lazy") "lz" } println("-----") println(lz)
打印结果以下,说明在定义的时候,并无运行打印的方法,只有在实际调用lz的时候,才会调用println("lazy")。编译器
----- lazy lz
块表达式是用{}包裹起来的多个表达式,其中最后一个表达式就是这个块的返回值。
下面的块表达式,x的值为1。hash
var x = { println("block") 1 } println(x)
函数定义的时候,左边是传入的参数,右边是块表达式(若是只有一句能够省略{}
),中间的符号是=>
。
好比咱们定义一个匿名函数:it
(x: Int) => x + 1
给函数一个名称:
var fun1 = (x:Int)=> x+1 println(fun1(10))//输出11
无参函数:
var fun2=()=>10 println(fun2())
方法的定义跟函数的定义雷同,首先是定义方法的关键字def,而后是参数的类型,返回值的类型,=
,最后是方法体。
def add(x: Int, y: Int): Int = x + y
若是是无参的话,参数类型能够不写。另外返回值也能够不写,编译器会自动推断。
def method1()={ 1 } println(method1())// 输出1
若是=
也没有写,那这个方法的返回值就是Unit,等同于java的void。
def method2(){ 1 } println(method2())// 输出()