我在理解这两者之间的区别时遇到了一些麻烦:
假设我们有:
String x = "Test";
String y = x;
y = "Not Test"; //x is not modified here
这两个步骤的存储器图如下:
但是,考虑带有字段'int var'的A类:
A a = new A();
A b = a;
b.var = 5;
在这里,如果我们修改b.var,a.var也会变为5.为什么这与字符串的上述情况不同?
此外,如果有人不介意为字符串和对象解释这些内存图,我将不胜感激。如果a和b是不同类的对象设置相等,结果会不同吗?谢谢。
答案 0 :(得分:2)
之间存在差异
b.var = 5;
和
b = new A();
第二个语句类似于您在第一个代码段中执行的操作,因为y = "Not Test";
使y
引用了一个新实例。
第一个语句更新a
和b
引用的实例的状态,因此两者都会受到影响。
这是一个显示第二个代码段的图表:
a -> object of class A <- b
containing an int
variable `var`
var <- 5
a.var
和b.var
都包含5,因为它们是相同的变量。
答案 1 :(得分:2)
由于String
为Immutable class,因此无法更改哪个类的州。虽然A
是可变的,因为您通过更改变量的值来更改它的状态。其次,a
和b
都引用相同的内存位置,一个的更改状态将反映在第二个内容中,但如果String
String
则不是这种情况。 } a
和b
Test
将a
更改为Test1
不会将Test
更改为Test1
,但会创建新的String
Test1
a
并将其分配给yii\web\DbSession
。
答案 2 :(得分:1)
在第二种情况下,他们都指向记忆中的同一个地方。
A a = new A(); a-->[MEMORY SPOT NR1]
A b = a; a-->[MEMORY SPOT NR1] AND b-->[MEMORY SPOT NR1]
b.var = 5; a-->[MEMORY SPOT NR1] AND b-->[MEMORY SPOT NR1]
and the value in var in [MEMORY SPOT NR1] is 5,
so both a.var and b.var take the value 5