有了前面的Scala基礎(chǔ),從本篇開始由淺到易逐步介紹Scala編程的各個方面乏屯,博客不可能做到面面俱到漾月,還是希望你有些編程基礎(chǔ)病梢,尤其是有些面向?qū)ο蟮木幊袒A(chǔ),如Java梁肿,C++蜓陌,C#等更好。出支持函數(shù)化編程外吩蔑,Scala也是一個純面向?qū)ο蟮木幊陶Z言钮热。本篇和下篇介紹Scala的類和對象.
首先介紹Scala的類定義,我們以一個簡單的例子開始烛芬,創(chuàng)建一個計算整數(shù)累計校驗和的類ChecksumAccumulator
1
class ChecksumAccumulator{
2
private var sum=0
3
def add(b:Byte) :Unit = sum +=b
4
def checksum() : Int = ~ (sum & 0xFF) +1
5
}
可以看到Scala類定義和Java非常類似隧期,也是以class 開始痴奏,和Java不同的,Scala的缺省修飾符為public 厌秒,也就是如果不帶有訪問范圍的修飾符public,protected,private,Scala缺省定義為 public擅憔。類的方法以def定義開始鸵闪,要注意的Scala的方法的參數(shù)都是val類型,而不是var類型暑诸,因此在函數(shù)體內(nèi)不可以修改參數(shù)的值蚌讼,比如如果你修改add方法如下:
1
def add(b:Byte) :Unit ={
2
b=1
3
sum+=b
4
}
此時編譯器會報錯:
/root/scala/demo.scala:5: error: reassignment to val
b=1
^
one error found
類的方法分兩種,一種是有返回值的个榕,一種是不含返回值的篡石,沒有返回值的主要是利用代碼的“副作用”,比如修改類的成員變量的值或者讀寫文件等西采。Scala內(nèi)部其實將這種函數(shù)的返回值定為Unit(類同Java的void類型)凰萨,對于這種類型的方法,可以省略掉“=”好械馆,因此如果你希望函數(shù)返回某個值胖眷,但忘了方法定義中的“=”,Scala會忽略方法的返回值霹崎,而返回Unit珊搀。
再強調(diào)一下,Scala代碼無需使用“尾菇;”結(jié)尾境析,也不需要使用return返回值,函數(shù)的最后一行的值就作為函數(shù)的返回值派诬。
但如果你需要在一行中書寫多個語句劳淆,此時需要使用“;”隔開千埃,不過不建議這么做憔儿。你也可以把一條語句分成幾行書寫,Scala編譯器大部分情況下會推算出語句的結(jié)尾放可,不過這樣也不是一個好的編碼習(xí)慣谒臼。