函數 SWAP
若在學習Java之前有先碰過C 或C++ ,呼叫方法傳遞引數給參數時,有傳值(Call by value)或傳參考(Call by reference)的方式。
參考是什麼?
參考的概念很像指標,兩者同樣保存「存取某資料」的資訊(像指標中所指向的記憶體位址);但並不保存「該筆資料」本身。
指標是什麼?
指標就是記憶體「位址(address)」;記憶體位址就好像門牌號碼。那麼 Java 有指標嗎?本章將對這部分淺談,並舉範例。
Java 參數傳遞方式只有一種:傳值。
將實際參數值的複製品傳入方法(函數)中,而參數本身不會受到任何影響。
範例一
OUTPUT: swap函數中,a=9 ,b=6 交換後,a=6 ,b=9
從結果可以看出,main裡面的變數a和b,並不是swap方法裡面的a和b。也就是說swap方法的a和b只是main方法裡面a和b的複製品。
從main開始執行,定義了a、b兩個區域變數,當程式執行swap時,將main方法中的a、b變數作為參數值傳入swap,傳入swap的只是a和b的複製品,而不是a、b本身,進到swap後系統產生了4個變數,main 區域的a和b 以及 swap 區域 a和b。
程式分別為 main和swap分配兩個區塊,用來保存main和swap的區域變數。看似 main中的a、b變數值傳入swap,實際上是 swap 區域中重新產生了兩個變數a、b,並將main中的a、b 值給swap 中a、b參數
此時,系統存有兩個a 變數,兩個b變數,只是存在不同的函數區域中。
程式只是改變swap 中的a、b,而 main 中的a、b並沒有改變。這就是傳值。
範例二
OUTPUT: ch07.intswap@7852e922 swap,a=2 ,b=10 交換後,a=2 ,b=10 ch07.intswap@7852e922
從結果來看,swap 和main 中的a、b兩個值都被交換了。
程式從 main 開始執行,main 創建了intswap 物件,並定義sp 指向 intswap。
main 開始跑到swap函數時,main 尚未結束,系統會分別空出 main和swap兩個區域,用來存放main和swap的區域變數。
執行 swap函數時,同樣是傳值:把main裡sp的值 給swap裡的s。
main 的sp 是一個引用,保存了intswap 的地址,當把sp的值 給swap的s後,也會讓 swap 中的s 也保存這個地址,換句話說,也會引用到記憶體中的intswap。
當程式在swap 時,由於s只是一個引用變數,實際運作的還是記憶體中的intswap。
不管是操作main裡的sp,還是swap的s,都是執行他們所引用的 intswap。因此,當swap 中交換s 所引用的intswap 的a、b 時,可以看到 main方法中 sp 變量所引用的intswap 的a、b兩個值也被交換了。
Java 以id紀錄記憶體位址,從結果也可以發現兩者位址是相同的。
參考資料
Last updated