Java 是 Pass By Value 或是 Pass by Reference

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

正確答案是? 反白可見。

C

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。

Scroll to Top