Scala循环引用样例类值更新疑问:未重赋值为何a的属性被修改?
为什么dummy样例类的a变量会被间接更新?
这是个非常典型的引用类型赋值问题,咱们一步步拆解清楚:
核心原因:Scala中对象是引用传递,不是值传递
当你在value()方法里写var b = a时,你并没有复制a指向的abc对象——而是让变量b和a指向内存中同一个abc实例。这就像你给同一扇门配了两把钥匙,不管用哪把钥匙开门/锁门,门的状态都会同步变化。
结合你的代码具体分析
- 初始化阶段:
val testObj = dummy(abc("Good", null)),此时dummy的a字段指向一个abc实例,这个实例的str是"Good",ele是null。 - 赋值
var b = a:b和a现在指向同一个abc对象,两者是同一个对象的"别名"。 - 修改
b.ele = newObj:你不是改变b的指向,而是修改b所指向的那个abc对象的可变字段ele。因为a和b指向同一个对象,所以a.ele自然会同步更新为新的abc实例。
关键区分:修改引用 vs 修改对象字段
如果是给b重新赋值(比如b = newObj),那a不会有任何变化——因为这时候是让b指向另一个全新的对象,而a仍然指向原来的abc实例。但你这里操作的是对象内部的可变字段,不是引用本身,所以会影响到所有指向该对象的变量。
额外建议:避免意外可变的小技巧
如果不想让abc的字段被意外修改,可以把ele改成不可变的val:
case class abc(str: String, ele: abc) // 去掉var,ele变成不可变字段
这样你就无法修改b.ele,自然也就不会出现a被间接更新的情况了。
内容的提问来源于stack exchange,提问作者Guda uma shanker
相关产品推荐
相关产品推荐

