类和对象可能都很熟悉了,这里仅供小白参考,大神请虐过。一开始学的时候对象是类的蓝图,啥,蓝图,什么鬼?我们直接看代码吧~
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: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