?>本文同步自微信公眾號:浮世Talk(ID:fausai_talk)
寫完經(jīng)典的Hello World程序之后闽撤,我們就要學習變量的用法了凌埂,這是學習任何編程語言都繞不開的話題舷蒲。
變量這個詞來源于數(shù)學罐韩,在計算機語言中,變量是基本的組成單位州弟,基于變量的數(shù)據(jù)類型,操作系統(tǒng)把對應類型的數(shù)據(jù)存儲到內(nèi)存中,然后可以根據(jù)變量名對該內(nèi)存的數(shù)據(jù)進行訪問诈豌。
1,var & val
在Scala中抒和,我們可以用關(guān)鍵詞var或者val進行變量定義矫渔,其中var是可變的,val是不可變的摧莽,如下所示:
var name: String = "Gavin" //名字
val gender: String = "男" //性別
var age: Int = 18 //年齡
println(s"姓名:$name, 性別:$gender, 年齡:$age") //格式化輸出
Scala聲明變量的語法為:var | val 變量名 [: 變量類型] = 變量值 庙洼,并且需要在聲明時必須給一個初始值,否則編譯不通過,其中變量類型名是可以省略的油够,Scala具有類型推斷能力蚁袭,可以自動推斷出變量的類型,以上代碼還可以寫成這樣:
var name = "Gavin" //名字
val gender = "男" //性別
var age = 18 //年齡
我們看到程序中是用val來聲明性別變量石咬,用var來聲明年齡變量揩悄,由于val表示的變量不可變,而var可變鬼悠,所以在該代碼中删性,年齡的值可以更改,性別的值不可更改:
//gender = "女" //報錯焕窝,因為val不可變
age = 19
2蹬挺,Scala數(shù)據(jù)類型體系
Scala與java有著相同的數(shù)據(jù)類型,但是在Scala中它掂,一切皆為對象巴帮,因此Scala中的數(shù)據(jù)類型比java復雜,它分為兩大類群发,分別是AnyVal(值類型)和AnyRef(引用類型)晰韵。
從上圖看到,Scala中基本類型都繼承自AnyVal熟妓,而AnyVal和AnyRef又繼承自統(tǒng)一的Any雪猪,此外Scala還定義了兩個特殊的底層類Null和Nothing,Null只有一個null值起愈,是所有AnyRef類型的子類只恨,而Nothing可以作為沒有正常返回值的方法的返回類型,是所有類型的子類抬虽。
整數(shù)類型
Scala的整數(shù)類型用于存放整數(shù)值官觅,比如 5、18阐污、96休涤、167等等,根據(jù)長度不同整數(shù)類型又劃分出四種類型:
Scala各整數(shù)類型有固定的表示范圍和字段長度笛辟,不受具體操作系統(tǒng)的影響功氨,以保證Scala程序的可移植性,在程序中定義一個整型變量手幢,如果沒有指定捷凄,默認為Int類型,如果要定義Long類型围来,需要在后面加上“l(fā)”或者“L”跺涤,推薦用“L”匈睁。如果定義一個整數(shù)超過了Int類型最大值,而不在后面加上“L”桶错,編譯會報錯航唆,這時需要加上“L”。
val num1 = 666 // 默認num1為Int類型
val num2 = 18L // 加上L指定num2為Long類型
val intMax = Int.MaxValue
val MinValue = Int.MinValue
println(s"Int類型最大值為:$intMax牛曹,最小值為:$MinValue")
//val num3 = 21474836470 // 超出了Int范圍佛点,報錯
浮點類型
Scala的浮點類型可以表示一個小數(shù),比如 3.14f黎比、7.8 超营、0.168等等,根據(jù)長度不同浮點類型又劃分出兩種類型:
與整數(shù)類型類似阅虫,Scala 浮點類型也有固定的表數(shù)范圍和字段長度演闭,不受具體操作系統(tǒng)的影響。Scala的浮點型常量默認為Double型颓帝,聲明Float型常量米碰,須后加“f”或“F”。通常情況下购城,應該使用Double型吕座,因為它比Float型更精確(小數(shù)點后大致7位)。
val num1 = 3.14 //scala類型推斷
val num2: Float = 1.1f //
val num3: Double = 1.3 //
//val num4: Float = 1.4 // 沒加f默認為double
字符類型
字符類型可以表示單個字符瘪板,字符類型是Char吴趴,16位無符號Unicode字符(2個字節(jié)), 區(qū)間值為 U+0000 到 U+FFFF侮攀。字符常量是用單引號(' ')括起來的單個字符锣枝,在Scala中允許使用轉(zhuǎn)義字符''來將其后的字符轉(zhuǎn)變?yōu)樘厥庾址统A浚灰部梢灾苯咏oChar賦一個整數(shù)兰英,然后輸出時撇叁,會按照對應的unicode碼;還可以進行運算的畦贸,相當于一個整數(shù)陨闹,因為它都對應有Unicode碼。
val a1: Char = 'a'
val a2: Char = '\t'
val a3: Char = '牛'
val a4: Char = 97
val b1: Char = '\\'
val b2: Char = '\t'
val b3: Char = '\''
val b4: Char = '\"'
val c1: Char = '愛'
val c2: Int = c1.toInt
val c3: Char = 39547 //直接給c4一個碼值薄坏,默認輸出對應的字符
布爾類型
布爾類型也叫Boolean類型正林,在Scala中,Boolean類型數(shù)據(jù)只允許取值true和false颤殴,占1個字節(jié)。Boolean類型在程序中的作用一般是和邏輯運算結(jié)合在一起鼻忠。
val t: Boolean = true
val f: Boolean = false
println(t)
println(f)
// var b1: Boolean = 0 //錯,不能使用數(shù)字
// var b2: Boolean = null //錯,不能使用null 運行就會報錯
String字符串類型
Scala本身沒有String類涵但,它的字符串的類型實際上是java.lang.String杈绸,因此和Java中的一樣,String是一個不可變的對象矮瘟,所以該對象不可被修改瞳脓。這就意味著你如果修改字符串就會產(chǎn)生一個新的字符串對象。
Unit類型澈侠、Null類型和Nothing類型
Unit類型用來標識過程劫侧,也就是沒有明確返回值的函數(shù),由此可見哨啃,Unit類似于Java里的void烧栋。Unit只有一個實例:(),這個實例也沒有實質(zhì)的意義拳球。
def main(args: Array[String]): Unit = {
val r = returnUnit() //調(diào)用returnUnit方法审姓,沒有參數(shù)傳遞,可以簡寫為returnUnit
println(s"returnUnit方法返回:$r")
}
def returnUnit(): Unit ={
println("沒返回值祝峻,只是打印")
}
Null類只有一個實例對象:null魔吐,類似于Java中的null引用。null可以賦值給任意引用類型(AnyRef)莱找,但是不能賦值給值類型(AnyVal: 比如 Int酬姆, Float,Char奥溺, Boolean辞色,Long,Double谚赎,Byte淫僻,Short)。
class Baby {}
var b: Baby = null // b 是引用類型
//var c: Char = null //錯誤 [Int壶唤, Float雳灵,Char等等都不行]
Nothing,可以作為沒有正常返回值的方法的返回類型闸盔,非常直觀的告訴你這個方法不會正常返回悯辙,而且由于Nothing是其他任意類型的子類,在開發(fā)中可以將Nothing返回給任意變量或函數(shù)迎吵,在拋出異常方面應用較多躲撰。
def returnNothing(): Nothing = {
throw new Exception("異常拋出")
}
以上代碼已經(jīng)共享到GitHub,各位朋友可以點擊閱讀原文訪問GitHub獲取代碼击费。
- THE END -
擴展閱讀:
Scala系列|了不起的Martin Odersky
Scala系列|寫Hello World之前需要準備什么
擴展練習:
Scala類型間的轉(zhuǎn)換有什么規(guī)律嗎拢蛋?