第二章:簡單 Java 程式解析
第三章:變數與資料型態
第四章:運算子、運算式與敘述
第五章:選擇性敘述與迴圈
第十章:實例變數與函數、類別變數與函數
Powered By GitBook
函數 SWAP
若在學習Java之前有先碰過C 或C++ ,呼叫方法傳遞引數給參數時,有傳值(Call by value)或傳參考(Call by reference)的方式。
參考是什麼?
參考的概念很像指標,兩者同樣保存「存取某資料」的資訊(像指標中所指向的記憶體位址);但並不保存「該筆資料」本身。
指標是什麼?
指標就是記憶體「位址(address)」;記憶體位址就好像門牌號碼。那麼 Java 有指標嗎?本章將對這部分淺談,並舉範例。
Java 參數傳遞方式只有一種:傳值。
將實際參數值的複製品傳入方法(函數)中,而參數本身不會受到任何影響。

範例一

1
public class swap_ex {
2
public static void main(String args[]){
3
int a=6;
4
int b=9;
5
swap(a,b);
6
System.out.println("交換後,a="+a+" ,b="+b);
7
}
8
9
public static void swap(int a,int b){
10
int temp=a;
11
a=b;
12
b=temp;
13
System.out.println("swap函數中,a="+a+" ,b="+b);
14
}
Copied!
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並沒有改變。這就是傳值。

範例二

1
class intswap{
2
public int a;
3
public int b;
4
}
5
6
public class swap_ex2 {
7
public static void main(String[] args) {
8
intswap sp=new intswap();
9
sp.a=10;
10
sp.b=2;
11
swap(sp);
12
System.out.println("交換後,a="+sp.a+" ,b="+sp.b);
13
System.out.println(sp);
14
15
}
16
17
public static void swap(intswap s){
18
int tmp=s.a;
19
s.a=s.b;
20
s.b=tmp;
21
System.out.println(s);
22
System.out.println("swap,a="+s.a+" ,b="+s.b);
23
}
Copied!
OUTPUT: [email protected] swap,a=2 ,b=10 交換後,a=2 ,b=10 [email protected]
從結果來看,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紀錄記憶體位址,從結果也可以發現兩者位址是相同的。

參考資料

傳值呼叫
OPENHOME.CC
Java沒有指標? - 淺談參考(Reference)與物件的複製(Object copy) @ 狼窩 :: 痞客邦 ::
狼窩
Last modified 1yr ago