精華區beta java 關於我們 聯絡資訊
※ 引述《windincloud (雲淡風輕)》之銘言: : 好奇~ 有always嗎? : 只是預設為call by value吧~ : 寫程式時也可以用referance~ : 原句應該改usually較好吧~ Java 真的只有 call by value 以下轉錄一篇以前寫的文章 --- 不管是在 C++ 還是 JAVA,時常會出現 reference 這個名詞,特性與 pointer 有些類似,那其中的 差別到底在哪呢? 其一是安全性。pointer 可以用加減法指向其他記 憶體位址(例如 *(pa+1) ),而在 reference 中這 是不被允許的。另外像是型別檢查,pointer 無法 動態的檢查所指向的位址是否為對應的型態,同樣 的,在reference 中,這類問題也不會發生。 其二就是易用性。使用 reference 較 pointer 來 得直覺且方便,不需要加上繁雜的指標運算子。 而在實做上,其實 reference 骨子裡仍然是透過 pointer 達成目的,只是 compiler 將它包裝起來 ,讓使用者看起來似乎是直接操作物件。 接下來是兩個迷思,為什麼有人說 "java 沒有 pass by reference" 以及 "c++ 沒有 pass by address (pointer)"? 其實這兩者是相同的問題。 在 java 中,所有的物件變數都是 reference,而 在傳遞物件時,其實只是將 reference 所指向的 位址,複製到 formal parameter。所以對變數本 身而言,其實這只是 pass by value 而已。 同樣的,在 c++ 中傳遞 pointer 時,對於指標本 身,也只是將位址複製給 formal parameter 罷了。 不過對於這兩句話,我個人卻有一點不同的看法。 對於變數本身來說,確實只是 pass by value,但 是之所以傳遞 reference 或著 pointer,目的也 都是為了操作物件。而以物件的角度來看,這樣傳 遞參數的方式,確實是符合 pass by reference 或著 pass by address 的特性。所以個人認為, 不太需要拘泥於 "沒有 pass by address" 這種說 詞。 --- 有錯請指正 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.131.68.145 > -------------------------------------------------------------------------- < 作者: godfat (godfat 真常) 看板: java 標題: Re: [問題] 一個很簡單程式問題 時間: Mon Mar 27 14:04:17 2006 ※ 引述《tkcn (小安)》之銘言: : --- : 不管是在 C++ 還是 JAVA,時常會出現 reference : 這個名詞,特性與 pointer 有些類似,那其中的 : 差別到底在哪呢? 其實這有點像是文字遊戲的問題, 因為在 C++ 中所指的 reference 和在 Java 中所指的 reference 其實意思不太一樣。就我的觀念上,事實上 Java 的 reference type 就是一種閹割過的 pointer, 他缺乏的是運算能力, 例如對指標做某 offset 的運算,但是其他方面幾乎都跟 pointer 是指同一件事了。Java 可以這樣寫:Something s = null; 但是 C++ reference 可不能夠是 null, 因為 C++ 的 reference 其實是一種 alias, 你沒有辦法對 null 做 alias, 這是不被允許的。 : 其一是安全性。pointer 可以用加減法指向其他記 : 憶體位址(例如 *(pa+1) ),而在 reference 中這 : 是不被允許的。另外像是型別檢查,pointer 無法 : 動態的檢查所指向的位址是否為對應的型態,同樣 : 的,在reference 中,這類問題也不會發生。 可以吧?不然 RTTI 是怎麼來的? typeid 和 dynamic_cast<> 就是為此誕生的, 雖然我覺得這兩個東西用處都不大。 因為一般而言設計上都會避免使用 RTTI (error-prone, 還有 overhead 很大) : 其二就是易用性。使用 reference 較 pointer 來 : 得直覺且方便,不需要加上繁雜的指標運算子。 : 而在實做上,其實 reference 骨子裡仍然是透過 : pointer 達成目的,只是 compiler 將它包裝起來 : ,讓使用者看起來似乎是直接操作物件。 : 接下來是兩個迷思,為什麼有人說 : "java 沒有 pass by reference" 以及 : "c++ 沒有 pass by address (pointer)"? 誰說 C++ 沒有 pass by pointer??? 基本上在 C 裡面就是一直在用 pass by pointer, 只是在 C++ 中 pass by reference 比較方便, 所以 pass by pointer 變得很少使用。 但是有些時候還是得用 pass by pointer, 因為兩者還是有很多差異,有時候就是會有限制。 : 其實這兩者是相同的問題。 : 在 java 中,所有的物件變數都是 reference,而 : 在傳遞物件時,其實只是將 reference 所指向的 : 位址,複製到 formal parameter。所以對變數本 : 身而言,其實這只是 pass by value 而已。 : 同樣的,在 c++ 中傳遞 pointer 時,對於指標本 : 身,也只是將位址複製給 formal parameter 罷了。 對,這不就是 pass by pointer 了? C++ 另外還有 pass by reference, 那就是產生一個 alias, Java 中沒有這種東西。 所以 Java always pass by value. : 不過對於這兩句話,我個人卻有一點不同的看法。 : 對於變數本身來說,確實只是 pass by value,但 : 是之所以傳遞 reference 或著 pointer,目的也 : 都是為了操作物件。而以物件的角度來看,這樣傳 : 遞參數的方式,確實是符合 pass by reference : 或著 pass by address 的特性。所以個人認為, : 不太需要拘泥於 "沒有 pass by address" 這種說 : 詞。 這邊其實有名詞上的問題… 台灣的書很喜歡這樣寫: 1. pass by value 2. pass by address 3. pass by reference 但是其實在國外,pass by address 幾乎是 pass by reference 的同義字。也就是說,他們都算是一種 alias. 丟 pointer 這件事,其實根本就是 pass by value. 所以嚴格來說 C++ 只有兩種呼叫法,by value 或 by reference 而 Java 則是只有 by value, 沒有 by reference. (我想是因為 alias 其實是一種危險的行為,所以 Java 不提供) 而這個 by value, 同時 always 指 C++ 的 by pointer, 差別在於沒有指標運算能力,也沒有繁複多餘的語法。 說真的,不要太拘泥名詞,因為每個人對這些名詞定義都不太一樣… 重點是觀念要搞清楚,不要被混淆了 參考頁面: http://en.wikipedia.org/wiki/Evaluation_strategy C++ 之所以難學又強大,就是因為他有很多特性, 這些其實都是兩面刃,用得好就是強,用得差就是完蛋 : --- : 有錯請指正 一點想法 -- By Gamers, For Gamers - from the past Interplay -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.210.113 > -------------------------------------------------------------------------- < 作者: cplusplus (C++) 看板: java 標題: Re: [問題] 一個很簡單程式問題 時間: Mon Mar 27 15:02:45 2006 萬年爭論題 很多人爭來爭去 沒什麽意義 好像久久就要爭一次吧 基本上沒什麽好爭的 就只是名字不同 實際上一樣 每次看到不管是哪邊爭論這個問題爭到筆戰 就很無奈啊 不管怎樣傳參數 都需要記憶體空間放參數數吧 這應該無法否定吧? reference是啥? 簡單說只是一個pointer 它的能力跟他本身是reference並沒有關係 好處限制或啥的都是java compiler跟語言本身的限定 其實本質上只是pointer 你不能對他操作 只是compiler不準 java不給 不能改變實際上它還是pointer的本質 轉型時會檢查? 那也是用指標指到物件在偷過type info來檢查 也跟他本身無關呀 再怎麼說 它只是個記憶體空間 只是看你利用什麽方式處理 pointer是啥? 不就是一個變數 一塊記憶體空間 裡頭存的是個值 我們當他是個記憶體 的位址 這應該也沒問題吧 可以操作它 當然也因為它只是個值 想幹嘛就幹嘛 加減乘除樣樣行 只是有沒有邏輯意義 傳參數 不就把這些reference跟pointer底層的值 copy到stack的空間上嗎? 這不就只是copy記憶體的值 搬來搬去罷了...底層就只是copy by value(值呀) 像tkcn說的 只是傳reference 就稱為call by reference 傳pointer就叫做 call by pointer 傳其他東西就叫做call by value 我想不透 那些人強力維護這些名字 甚至得到筆戰的地步 o_o 唉... 那我以後傳整數型態我也可以說call by intergral :D 小小抒發~~ 不適合究刪吧 呼~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.217.14