前言
網(wǎng)上看的這篇博文把Java的參數(shù)傳遞已經(jīng)講得很清楚了。我用一道比較繞的題來(lái)理解一下String的參數(shù)傳遞。
public class Demo {
String str = new String("hello");
char[] ch = {'a', 'b', 'c'};
public void fun(String str, char ch[]) {
str = "world";
ch[0] = 'd';
}
public static void main(String[] args) {
Demo test = new Demo();
test.fun(test.str, test.ch);
System.out.print(test.str + " and ");
System.out.print(test.ch);
}
}
這道題的結(jié)果輸出“hello and dbc".
分析與解答
對(duì)象test調(diào)用fun方法,將實(shí)參test.str(全局變量str存放對(duì)象"hello"的內(nèi)存地址)和test.ch(全局變量ch存放字符數(shù)組對(duì)象的內(nèi)存地址),傳給fun方法的形參str引用和ch[]引用。
參數(shù)傳遞相當(dāng)于
String str = "hello"
组哩,局部變量str存放對(duì)象"hello"的內(nèi)存地址。我們知道String是final類(lèi)型处渣。所以語(yǔ)句str = "world"
;的含義:將在堆中重新分配一個(gè)內(nèi)存空間存放"world"伶贰,局部變量str指向"world"。局部變量str的生命周期和方法相同罐栈,只是名稱(chēng)和全局變量str相同黍衙。注意!即使此處局部變量即使不是String類(lèi)型荠诬,而是基本數(shù)據(jù)類(lèi)型琅翻,局部變量也不會(huì)影響同名的全局變量。
以上兩步操作在JVM中如下圖所示柑贞,內(nèi)存地址為假設(shè)方椎。
- char ch[]與char[] ch等價(jià)。語(yǔ)句
ch[0] = 'd';
將替換字符數(shù)組對(duì)象中下標(biāo)為0的字符钧嘶,即改變了對(duì)象的內(nèi)容棠众。test.str沒(méi)有改變,還是"hello"有决,test.ch從"abc"改為"dbc"闸拿。
IDEA調(diào)試圖如下:
拓展
Book a == new Book();//對(duì)象1
Book b == new Book();//對(duì)象2
b = a;
問(wèn):那個(gè)對(duì)象會(huì)被回收空盼?
答:對(duì)象2,因?yàn)閷⒁胊中存放對(duì)象1的地址賦值給了引用b新荤,所以引用b將“指向”對(duì)象1揽趾,對(duì)象2將被回收。
總結(jié)
從String的參數(shù)傳遞可以看出迟隅,String的參數(shù)傳遞是對(duì)象地址值傳遞但骨,所以String的參數(shù)傳遞是值傳遞励七。