<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
    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的按值傳遞,別著急接著往下看。
     
    在理解按值傳遞的概念時,是要區分幾種情況的,論壇里的各位弟兄在講的時候沒有區分這些情況,造成十分混亂。
     
    根據傳遞的參數,分成基本變量傳參和引用變量傳參。
     
    先來看基本變量傳參,也就是上面的例子。看下圖:實箭頭代表賦的初值,虛箭頭代表改變后的值。
     
     
    大家可以看到,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了。以上幾種情況中,只有這種情況才能對實參進行修改。看下面的圖:
     
     
    無論是main()還是link()中的i,一直都是指向同一個實例,在link()中對此實例的任何修改,都會影響到實參i的值。
     
    希望大家在傳參的時候要分清情況,區別對待。
     

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

    posted on 2007-04-06 13:10 蘆葦 閱讀(311) 評論(0)  編輯  收藏 所屬分類: JAVA
    主站蜘蛛池模板: 欧洲精品码一区二区三区免费看| 亚洲三级在线播放| 国产成人1024精品免费| 免费一级毛片女人图片| 免费无码专区毛片高潮喷水 | 亚洲日韩乱码中文无码蜜桃| 中国一级全黄的免费观看| 久久亚洲国产精品一区二区| 三级黄色免费观看| 亚洲人成网站在线播放影院在线| 免费A级毛片无码视频| 亚洲日本视频在线观看| 曰曰鲁夜夜免费播放视频| 亚洲首页国产精品丝袜| 免费网站看v片在线香蕉| 亚洲aⅴ天堂av天堂无码麻豆| 免费99热在线观看| 中文字幕免费观看全部电影| 亚洲国产国产综合一区首页| 91禁漫免费进入| 亚洲中文字幕一区精品自拍| 免费国产成人午夜私人影视 | 99麻豆久久久国产精品免费| 亚洲av色福利天堂| 久久受www免费人成_看片中文| 亚洲色成人四虎在线观看| 亚洲AV无码专区日韩| 日韩精品无码免费专区午夜 | 亚洲成AV人片一区二区密柚| 69视频在线是免费观看| 亚洲国产精品成人AV在线| 国产福利电影一区二区三区,亚洲国模精品一区 | 本免费AV无码专区一区| 久久综合亚洲色一区二区三区| 免费做爰猛烈吃奶摸视频在线观看 | 香蕉成人免费看片视频app下载| 亚洲性猛交xx乱| 四虎影在线永久免费观看| a级特黄毛片免费观看| 亚洲av无码专区在线| 亚洲精品无码99在线观看|