一、 聲明值和變量
Scala聲明變量有兩種方式,一個用val,一個用var。
聲明方式:val / var 變量名 : 變量類型 = 變量值
val定義的值是不可變的,它不是一個常量,是不可變量,或稱之為只讀變量。
val示例:
scala> val a1 = 10
scala> a1 = 20(此處會報錯,因為val不允許初始化后再次修改a1變量的引用)12
var示例:
scala> var a2 = 10
scala> a2 = 2012
1、scala默認為匿名變量分配val
2、val定義的變量雖然不能改變其引用的內存地址,但是可以改變其引用的對象的內部的其他屬性值。
3、為了減少可變性引起的bug,應該盡可能地使用不可變變量。變量類型可以省略,解析器會根據值進行推斷。val和var聲明變量時都必須初始化。
二、常用數據類型
常用類型介紹
同Java一樣,Scala也有8種基本數據類型:Byte、Char、Short、Int、Long、Float、Double以及Boolean。
類型 | 介紹 |
---|---|
Boolean | true 或者 false |
Byte | 8位, 有符號 |
Short | 16位, 有符號 |
Int | 32位, 有符號 |
Long | 64位, 有符號 |
Char | 16位, 無符號 |
Float | 32位, 單精度浮點數 |
Double | 64位, 雙精度浮點數 |
String | 由Char數組組成 |
與Java中的數據類型不同,Scala并不區分基本類型和引用類型,所以這些類型都是對象,可以調用相對應的方法。
其中,String直接使用的是java.lang.String. 不過,由于String實際是一系列Char的不可變的集合,Scala中大部分針對集合的操作,都可以用于String,具體來說,String的這些方法存在于類scala.collection.immutable.StringOps中。
由于String在需要時能隱式轉換為StringOps,因此不需要任何額外的轉換,String就可以使用這些方法。
每一種數據類型都有對應的Rich* 類型,如RichInt、RichChar等,為基本類型提供了更多的有用操作。
三、Scala類型層次結構
java的除了原始類型的所有類都有一個默認的父類Object,那么scala的統一父類是什么呢?
在Scala中,所有的值都有類型,包括數值和函數。
1、Any、AnyVal、AnyFloat
Any
是所有類型的超類型,也稱為頂級類 型。它定義了一些通用的方法如equals
、hashCode
和toString
。Any
有兩個直接子類:AnyVal
和AnyRef
。
AnyVal
代表值類型。有9個預定義的非空的值類型分別是:Double
、Float
、Long
、Int
、Short
、Byte
、Char
、Unit
和Boolean
。Unit
是不帶任何意義的值類型,它僅有一個實例可以像這樣聲明:()
。所有的函數必須有返回,所以說有時候Unit
也是有用的返回類型。
AnyRef
代表引用類型。所有非值類型都被定義為引用類型。在Scala中,每個用戶自定義的類型都是AnyRef
的子類型。如果Scala被應用在Java的運行環境中,AnyRef
相當于java.lang.Object
。
2、Nothing和Null
Nothing
是所有類型的子類型,也稱為底部類型。沒有一個值是Nothing
類型的。它的用途之一是給出非正常終止的信號,如拋出異常、程序退出或者一個無限循環(可以理解為它是一個不對值進行定義的表達式的類型,或者是一個不能正常返回的方法)。
Null
是所有引用類型的子類型(即AnyRef
的任意子類型)。它有一個單例值由關鍵字null
所定義。Null
主要是使得Scala滿足和其他JVM語言的互操作性,但是幾乎不應該在Scala代碼中使用。我們將在后面的章節中介紹null
的替代方案。
四、 option類型
Scala為單個值提供了對象的包裝器,表示為那種可能存在也可能不存在的值。他只有兩個有效的子類對象,一個是Some,表示某個值,另外一個是None,表示為空,通過Option的使用,避免了使用null、空字符串等方式來表示缺少某個值的做法。
如:
val map1 = Map("Alice" -> 20, "Bob" -> 30)
println(map1.get("Alice"))
println(map1.get("Jone"))
五、拓展——Scala中的加減乘除
"+-*/%"
可以完成和Java中相同的工作,但是有一點區別,他們都是方法。幾乎可以用任何符號來為方法命名。
Scala中沒有++、–操作符,需要通過+=、-=來實現同樣的效果。