第12章 java傳遞與返回對象

第12章 java傳遞與返回對象

ID:20606207

大?。?42.00 KB

頁數(shù):34頁

時(shí)間:2018-10-14

第12章 java傳遞與返回對象_第1頁
第12章 java傳遞與返回對象_第2頁
第12章 java傳遞與返回對象_第3頁
第12章 java傳遞與返回對象_第4頁
第12章 java傳遞與返回對象_第5頁
資源描述:

《第12章 java傳遞與返回對象》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

1、本教程由yyc,spirit整理清風(fēng)小木蟲美化-----------------------清風(fēng)小木蟲精彩無極限--------------------------第12章傳遞和返回對象到目前為止,讀者應(yīng)對對象的“傳遞”有了一個較為深刻的認(rèn)識,記住實(shí)際傳遞的只是一個句柄。在許多程序設(shè)計(jì)語言中,我們可用語言的“普通”方式到處傳遞對象,而且大多數(shù)時(shí)候都不會遇到問題。但有些時(shí)候卻不得不采取一些非常做法,使得情況突然變得稍微復(fù)雜起來(在C++中則是變得非常復(fù)雜)。Java亦不例外,我們十分有必要準(zhǔn)確認(rèn)識在對象傳遞和賦值時(shí)所發(fā)生的一切。這正是本章的宗旨。若讀者是從某些特殊的程序設(shè)計(jì)環(huán)境中轉(zhuǎn)移過來的,那

2、么一般都會問到:“Java有指針嗎?”有些人認(rèn)為指針的操作很困難,而且十分危險(xiǎn),所以一廂情愿地認(rèn)為它沒有好處。同時(shí)由于Java有如此好的口碑,所以應(yīng)該很輕易地免除自己以前編程中的麻煩,其中不可能夾帶有指針這樣的“危險(xiǎn)品”。然而準(zhǔn)確地說,Java是有指針的!事實(shí)上,Java中每個對象(除基本數(shù)據(jù)類型以外)的標(biāo)識符都屬于指針的一種。但它們的使用受到了嚴(yán)格的限制和防范,不僅編譯器對它們有“戒心”,運(yùn)行期系統(tǒng)也不例外?;蛘邠Q從另一個角度說,Java有指針,但沒有傳統(tǒng)指針的麻煩。我曾一度將這種指針叫做“句柄”,但你可以把它想像成“安全指針”。和預(yù)備學(xué)校為學(xué)生提供的安全剪刀類似——除非特別有意,否則不會

3、傷著自己,只不過有時(shí)要慢慢來,要習(xí)慣一些沉悶的工作。12.1傳遞句柄將句柄傳遞進(jìn)入一個方法時(shí),指向的仍然是相同的對象。一個簡單的實(shí)驗(yàn)可以證明這一點(diǎn)(若執(zhí)行這個程序時(shí)有麻煩,請參考第3章3.1.2小節(jié)“賦值”)://:PassHandles.java//Passinghandlesaroundpackagec12;publicclassPassHandles{staticvoidf(PassHandlesh){System.out.println("hinsidef():"+h);}publicstaticvoidmain(String[]args){PassHandlesp=newPassH

4、andles();System.out.println("pinsidemain():"+p);f(p);}}///:~toString方法會在打印語句里自動調(diào)用,而PassHandles直接從Object繼承,沒有toString的重新定義。因此,這里會采用toString的Object版本,打印出對象的類,接著是那個對象所在的位置(不是句柄,而是對象的實(shí)際存儲位置)。輸出結(jié)果如下:pinsidemain():PassHandles@1653748hinsidef():PassHandles@1653748可以看到,無論p還是h引用的都是同一個對象。這比復(fù)制一個新的PassHandles對

5、象有效多了,使我們能將一個參數(shù)發(fā)給一個方法。但這樣做也帶來了另一個重要的問題。12.1.1別名問題“別名”意味著多個句柄都試圖指向同一個對象,就象前面的例子展示的那樣。若有人向那個對象里寫入一點(diǎn)什么東西,就會產(chǎn)生別名問題。若其他句柄的所有者不希望那個對象改變,恐怕就要失望了。這可用下面這個簡單的例子說明://:Alias1.java//AliasingtwohandlestooneobjectpublicclassAlias1{inti;Alias1(intii){i=ii;}publicstaticvoidmain(String[]args){Alias1x=newAlias1(7);Al

6、ias1y=x;//AssignthehandleSystem.out.println("x:"+x.i);System.out.println("y:"+y.i);System.out.println("Incrementingx");x.i++;System.out.println("x:"+x.i);System.out.println("y:"+y.i);}}///:~對下面這行:Alias1y=x;//Assignthehandle它會新建一個Alias1句柄,但不是把它分配給由new創(chuàng)建的一個新鮮對象,而是分配給一個現(xiàn)有的句柄。所以句柄x的內(nèi)容——即對象x指向的地址——被分配給y

7、,所以無論x還是y都與相同的對象連接起來。這樣一來,一旦x的i在下述語句中增值:x.i++;y的i值也必然受到影響。從最終的輸出就可以看出:x:7y:7Incrementingxx:8y:8此時(shí)最直接的一個解決辦法就是干脆不這樣做:不要有意將多個句柄指向同一個作用域內(nèi)的同一個對象。這樣做可使代碼更易理解和調(diào)試。然而,一旦準(zhǔn)備將句柄作為一個自變量或參數(shù)傳遞——這是Java設(shè)想的正常方法——別名問題就會自動出現(xiàn),

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時(shí)可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。