2
    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?

4

7 回答 7

5

b不应该持有a的引用,而不仅仅是取其值吗?

不。 的值a 一个参考。引用是获取对象而不是变量的一种方式。赋值运算符只是将右侧表达式的值复制到左侧的变量中。这就是它所做的一切——它非常简单。Java 中没有传递引用,没有变量别名等。

于 2012-10-05T06:29:06.317 回答
2

何时a创建可以说它指向memory_1内存中的位置。

b分配给 时a,则b也指向同一个memory_1位置。

现在,当a更改值时(并且因为 String 对象是不可变的),现在在内存中创建一个新值,现在a指向memory_2.

但是,嘿,b仍然指向memory_1

PS:不变性是:

在面向对象和函数式编程中,不可变对象是其状态在创建后无法修改的对象。

于 2012-10-05T06:33:17.713 回答
1
String a = test

指向堆上的字符串文字“测试”a也是如此。Object Reference Variable

String b = a;

NobObject Reference Variable指向堆上相同的字符串文字“测试”

现在,

a = "wuut";

b仍然指向String Literal "test"

所以它的 b 持有对之前也由 a 引用的 Object 的引用,但不是对 a 的引用。

于 2012-10-05T06:28:04.433 回答
0

不,它没有。b假定的a如果a以后更改,b则不会。它不是别名或任何类似性质的东西。

于 2012-10-05T06:28:09.503 回答
0
String a = "test";

现在 a 持有对字符串“test”的引用。

String b = a;

a 的值被复制到 b。A 是对“测试”的引用,所以现在 b 也是对“测试”的引用。

a = "wuut";

现在为 a 分配了对“wuut”的引用。这不会影响 b,因为 b 没有对 a 的引用。

于 2012-10-05T06:28:48.193 回答
0

No.b保存的值a是对字符串的引用"test"。您正在考虑的是,如果您修改了 a 指向的字符串b也会改变(类似于a.append("wuut");)。但是不可能更改 Java 字符串,因为它们是不可变的。

于 2012-10-05T06:30:17.287 回答
0

让我们一步一步来。

  1. String a = "test"- 在该对象上创建对象"test"和参考a点。
  2. String b = ab-为同一对象创建新的参考点"test"
  3. a = "wuut"- 重新分配a对另一个对象的引用,但引用b仍然指向对象test
于 2012-10-05T06:30:29.127 回答