scala-val物件例項化變數卻可以更改之深度解析(小白適用)
阿新 • • 發佈:2018-12-11
類和物件可能都很熟悉了,這裡僅供小白參考,大神請虐過。一開始學的時候物件是類的藍圖,啥,藍圖,什麼鬼?我們直接看程式碼吧~
import scala.io.Source
class ChecksumAccumulator(){
var sum = 0
}
val acc = new ChecksumAccumulator
var csa = new ChecksumAccumulator
這段程式碼中,我們定義了一個叫ChecksumAccumulator
的class,我們從這個類當中新建了兩個物件,這個過程就可以看成是藍圖的解釋,例項化的過程,通過new
來實現。這兩個物件同時指向ChecksumAccumulator
sum
欄位。具體可以看下圖:
同時,我們需要深刻理解下val和var,對於csa來說,沒有問題,因為是var所以我們可以重新賦值。對於acc是不是說一定不能重新賦值了?答案是,,,我們把acc.sum = 3
、csa.sum=4
執行看看。
import scala.io.Source class ChecksumAccumulator(){ var sum = 0 } object P12{ def main(args: Array[String]): Unit = { val acc = new ChecksumAccumulator var csa = new ChecksumAccumulator println(s"old_acc_address:${acc},old_csa_address:${csa}") println(s"old_acc_value:${acc.sum},old_csa_value:${csa.sum}") acc.sum = 3 csa.sum = 4 println(s"new_acc_address:${acc},new_csa_address:${csa}") println(s"new_acc_value:${acc.sum},new_csa_value:${csa.sum}") } }
我們的輸出是:
old_acc_address:[email protected],old_csa_address:[email protected]
old_acc_value:0,old_csa_value:0
new_acc_address:[email protected],new_csa_address:[email protected]
new_acc_value:3,new_csa_value:4
Process finished with exit code 0
咦,val
也變了,其實並不是val
也可以賦值,我們回頭看val怎麼定義的,我們定義val acc = new ChecksumAccumulator
ChecksumAccumulator
物件,只能new生成這一個物件,而這個物件裡的例項化變數是可以更改的。
Ref: 1、Scala Programming