我已经累了,但我想知道是否(参见主题)。
String a = "first";
String b = "second";
a = b;
b = "third";
System.out.println(a + ", " + b);
-my问题是我得到输出的原因:“第二,第三”。是不是String引用类型?所以在命令“a = b;”之后为什么没有改变这两个变量?两个变量都不是引用同一个对象吗? (或字符串池中的相同字符串?)
答案 0 :(得分:0)
Isn&#t; t是String引用类型?
是,String是引用类型。
所以在命令之后" a = b;"为什么没有改变这两个变量?
因为您只是说要一次更改一个变量的值。
本声明:
b = "third";
仅更改b
的值。它将其更改为引用不同的字符串。 a
的值保持原样 - 对包含内容的字符串的引用" second"。
区分这些概念非常重要:
当你写:
a = b;
这仅表示"取b
的当前值,并将其设为a
的新值。"它不说" make a
和b
等价变量,这样任何一个变量值的变化都会影响另一个变量" 。当您更改下一行中b
的值以引用其他对象时, <{1}}或a
的值<{1}} }指的是。
现在我怀疑你因为这样的代码而感到困惑:
a
在这种情况下,StringBuilder a = new StringBuilder();
StringBuilder b = a;
a.append("foo");
System.out.println(b); // Prints foo
调用根本不会更改a.append()
或a
的值 ...两个变量仍然具有值它引用相同的b
对象。相反,StringBuilder
方法会更改该对象中的数据...因此,当您在最后一行打印对象的内容时,通过append
获取该内容时,您仍会看到b
,因为你还在指同一个(修改过的)对象。
答案 1 :(得分:0)
参考类型的所以在命令之后&#34; a = b;&#34;为什么没有改变这两个变量?
变量&#34;参考&#34; 物体。也就是说,引用变量包含引用值。 (参考值可以被认为是不透明的数字或句柄,以便它唯一地标识一个对象。)
但是,变量是不是引用(在&#34;别名/ C ++&#34;意义上)本身,并且每个变量都包含一个独立但可能重复的值。因此,赋值仅影响 - 如同,将新的[reference]值赋值给特定的变量,同时将值保留在所有其他变量中。
答案 2 :(得分:0)
是的,a
和b
都在a=b
之后引用了池中的相同字符串:
String pool
"first"
[a] -------> "second"
^
[b] ------------| "third"
但是,b
的重新分配不会影响a
中存储的引用,因为它们是两个不同的局部变量,可以引用不同的(永远不变的)字符串。你会看到:
String pool
"first"
[a] -------> "second"
[b] -------> "third"