Web | Coding | Blog | SOHO

[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);
		}

結果為:
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);
    }

結果為:
[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紀錄記憶體位址,從結果也可以發現兩者位址是相同的。


另外也可以參考下列文章所描述的文章:
(直接點擊即可前往閱讀)

傳值呼叫

Java沒有指標? - 淺談參考(Reference)與物件的複製(Object copy)


Java 學習日誌 (點此閱讀所有 Java日誌)
有任何問題也歡迎在底下留言,或到fb粉絲專頁發訊息給站長一起討論。


如果您喜歡本站的文章,也歡迎將文章分享轉貼並註明出處;
另外還未按讚粉絲專頁的朋友,也可以動動手點擊追蹤最新的文章唷:

Comments

comments

如果您喜歡本站的文章,也歡迎將文章分享轉貼並註明出處;另外還未按讚粉絲專頁的朋友,也可以動動手點擊追蹤最新的文章唷:


© 2017 4xCode™ | Design:SC 站長

歡迎來到SC站長網站

 

本站文章不再更新,新文章將發表至

4 x ‘s Space 網站

 

謝謝您一直以來的支持,我們新網站見~

 

SC站長網站文章也會將慢慢轉移至新網站,

新網站連結 4-x.tw 點此前往,或點擊上方圖案)