Java 对象引用以及对象赋值
一、Vehicle veh1 = new Vehicle();
通常這條語句執行的動作被稱為創建一個對象,其實他包含了四個動作。
1.new Vehicle ?:表示在堆空間內創建了一個Vehicle類的對象。
2.():表示調用Vehicle的構造函數,初始化新創建的對象。
3.Vehicle veh1 :表示在棧空間內創建了一個Vehicle類的引用。
4. = :表示把棧空間的這個引用指向堆空間內的對象。
?
二、對象引用和對象之間的關系
我們可以把這條語句拆成兩部分:
Vehicle veh1;
veh1 = new Vehicle();
對象好比是一只很大的氣球,大到我們抓不住它。引用變量是一根繩, 可以用來系汽球。?如果只執行了第一條語句,還沒執行第二條,此時創建的引用變量veh1還沒指向任何一個對象,它的值是null。引用變量可以指向某個對象,或者為null。?它是一根繩,一根還沒有系上任何一個汽球的繩。執行了第二句后,一只新汽球做出來了,并被系在veh1這根繩上。我們抓住這根繩,就等于抓住了那只汽球。
?Vehicle veh2;
就又做了一根繩,還沒系上汽球。如果再加一句:
?veh2 = veh1;
系上了。這里,發生了復制行為。但是,要說明的是,對象本身并沒有被復制,被復制的只是對象引用。結果是,veh2也指向了veh1所指向的對象。兩根繩系的是同一只汽球。
如果用下句再創建一個對象:
veh2 = new Vehicle();
則引用變量veh2改指向第二個對象。
?從以上敘述再推演下去,我們可以獲得以下結論:
(1)一個對象引用可以指向0個或1個對象(一根繩子可以不系汽球,也可以系一個汽球);
(2)一個對象可以有N個引用指向它(可以有N條繩子系住一個汽球)。
???????如果再來下面語句:
?????? veh1 = veh2;
按上面的推斷,veh1也指向了第二個對象。這個沒問題。問題是第一個對象呢?沒有一條繩子系住它,它飛了。多數書里說,它被Java的垃圾回收機制回收了。
這不確切。正確地說,它已成為垃圾回收機制的處理對象。至于什么時候真正被回收,那要看垃圾回收機制的心情了。
?
三 例程分析
public class ObjectRef {//基本類型的參數傳遞public static void testBasicType(int m) {System.out.println("m=" + m);//m=50m = 100;System.out.println("m=" + m);//m=100}//參數為對象,不改變引用的值 ??????public static void add(StringBuffer s) {s.append("_add");}//參數為對象,改變引用的值 ?????public static void changeRef(StringBuffer s) {s = new StringBuffer("Java");}
public static void main(String[] args) {int i = 50;testBasicType(i);System.out.println(i);//i=50StringBuffer sMain = new StringBuffer("init");System.out.println("sMain=" + sMain.toString());//sMain=initadd(sMain);System.out.println("sMain=" + sMain.toString());//sMain=init_addchangeRef(sMain);System.out.println("sMain=" + sMain.toString());//sMain=init_add}}
add方法的參數是一個對象,當把sMain傳給參數s時,s得到的是sMain的拷貝,所以s和sMain指向同一個對象,因此,使用s操作影響的其實就是sMain指向的對象,故調用add方法后,sMain指向的對象的內容發生了改變。
??????在changeRef方法中,參數也是對象,當把sMain傳給參數s時,s得到的是sMain的拷貝,但與add方法不同的是,在方法體內改變了s指向的對象(也就是s指向了別的對象,牽著氣球的繩子換氣球了),給s重新賦值后,s與sMain已經毫無關聯,它和sMain指向了不同的對象,所以不管對s做什么操作,都不會影響sMain指向的對象,故調用changeRef方法前后sMain指向的對象內容并未發生改變。
? 對于add方法的調用結果,可能很多人會有這種感覺:這不明明是按引用傳遞嗎?對于這種問題,還是套用Bruce Eckel的話:這依賴于你如何看待引用,最終你會明白,這個爭論并沒那么重要。真正重要的是,你要理解,傳引用使得(調用者的)對象的修改變得不可預期。
?
參考原文:http://www.cnblogs.com/focusChen/articles/2497768.html
轉載于:https://www.cnblogs.com/lyr2015/p/6432170.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Java 对象引用以及对象赋值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA 设置忽略那些文件不提交到SVN
- 下一篇: spring配置druid连接池和监控数