String a = "test";
String b = a;
a = "wuut";
System.out.println(b);
Prints out test
Shouldn't b
hold refence of a
, not just take its value?
Doesn't Java work that way with objects and stuff?
b不应该持有a的引用,而不仅仅是取其值吗?
不。 的值a
是一个参考。引用是获取对象而不是变量的一种方式。赋值运算符只是将右侧表达式的值复制到左侧的变量中。这就是它所做的一切——它非常简单。Java 中没有传递引用,没有变量别名等。
何时a
创建可以说它指向memory_1
内存中的位置。
当b
分配给 时a
,则b
也指向同一个memory_1
位置。
现在,当a
更改值时(并且因为 String 对象是不可变的),现在在内存中创建一个新值,现在a
指向memory_2
.
但是,嘿,b
仍然指向memory_1
。
PS:不变性是:
在面向对象和函数式编程中,不可变对象是其状态在创建后无法修改的对象。
String a = test
指向堆上的字符串文字“测试”a
也是如此。Object Reference Variable
String b = a;
Nob
也Object Reference Variable
指向堆上相同的字符串文字“测试”。
现在,
a = "wuut";
但b
仍然指向String Literal "test",
所以它的 b 持有对之前也由 a 引用的 Object 的引用,但不是对 a 的引用。
不,它没有。b
假定的值。a
如果a
以后更改,b
则不会。它不是别名或任何类似性质的东西。
String a = "test";
现在 a 持有对字符串“test”的引用。
String b = a;
a 的值被复制到 b。A 是对“测试”的引用,所以现在 b 也是对“测试”的引用。
a = "wuut";
现在为 a 分配了对“wuut”的引用。这不会影响 b,因为 b 没有对 a 的引用。
No.b
保存的值a
是对字符串的引用"test"
。您正在考虑的是,如果您修改了 a 指向的字符串b
也会改变(类似于a.append("wuut");
)。但是不可能更改 Java 字符串,因为它们是不可变的。
让我们一步一步来。
String a = "test"
- 在该对象上创建对象"test"
和参考a
点。String b = a
b
-为同一对象创建新的参考点"test"
a = "wuut"
- 重新分配a
对另一个对象的引用,但引用b
仍然指向对象test