空間站

          北極心空

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

          公告

          本博客主要是在本人收集網上一些精彩技術文章,有時可能因疏忽轉載的時候沒有說明轉載出處和作者,如果您認為哪篇文章侵犯了你的版權,請通知本人: EMAIL:luwei-80@163.com 歡迎您光臨本博客!

          常用鏈接

          留言簿(15)

          我參與的團隊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          java中的按值傳遞圖例講解
          這幾天論壇上有人在討論java中按值傳遞的問題,說來說去,都不是十分完整和準確。
          我想通過圖片和例子更加有助于理解這個概念。
           
          先看下面的例子:
          public class TestSample{
                 public static void link(int i){
                        i=2;
                 }
                 public static void main(String[] args){
                         int i = 1;
                         link(i);
                         System.out.println(i);
                 }
          }
           
          在主函數中定義基本整型變量i,并賦予值1。把i做為參數傳給方法link,在link中改變i的值為2。
          但是在主函數中輸出i時,i的值仍然為1。為什么會這樣,這就是java的按值傳遞,別著急接著往下看。
           
          在理解按值傳遞的概念時,是要區分幾種情況的,論壇里的各位弟兄在講的時候沒有區分這些情況,造成十分混亂。
           
          根據傳遞的參數,分成基本變量傳參和引用變量傳參。
           
          先來看基本變量傳參,也就是上面的例子??聪聢D:實箭頭代表賦的初值,虛箭頭代表改變后的值。
           
           
          大家可以看到,main()和link()中的i是兩個不同的變量,他們的相同點就是把值也就是1傳了過來。
          如果把link()中的i的值變成2,main()中的i的值是不會跟著變的。
          再有就是link()中的i是局部變量,他的生命周期僅是在方法link中,運行完link后,這個變量i就失效,會被回收器回收。
           
          再來看引用變量傳參,這里面還要分成兩種情況,一種是給形參賦予一個新的變量,看下面的例子,
          public class TestSample{
                 public static void link(Car i){
                        i=new Track();
                 }
                 public static void main(String[] args){
                         Car i = new Car();
                         link(i);
                         System.out.println(i);
                 }
          }
           
          main()方法定義一個car型變量i,傳到link()方法中,然后改變了i的值,返回main()后,輸出i的值,他仍然是一個car,不會改變。
          看下面的圖:
           
           
          方法link()中的變量i,一開始是引向car類型的一個實例的,后來使用i=new Track()語句,把i引向了另一個track型的對象實例。這個操作絲毫不會影響到main()方法中的i。
          注意:并不只是使用new這個關鍵字才能使變量改變引用。
          string是一個特例,比如,string s="hello";
          s=s+" world";
          新的s已經改變了他的引用對象,就象s=new String(s+" world");一樣。
           
          再看另一種情況,形參并不會改變引用對象,而是改變原來引用對象的值。看例子:
          public class TestSample{
                 public static void link(Car i){
                        i.addABS();
                 }
                 public static void main(String[] args){
                         Car i = new Car();
                         link(i);
                         System.out.println(i);
                 }
          }
          main()方法定義一個car型變量i,傳到link()方法中,然后對i進行addABS()方法的操作。返回到main(),再輸出i,發現i已經變成了一個加裝了ABS的car了。以上幾種情況中,只有這種情況才能對實參進行修改??聪旅娴膱D:
           
           
          無論是main()還是link()中的i,一直都是指向同一個實例,在link()中對此實例的任何修改,都會影響到實參i的值。
           
          希望大家在傳參的時候要分清情況,區別對待。
           

          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1485349

          posted on 2007-04-06 13:10 蘆葦 閱讀(318) 評論(0)  編輯  收藏 所屬分類: JAVA
          主站蜘蛛池模板: 方城县| 西乡县| 聊城市| 盘山县| 衡水市| 洞口县| 长治市| 四会市| 申扎县| 喀喇沁旗| 太谷县| 堆龙德庆县| 岑溪市| 东乡县| 金川县| 贵定县| 丹凤县| 丰原市| 闻喜县| 伊宁县| 竹北市| 城固县| 宁乡县| 霍邱县| 江都市| 互助| 金川县| 小金县| 满洲里市| 固原市| 涞水县| 东莞市| 怀来县| 公安县| 共和县| 珠海市| 永善县| 手游| 乌审旗| 象山县| 鹤山市|