close

import java.awt.Point;

class PassByValue
{
 public static void modifyPoint(Point pt, int j, String str)
 {
  j = 15; // <- ? have to check primitive type.
  
  str = "def";
  /*************************************************************************************
   * 產生了一個 String 型態的 "def" 物件, 並將它的 reference 給 str,
   * 所以替換了 str 原本的 reference
  ************************************************************************************/

  pt.setLocation(5,5);
  /*************************************************************************************
   * 替換了 Point p reference, 但也因為用了"."這個 operator, 它會 dereference,
   * 所以它也改變了本身 object 的 value.
  ***********************************************************************************/

  
  //pt = new Point(5,5); //只修改了 Point pt 的 reference

  System.out.println("During modifyPoint: pt = "+pt+", j = "+j+", str = "+str);
 }

 public static void main(String[] args)
 {
  Point p = new Point(0,0);
  /*************************************************************************************
   * 1. new Point(0,0) <- 在記憶體產生了 Point 物件, 且是 Point 型態, 同時產生了 reference
   * 2. Point p <- 一個名為 p 的空間, 其型態為 Point,
   * 3. "=" 這個 operator  將 Point(0,0) 的 reference 放到了 p 裡面,
   *    所以就可以利用 p 裡的 reference 來找到這個物件.
  *************************************************************************************/

  int i = 10;
  String s = new String("abc");

  System.out.println("Before modifyingPoint: p = "+p+", i = "+i+", s = "+s);
  modifyPoint(p,i,s);
  System.out.println("Before modifyingPoint: p = "+p+", i = "+i+", s = "+s);
 }
}


 

---------- java ----------
Before modifyingPoint: p = java.awt.Point[x=0,y=0], i = 10, s = abc
During modifyPoint: pt = java.awt.Point[x=5,y=5], j = 15, str = def
Before modifyingPoint: p = java.awt.Point[x=5,y=5], i = 10, s = abc
Normal Termination
輸出完成 (耗費 0 秒)。
 
(Kalin 讀後心得)
進入 modifyPoint() 時, 引數傳遞了 object reference 的 copy, 以 by value 的方式傳遞.
當程式離開了 modifyPoint(), 重新回到 main() 後, str 已離開了自己的 scope, 且沒有人指向 "def" 這個  object 了, 所以 str 有機會被回收, 而 s 還是沿用當初的 reference, 指向 "abc" 這個 object. 嘔~靠背! Java沒有指向, ㄟ~ 真難解釋耶. 反正 primitive type 就是傳送真正的 value, object 就是傳送位元值.
 
argument 永遠是傳遞 object reference 的 copy, 也就是複製物件的參考變數的位元值.
PS: 哈! 但是其實不是永遠, 如果是 remote object, 則是傳遞 object 的 copy.
 
一年半前, 看到這個題目, 向吳老師請教, 我還是搞不懂, 困惑了一年多的時間.
現在因為學習 ejb 的因緣際會下, 回頭再看這個問題, 終於有點感覺了.
我真是嫩啊... 希望下一次更有感覺的時間會 < 1.5 year
 
 
 
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Kalin 的頭像
    Kalin

    Kalin的部落格

    Kalin 發表在 痞客邦 留言(0) 人氣()