第二章:簡單 Java 程式解析
第三章:變數與資料型態
第四章:運算子、運算式與敘述
第五章:選擇性敘述與迴圈
第十章:實例變數與函數、類別變數與函數

函數 SWAP

若在學習Java之前有先碰過C 或C++ ,呼叫方法傳遞引數給參數時,有傳值(Call by value)或傳參考(Call by reference)的方式。

參考是什麼?

參考的概念很像指標,兩者同樣保存「存取某資料」的資訊(像指標中所指向的記憶體位址);但並不保存「該筆資料」本身。

指標是什麼?

指標就是記憶體「位址(address)」;記憶體位址就好像門牌號碼。那麼 Java 有指標嗎?本章將對這部分淺談,並舉範例。

Java 參數傳遞方式只有一種:傳值。

將實際參數值的複製品傳入方法(函數)中,而參數本身不會受到任何影響。

範例一

public class swap_ex {
public static void main(String args[]){
int a=6;
int b=9;
swap(a,b);
System.out.println("交換後,a="+a+" ,b="+b);
}
public static void swap(int a,int b){
int temp=a;
a=b;
b=temp;
System.out.println("swap函數中,a="+a+" ,b="+b);
}

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並沒有改變。這就是傳值。

範例二

class intswap{
public int a;
public int b;
}
public class swap_ex2 {
public static void main(String[] args) {
intswap sp=new intswap();
sp.a=10;
sp.b=2;
swap(sp);
System.out.println("交換後,a="+sp.a+" ,b="+sp.b);
System.out.println(sp);
}
public static void swap(intswap s){
int tmp=s.a;
s.a=s.b;
s.b=tmp;
System.out.println(s);
System.out.println("swap,a="+s.a+" ,b="+s.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紀錄記憶體位址,從結果也可以發現兩者位址是相同的。

參考資料