資源描述:
《130150ya-1214》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、Java對象及引用 Java對象及引用是容易混淆卻又必須掌握的基礎(chǔ)知識,本章闡述Java對象和引用的概念,以及與其密切相關(guān)的參數(shù)傳遞?! ∠瓤聪旅娴某绦颍篠tringBuffers;s=newStringBuffer(“HelloWorld!”); 第一個語句僅為引用(reference)分配了空間,而第二個語句則通過調(diào)用類(StringBuffer)的構(gòu)造函數(shù)StringBuffer(Stringstr)為類生成了一個實(shí)例(或稱為對象)。這兩個操作被完成后,對象的內(nèi)容則可通過s進(jìn)行訪問——在Java里都是通過引用來操縱對象的?! ava對象和
2、引用的關(guān)系可以說是互相關(guān)聯(lián),卻又彼此獨(dú)立。彼此獨(dú)立主要表現(xiàn)在:引用是可以改變的,它可以指向別的對象,譬如上面的s,你可以給它另外的對象,如:s=newStringBuffer(“Java”); 這樣一來,s就和它指向的第一個對象脫離關(guān)系?! 拇鎯臻g上來說,對象和引用也是獨(dú)立的,它們存儲在不同的地方,對象一般存儲在堆中,而引用存儲在速度更快的堆棧中?! ∫每梢灾赶虿煌膶ο螅瑢ο笠部梢员欢鄠€引用操縱,如:StringBuffers1=s; 這條語句使得s1和s指向同一個對象。既然兩個引用指向同一個對象,那么不管使用哪個引用操縱對象,對象的內(nèi)容
3、都發(fā)生改變,并且只有一份,通過s1和s得到的內(nèi)容自然也一樣,如下面的程序:StringBuffers;s=newStringBuffer(“Java”);StringBuffers1=s;s1.append(“World”);System.out.println(“s1=”+s1.toString());//打印結(jié)果為:s1=JavaWorldSystem.out.println(“s=”+s.toString());//打印結(jié)果為:s=JavaWorld 上面的程序表明,s1和s打印出來的內(nèi)容是一樣的,這樣的結(jié)果看起來讓人非常疑惑,但是仔細(xì)想想,
4、s1和s只是兩個引用,它們只是操縱桿而已,它們指向同一個對象,操縱的也是同一個對象,通過它們得到的是同一個對象的內(nèi)容。這就像汽車的剎車和油門,它們操縱的都是車速,假如汽車開始的速度是80,然后你踩了一次油門,汽車加速了,假如車速升到了120,然后你踩一下剎車,此時車速是從120開始下降的,假如下降到60,再踩一次油門,車速則從60開始上升,而不是從第一次踩油門后的120開始。也就是說車速同時受油門和剎車影響,它們的影響是累積起來的,而不是各自獨(dú)立(除非剎車和油門不在一輛車上)。所以,在上面的程序中,不管使用s1還是s操縱對象,它們對對象的影響也是累積
5、起來的(更多的引用同理)?! ≈挥欣斫饬藢ο蠛鸵玫年P(guān)系,才能理解參數(shù)傳遞?! ∫话忝嬖囶}中都會考Java傳參的問題,并且它的標(biāo)準(zhǔn)答案是Java只有一種參數(shù)傳遞方式:那就是按值傳遞,即Java中傳遞任何東西都是傳值。如果傳入方法的是基本類型的東西,你就得到此基本類型的一份拷貝。如果是傳遞引用,就得到引用的拷貝?! ∫话銇碚f,對于基本類型的傳遞,我們很容易理解,而對于對象,總讓人感覺是按引用傳遞,看下面的程序:publicclassObjectRef{//基本類型的參數(shù)傳遞publicstaticvoidtestBasicType(intm){Syst
6、em.out.println(“m=”+m);//m=50m=100;System.out.println(“m=”+m);//m=100}//參數(shù)為對象,不改變引用的值publicstaticvoidadd(StringBuffers){s.append(“_add”);}//參數(shù)為對象,改變引用的值publicstaticvoidchangeRef(StringBuffers){s=newStringBuffer(“Java”);}publicstaticvoidmain(String[]args){inti=50;testBasicType(i
7、);System.out.println(i);//i=50StringBuffersMain=newStringBuffer(“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
8、_add}}