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:ChecksumAccumulator@256216b3,old_csa_address:ChecksumAccumulator@2a18f23c
old_acc_value:0,old_csa_value:0
new_acc_address:ChecksumAccumulator@256216b3,new_csa_address:ChecksumAccumulator@2a18f23c
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

猜你喜欢

转载自blog.csdn.net/woai8339/article/details/82814302