JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Re:引數以 by value 方式,而非 by reference 方式傳遞? [Re:kalin]
zanta





發文: 78
積分: 4
於 2004-04-05 19:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
01.public static void change (Point p,String s,int i)  {    
02.    s = "bbb";    
03.    i = 2;    
04.    p.setLocation(5,5);    
05.    System.out.println("p : "+p+" , s : "+s+" , i = "+i);   
06.}
07.public static void main(String[] args) {
08.    String s = new String("aaa");    
09.    int i = 1;    
10.    Point p = new Point(0,0);    
11.    System.out.println("p : "+p+" , s : "+s+" , i = "+i);    
12.    change(p,s,i);    
13.    System.out.println("p : "+p+" , s : "+s+" , i = "+i);  
14.}


假設第 01 行的 s 稱為 s1,第 08 行的 s 稱為 s2。

程式從第 07 行 main() 進入,在第 08 行建立了 s2,指向 "aaa" 這個物件,但 scope 只有在 main() 裡面,
當程式執行到 change() 中的時候其實是看不到 s2 的。

程式接著進入 change(),在還沒執行第 02 行時,s1 跟 s2 都是指向 "aaa" 物件 (雖然這時無法存取 s2)。
到了第 02 行對於 s 重新賦值,但由於 String object 有 immutable 不可改變的特性,
因此第 02 行的動作其實是:建立一個新的 String object,叫做 "bbb",且改變 s1 的 reference 到這個新的 object;
這時在 change() 中已經沒有人指向原本 "aaa" 這個 object 了。

當程式離開 change() 重新回到 main() 時,s1 已離開了自己的 scope,且沒有人指向 "bbb" 這個 object,
因此 s1 有機會被回收,且第 13 行顯示的 s 仍為 s2 原本的值。

跟 Point p 的寫法來做比較的話,感覺不只是 Pass by value 的原則要注意,
連程式的寫法,還有 implementation 方式都有可能改變程式執行結果
(如 Duncan 版主所舉的例子,就會造成 p 的顯示結果不同)

這些可能都是我們必須要謹慎處理的地方了...

以上是我的個人看法,若有錯誤還請大家指正,先謝謝囉~


zanta edited on 2004-04-05 20:41
reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
1825 引數以 by value 方式,而非 by reference 方式傳遞? kalin 905 2004-04-02 15:29
1515 Re:引數以 by value 方式,而非 by reference 方式傳遞? Duncan 18 2004-04-02 15:37
1643 Re:引數以 by value 方式,而非 by reference 方式傳遞? kalin 333 2004-04-02 15:47
1498 Re:引數以 by value 方式,而非 by reference 方式傳遞? weaker 591 2004-04-02 16:11
1588 Re:引數以 by value 方式,而非 by reference 方式傳遞? kalin 934 2004-04-05 11:55
1407 Re:引數以 by value 方式,而非 by reference 方式傳遞? Duncan 511 2004-04-05 16:22
1601 Re:引數以 by value 方式,而非 by reference 方式傳遞? zanta 1224 2004-04-05 19:13
1442 Re:引數以 by value 方式,而非 by reference 方式傳遞? kalin 29 2004-04-06 10:10
1390 Re:引數以 by value 方式,而非 by reference 方式傳遞? kalin 227 2005-10-18 10:21
» JWorld@TW »  Java 新手區

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8