在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())// 輸出()