7 回答

TA貢獻1820條經(jīng)驗 獲得超10個贊
String 是不可變的,所以你在函數(shù)體內(nèi)部做的改變不可能修改這個變量本身地址的值,而是在另一個地址新建了一個String 類型的變量,而你獲取不到這個新建的變量的地址,函數(shù)執(zhí)行完畢這個變量就可能會被回收。

TA貢獻1852條經(jīng)驗 獲得超1個贊
String str = "asd";
public static void change(String data){
data = "123";
}
可以這樣想,str是一個變量,指向內(nèi)存地址A。
當(dāng)調(diào)用 -change- 方法的時候,str將內(nèi)存地址A傳遞給變量data
在change方法內(nèi),進行賦值的時候,java會重新申請一塊內(nèi)存空間去存放數(shù)值 "123",內(nèi)存地址為B,并將data的內(nèi)存地址修改為B
方法執(zhí)行結(jié)束
注意方法外的變量str的指向的內(nèi)存地址A是沒有改變的,內(nèi)存地址A指向的值還是為"asd"。
下面舉個例子:
public class Main1 {
public static void main(String[] args) {
Demo demo = new Demo();
demo.i = 123;
System.out.println("方法外 : " + demo.hashCode());
change(demo);
System.out.println(demo.i);
change2(demo);
System.out.println(demo.i);
}
public static void change(Demo data) {
System.out.println("方法內(nèi)前 : " + data.hashCode());
data = new Demo();
System.out.println("方法內(nèi)后 : " + data.hashCode());
data.i = 321;
}
/*
* 這樣則是針對內(nèi)存地址的修改
*/
public static void change2(Demo data) {
data.i = 321;
System.out.println("方法內(nèi) : " + data.hashCode());
}
}
class Demo {
public int i;
}
結(jié)果:
方法外 : 366712642
方法內(nèi)前 : 366712642
方法內(nèi)后 : 1829164700
123
方法內(nèi) : 366712642
321
表達的不是太清楚。。。希望例子能表達清楚一些

TA貢獻1877條經(jīng)驗 獲得超1個贊
舉個栗子:
String str1 = "a";
String str2 = "a";
System.out.println(str1==str2); //true
str1 = "b";
System.out.println(str1 + "," + str2); //b,a
System.out.println(str1==str2); //false
現(xiàn)象:
賦值的變化導(dǎo)致了類對象引用的變化,str1指向了另外一個新對象!而str2仍舊指向原來的對象.當(dāng)我們改變str1的值的時候,JVM發(fā)現(xiàn)在棧中沒有存放該值的地址,便開辟了這個地址,并創(chuàng)建了一個新的對象,其字符串的值指向這個地址。
why?
String類被設(shè)計成為不可改變(immutable)的類。如果你要改變其值,那么JVM在運行時就會根據(jù)新值悄悄創(chuàng)建了一個新對象,然后將這個對象的地址返回給原來類的引用,這個創(chuàng)建過程雖說是完全自動進行的.
so:
我推斷,你打印出changeStr 方法中str改變后地址應(yīng)該不等于main中str的地址.
添加回答
舉報