1.引用的本質(zhì)
比如示例代碼:
該代碼內(nèi)存及引用創(chuàng)建過程
(1)
Object obj=new Object();
在堆內(nèi)存創(chuàng)建object對象,對象地址為40f1。然后在棧內(nèi)存創(chuàng)建引用围小,引用也是有地址的昵骤,該地址所在堆內(nèi)存存儲的數(shù)據(jù)被賦予為40f1树碱,指向創(chuàng)建的object。
(2)
obj=new Object();
由于new關(guān)鍵字变秦,在堆內(nèi)存中創(chuàng)建新的object對象成榜,對象地址為40fb。然后把引用存儲的數(shù)據(jù)重新賦予為新的object地址
綜上可得:
2.引用傳遞的本質(zhì)
先看一段代碼:
注意:輸出結(jié)果為 :Hello而不是World
調(diào)用過程分析:
- (1)在棧內(nèi)存中為testString()分配一段內(nèi)存空間蹦玫,然后再在堆內(nèi)存中創(chuàng)建Holle字符串赎婚,地址為5A1c,接在來在棧內(nèi)存中穿件String類型的引用樱溉,值為5A1C挣输,指向holle字符串。
- (2)調(diào)用changeString函數(shù)福贞,然后為形參引用開辟內(nèi)存空間將實參的值傳遞給形參撩嚼,這樣形參的引用也指向了堆內(nèi)存中的Holle字符串。(注意在棧內(nèi)存中實參和形參兩個引用str的地址是不同的)
- (3)在堆內(nèi)存中為字符串“World”新開創(chuàng)內(nèi)存空間地址為5AB6挖帘,并把changeString函數(shù)中的形參引用str指向新的字符串完丽。此時形參str的值變?yōu)?AB5。
完成了changeString函數(shù)后拇舀,形參引用被棧內(nèi)存回收了逻族,響應(yīng)的指向也被回收了。Wolrd也因為沒有引用指向它骄崩,所以也會被響應(yīng)地被垃圾回收器回收掉聘鳞。
最后只有原來的引用還在所以打印結(jié)果為:Holle
其他引用類型傳遞以此類推:
例如:輸出結(jié)果AAA
總結(jié):
3.改變對象的值
另一種情況(輸出結(jié)果為BBB)
調(diào)用過程分析:
- (1)在棧內(nèi)存中為testPerson()分配一段內(nèi)存空間薄辅,然后再在堆內(nèi)存中創(chuàng)建person對象,地址為5B1c抠璃,同時也創(chuàng)建字符串類型對象name长搀,地址為5A8F,接在來在棧內(nèi)存中穿件person類型的引用P,值為5B1C鸡典,指向創(chuàng)建person對象源请。
-
(2)調(diào)用changePerson函數(shù),然后為形參引用開辟內(nèi)存空間將實參的值傳遞給形參彻况,這樣形參的引用p也指向了堆內(nèi)存中的Person對象谁尸。(注意在棧內(nèi)存中實參和形參兩個引用p的地址是不同的)
- (3)在堆內(nèi)存中為字符串“BBB”新開創(chuàng)內(nèi)存空間地址為5B46,并把changePerson函數(shù)中的形參引用str中的name引用指向新的字符串纽甘。person中name引用的值變?yōu)?B46良蛮,指向 。
完成了changePerson函數(shù)后悍赢,相應(yīng)的引用指向還在testPerson()方法里决瞳。所以并不會被垃圾回收器回收掉。
所以打印結(jié)果為:“BBB”
再另一種情況:
輸出結(jié)果仍舊為Holle
- (1)在棧內(nèi)存中為testString01()分配一段內(nèi)存空間左权,然后再在堆內(nèi)存中創(chuàng)建Holle字符串皮胡,地址為5A1c,接在來在棧內(nèi)存中穿件String類型的引用赏迟,值為5A1C屡贺,指向holle字符串。
- (2)調(diào)用changeString01函數(shù)锌杀,然后為形參引用開辟內(nèi)存空間將實參的值傳遞給形參甩栈,這樣形參的引用也指向了堆內(nèi)存中的Holle字符串。(注意在棧內(nèi)存中實參和形參兩個引用str的地址是不同的)
- (3)調(diào)用replaceall方法在堆內(nèi)存中為字符串“World”新開創(chuàng)內(nèi)存空間地址為5A39糕再,然而并沒有引用指向它量没。
完成了changeString01函數(shù)后,形參引用被棧內(nèi)存回收了突想,響應(yīng)的指向也被回收了殴蹄。Wolrd也因為沒有有引用指向它,所以也會被響應(yīng)地被垃圾回收器回收掉蒿柳。
最后只有原來的引用還在所以打印結(jié)果為:Holle
再看一個案例:
與上面例子不同的是:
str=str.replaceAll("Hello", "World");
在這里由于等于號的存在,將形參指向World饶套,形參值為5A39,changeString02完成后形參引用被回收,引用指向消失垒探,但對world的引用被函數(shù)返回了妓蛮,由于
str=changeString02(str);
的存在,TestString02中的str引用重新指向5A39圾叼,所以輸出為world