public static void main(String[] args) {
String a="aaa";
String b=a;
a = "3333";
System.out.println(b);
}
大家先猜一下出处的结果是"aaa"还是"3333"?
执行一下会发现结果为:
aaa
解释一下:
在这段Java代码中,首先创建了一个字符串变量 a
并赋值为 “aaa”,然后将变量 b
赋值为 a
,接着将变量 a
重新赋值为 “3333”。最后,打印变量 b
的值。
由于字符串是不可变的,在Java中对字符串进行操作时,实际上是创建了一个新的字符串对象。因此,尽管在赋值给 b
之后 a
的值发生了变化,但 b
仍然引用原始的字符串 “aaa”。
因此,这段代码的输出结果将是:
aaa
从Java内存模型的角度来解释这段代码,可以分析如下:
-
首先,创建了一个字符串对象 “aaa” 并将变量
a
指向该对象。 -
然后,将变量
b
指向了与a
相同的字符串对象 “aaa”。此时,a
和b
都指向同一个字符串对象。 -
接着,将变量
a
重新赋值为 “3333”。由于字符串是不可变的,这实际上是创建了一个新的字符串对象 “3333”,并将a
指向了这个新对象。但是,b
仍然指向原始的字符串对象 “aaa”。 -
最后,打印变量
b
。由于b
仍然指向 “aaa”,所以输出结果为 “aaa”。
在这个过程中,关键点在于字符串的不可变性以及变量 a
和 b
在不同时间指向了不同的字符串对象。这与Java内存模型中的字符串池和引用的概念相关。