# 函數 SWAP

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

> 參考是什麼？
>
> 參考的概念很像指標，兩者同樣保存「存取某資料」的資訊（像指標中所指向的記憶體位址）；但並不保存「該筆資料」本身。

> 指標是什麼？
>
> 指標就是記憶體「位址（address）」；記憶體位址就好像門牌號碼。那麼 Java 有指標嗎？本章將對這部分淺談，並舉範例。

{% hint style="info" %}
Java 參數傳遞方式只有一種：傳值。

將實際參數值的複製品傳入方法（函數）中，而參數本身不會受到任何影響。
{% endhint %}

### 範例一

```
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<br>

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

###

### 參考資料

{% embed url="<https://openhome.cc/Gossip/Java/PassByValue.html>" %}

{% embed url="<https://myleslittlewolf.pixnet.net/blog/post/23623695-java沒有指標?-－-淺談參考(reference)與物件的複>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://java.4-x.tw/java-07/java-swap.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
