7 回答

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

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
String str = "asd";
public static void change(String data){
data = "123";
}
可以這樣想,str是一個(gè)變量,指向內(nèi)存地址A。
當(dāng)調(diào)用 -change- 方法的時(shí)候,str將內(nèi)存地址A傳遞給變量data
在change方法內(nèi),進(jìn)行賦值的時(shí)候,java會重新申請一塊內(nèi)存空間去存放數(shù)值 "123",內(nèi)存地址為B,并將data的內(nèi)存地址修改為B
方法執(zhí)行結(jié)束
注意方法外的變量str的指向的內(nèi)存地址A是沒有改變的,內(nèi)存地址A指向的值還是為"asd"。
下面舉個(gè)例子:
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
表達(dá)的不是太清楚。。。希望例子能表達(dá)清楚一些

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
java調(diào)用方法時(shí)傳遞的是值類型,不是引用類型。話說你也可以把地址打出來瞧一瞧。

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