1. 程式人生 > >scala-val物件例項化變數卻可以更改之深度解析(小白適用)

scala-val物件例項化變數卻可以更改之深度解析(小白適用)

類和物件可能都很熟悉了,這裡僅供小白參考,大神請虐過。一開始學的時候物件是類的藍圖,啥,藍圖,什麼鬼?我們直接看程式碼吧~

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 = 3csa.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

,換句話說,acc始終指向的是初始化時的ChecksumAccumulator物件,只能new生成這一個物件,而這個物件裡的例項化變數是可以更改的。

Ref: 1、Scala Programming