Pass By Value
Pass By Value 就像是把網頁的內容列印出來,你可以看到內容,也可以在上面畫線、加字,但修改的的內容,不會受到影響我在看的網頁。
Pass By Value 的概念像是把內容複製一份再傳給別人。
Pass By Reference
Pass By Reference 的概念就像是我給你一個網址 , 你連進去看網頁的內容,如果你把內容改了,我看到得東西也會一起改變,反過來說,如果我把內容改了,你也會看到我修改後的內容。
Java 是 Pass By Value 的嗎 ?
可以先看一些範例,是不是能夠回答出正確的答案
範例一
private static void runCase1() {
int j = 10;
Point point = new Point(4, 4);
logger.info("修改前的 Point {}, 修改前的 j ={}", point, j);
setPointLocation(point, j); // 呼叫下面的 function
logger.info("修改後的 Point {}, 修改後的 j ={}", point, j);
}
private static void setPointLocation(Point pointInst, int otherJ) {
// 把 Point 的位置改成 5, 5
pointInst.setLocation(5, 5);
// 把 j 的值改為 20
otherJ = 20;
logger.info("在修改的過程中 Point = {}, j ={}", pointInst, otherJ);
}
- (A) 修改後的 Point 為 5,5 , j 為 20
- (B) 修改後的 Point 為 5,5 , j 為 10
- (C) 修改後的 Point 為 4,4 , j 為 10
正確答案是? 反白可見。
B
可以發現物件的運作方式和原始數值的運作方式不太一樣,分別說明如下:
Reference type (物件) 的運作狀況
Point 這種 Object,把他歸類為 reference type
Point point = new Point(4, 4);
宣告一個變數 point 指向 Point 實體

setPointLocation(point, j);
準備開始把參數複製後傳給方法

所以當 pointInst 呼叫 setLocation
的時候等同 point 呼叫 setLocation
,就像兩支遙控器對著同一台電視轉台一樣。
Primitive type (原始型別) 的運作狀況
同樣的看一下 int 變數 j 的狀況,一樣有個複製的動作。

竟然是複製過來的,所以 otherJ 在改變值的過程中,就不會影響原來的 j

範例二
private static void runCase2() {
int j = 10;
Point point = new Point(4, 4);
logger.info("修改前的 Point {}, 修改前的 j ={}", point, j);
setPointWithAssign(point, j);
logger.info("修改後的 Point {}, 修改後的 j ={}", point, j);
}
private static void setPointWithAssign(Point pointInst, int j) {
pointInst = new Point(6, 6);
j = 20;
logger.info("在修改的過程中 Point = {}, j ={}", pointInst, otherJ);
}
- (A) 修改後的 Point 為 6,6 , j 為 20
- (B) 修改後的 Point 為 6,6 , j 為 10
- (C) 修改後的 Point 為 4,4 , j 為 10
正確答案是? 反白可見。
Reference type (物件) 的運作狀況
同樣的 Point Point point = new Point(4, 4);
宣告一個變數 point 指向 Point 實體

setPointWithAssign(point, j);
準備開始把參數複製後傳給方法

同樣的,既然 pointInst 是複製來的,指向的實體也會是同一個實體

但這時候,pointInst = new Point(6, 6);
,pointInst 直接產生一個新的 Point 實體

所以竟然已經指向新的 Point 實體,所有的改動和原來的 point 就完全不影響了,就好比兩個遙控器,指的是不同的變數,轉台不互相影響。
Primitive type 的運作方法
和範例一的運作一模一樣。
Java 是 Pass By Value 的
只要在參數傳遞的過程,有類似複製一份的概念,可以視為是 Pass By Value ,在 Java 的參數傳遞過程中,無論是 reference type 或著 primitive type,都會複製一份,傳到方法中。
而容易混淆的部分是 reference type 複製的是一個 reference 的地址,primitive type 複製的是一個 value。